這篇文章將為大家詳細(xì)講解有關(guān)互聯(lián)網(wǎng)中如何給策略增加多圖表支持,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站主營長泰網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),長泰h5小程序開發(fā)搭建,長泰網(wǎng)站營銷推廣歡迎長泰等地區(qū)企業(yè)咨詢
特別是在編寫趨勢策略時(shí),有時(shí)候被各種指標(biāo)的觸發(fā)條件弄的一頭霧水,這個(gè)時(shí)候就迫切需要讓數(shù)據(jù)可視化,方便分析查看。在給策略添加單一的圖表時(shí),可以直接使用「畫線類庫」模板畫圖。不過有時(shí)候需要多圖表,并且是不同K線周期的,甚至指標(biāo)要單獨(dú)使用Y坐標(biāo)軸的情況。這樣就需要單獨(dú)實(shí)現(xiàn)畫圖代碼了。
以下給出一個(gè)范例,可以作為參考學(xué)習(xí),我會(huì)在范例代碼上逐行注釋,當(dāng)你讀完代碼,會(huì)對給策略增加圖表支持有一個(gè)新的理解。
/*backtest
start: 2019-07-01 00:00:00
end: 2019-08-24 00:00:00
period: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
args: [["IsSynthesisDayKL",true]]
*/
var chart0 = {
__isStock: true,
// /*
extension: {
layout: 'single',
height: 300,
},
// */
title : { text : '日K線圖'},
xAxis: { type: 'datetime'},
series : [
{
type: 'candlestick',
name: 'r',
id: 'r',
data: []
}
]
}
var chart1 = {
__isStock: true,
// /*
extension: {
layout: 'single',
height: 300,
},
// */
title : { text : 'EMA'},
xAxis: { type: 'datetime'},
series : [
{
type: 'candlestick',
name: 'r1',
id: 'r1',
data: []
}, {
type: 'line',
name: 'chart1_EMA1',
data: [],
}, {
type: 'line',
name: 'chart1_EMA2',
data: []
}
]
}
var chart2 = {
__isStock: true,
// /*
extension: {
layout: 'single',
height: 300,
},
// */
title : { text : 'MACD'},
xAxis: { type: 'datetime'},
yAxis : [
{
title: {text: '價(jià)格'},
opposite: false
}, {
title:{text: "指標(biāo)軸"},
opposite: true,
}
],
series : [
{
type: 'candlestick',
name: 'r2',
id: 'r2',
data: []
}, {
type: 'line',
yAxis: 1,
name: 'dif',
data: []
}, {
type: 'line',
yAxis: 1,
name: 'dea',
data: []
}
]
}
function CreatePlotter (e, chart) {
var obj = {} // 聲明一個(gè)空對象,用于以下代碼中添加方法,最后返回這個(gè)對象,即構(gòu)造的繪圖對象。
obj.e = e // 參數(shù)傳來的交易所對象引用,賦值給obj對象的一個(gè)屬性
obj.params = {} // 構(gòu)造參數(shù)
obj.params.EMA_param1 = 5 // 我們預(yù)設(shè)一些圖表上指標(biāo)的參數(shù),用于指標(biāo)計(jì)算時(shí)使用 ,比如一條EMA指標(biāo)線參數(shù)
obj.params.EMA_param2 = 20 // 第二條EMA指標(biāo)線參數(shù),通常參數(shù)小的叫塊線,參數(shù)大的叫慢線
obj.params.MACD_fast = 12 // MACD 參數(shù)
obj.params.MACD_slow = 26 // MACD 參數(shù)
obj.params.MACD_sig = 9 // MACD 參數(shù)
obj.runTime = {} // 用于儲(chǔ)存運(yùn)行時(shí)的一些數(shù)據(jù)
obj.runTime.arrPreBarTime = [0, 0, 0] // 儲(chǔ)存每個(gè)K線數(shù)據(jù)的前一個(gè)bar 的時(shí)間戳,用于對比
obj.GetAllRecords = function () { // 繪圖對象的一個(gè)方法,用于獲取K線數(shù)據(jù),我們這個(gè)例子是用了三個(gè)圖表同時(shí)顯示,所以,這個(gè)函數(shù)同時(shí)獲取三種不同周期的K線數(shù)據(jù)
obj.r = _C(obj.e.GetRecords, PERIOD_H1) // 第一個(gè)圖表的K線數(shù)據(jù),是1小時(shí)級(jí)別的K線數(shù)據(jù)
Sleep(1000)
obj.r1 = _C(obj.e.GetRecords, PERIOD_M15) // 第二個(gè)圖表的K線數(shù)據(jù),是15分鐘級(jí)別的K線數(shù)據(jù)
Sleep(1000)
obj.r2 = _C(obj.e.GetRecords, PERIOD_D1) // 第三個(gè)圖表的K線數(shù)據(jù),是日K線數(shù)據(jù)
}
obj.Run = function () { // 執(zhí)行繪圖對象的功能
obj.Plot() // 執(zhí)行具體的繪圖代碼
}
obj.CalcMACD = function (r, fast, slow, sig) { // MACD 指標(biāo)計(jì)算函數(shù),返回MACD指標(biāo)數(shù)據(jù)
if (r.length <= Math.max(fast, slow, sig)) {
return false
}
return TA.MACD(r, fast, slow, sig)
}
obj.Plot = function () { // 重點(diǎn)部分,具體的繪圖代碼。
obj.GetAllRecords() // 每次繪圖前,首先更新所有的K線數(shù)據(jù)
var arr = [obj.r, obj.r1, obj.r2] // 把所有K線數(shù)據(jù)放在一個(gè)數(shù)組中,遍歷。
var arrKIndex = [0, 1, 4] // 圖表對象中K線數(shù)據(jù)系列的索引
for (var i = 0; i < arr.length; i++) { // 遍歷操作
for (var j = 0; j < arr[i].length; j++) {
if (arr[i][j].Time == obj.runTime.arrPreBarTime[i]) { // 當(dāng)K線數(shù)據(jù)最后一bar沒有更新時(shí),我們只更新數(shù)據(jù),不添加,可以注意看 chart.add 函數(shù)調(diào)用時(shí),最后一個(gè)參數(shù)使用了 -1 ,意思就是更新數(shù)據(jù),不添加。
chart.add(arrKIndex[i], [arr[i][j].Time, arr[i][j].Open, arr[i][j].High, arr[i][j].Low, arr[i][j].Close], -1)
if (i == 1) { // 更新第二個(gè)圖表中的 EMA指標(biāo)數(shù)據(jù)
var nowR = arr[i].slice(0, j + 1)
var ema1 = TA.EMA(nowR, obj.params.EMA_param1)
var ema2 = TA.EMA(nowR, obj.params.EMA_param2)
if (obj.r2.length <= obj.params.EMA_param1 || obj.r2.length <= obj.params.EMA_param2 || isNaN(ema1[j]) || isNaN(ema2[j])) {
continue
}
chart.add(2, [arr[i][j].Time, ema1[ema1.length - 1]], -1)
chart.add(3, [arr[i][j].Time, ema2[ema2.length - 1]], -1)
} else if (i == 2) { // 更新第三個(gè)圖表中的 MACD 指標(biāo)數(shù)據(jù)
var nowR = arr[i].slice(0, j + 1)
var macd = obj.CalcMACD(nowR, obj.params.MACD_fast, obj.params.MACD_slow, obj.params.MACD_sig)
if (!macd) {
continue
}
var dif = macd[0]
var dea = macd[1]
chart.add(5, [arr[i][j].Time, dif[dif.length - 1]], -1)
chart.add(6, [arr[i][j].Time, dea[dea.length - 1]], -1)
}
} else if (arr[i][j].Time > obj.runTime.arrPreBarTime[i]) { // 當(dāng)前K線數(shù)據(jù)最后一bar比之前記錄的最后bar時(shí)間戳大時(shí),說明K線有新的bar生成,這個(gè)時(shí)候要添加新bar,并且添加新指標(biāo)數(shù)據(jù)點(diǎn)。
obj.runTime.arrPreBarTime[i] = arr[i][j].Time // 更新最后一bar時(shí)間戳的記錄,用于接下來的對比,接下來的時(shí)間戳又一樣了,就不會(huì)導(dǎo)致再添加數(shù)據(jù),除非有新bar再產(chǎn)生。
chart.add(arrKIndex[i], [arr[i][j].Time, arr[i][j].Open, arr[i][j].High, arr[i][j].Low, arr[i][j].Close])
if (i == 1) {
var nowR = arr[i].slice(0, j + 1)
var ema1 = TA.EMA(nowR, obj.params.EMA_param1)
var ema2 = TA.EMA(nowR, obj.params.EMA_param2)
if (nowR.length <= obj.params.EMA_param1 || nowR.length <= obj.params.EMA_param2 || isNaN(ema1[ema1.length - 1]) || isNaN(ema2[ema2.length - 1])) {
continue
}
chart.add(2, [arr[i][j].Time, ema1[ema1.length - 1]])
chart.add(3, [arr[i][j].Time, ema2[ema2.length - 1]])
} else if (i == 2) {
var nowR = arr[i].slice(0, j + 1)
var macd = obj.CalcMACD(nowR, obj.params.MACD_fast, obj.params.MACD_slow, obj.params.MACD_sig)
if (!macd) {
continue
}
var dif = macd[0]
var dea = macd[1]
chart.add(5, [arr[i][j].Time, dif[dif.length - 1]])
chart.add(6, [arr[i][j].Time, dea[dea.length - 1]])
}
}
}
}
}
obj.Plot()
return obj
}
function main () {
var chart = Chart([chart0, chart1, chart2])
chart.reset()
exchange.SetContractType("quarter")
var plotter = CreatePlotter(exchange, chart)
while (true) {
plotter.Run()
Sleep(1000)
}
}我們首先看main函數(shù):
function main () { // 策略入口函數(shù),當(dāng)然本策略什么也不做,沒有任何交易,只是畫圖
var chart = Chart([chart0, chart1, chart2]) // chart0,chart1,chart2 是預(yù)先聲明好的圖表配置對象,調(diào)用Chart函數(shù),就是把圖表配置載入,返回一個(gè)圖表控制對象 chart
chart.reset() // 調(diào)用圖表控制對象chart的reset方法,重置圖表。
exchange.SetContractType("quarter") // 回測配置 選擇的是OKEX期貨,所以這里要設(shè)置一下合約,合約設(shè)置為季度(quarter)
var plotter = CreatePlotter(exchange, chart) // 調(diào)用 CreatePlotter 函數(shù)生成繪圖對象 plotter
while (true) {
plotter.Run() // 執(zhí)行繪圖對象 plotter 成員函數(shù) Run 繪圖
Sleep(1000) // 繪圖對象 plotter 是負(fù)責(zé)“如何畫”,圖表控制對象chart是負(fù)責(zé)具體畫圖,這兩者中前者是我們代碼實(shí)現(xiàn)的,后者是系統(tǒng)底層API函數(shù)返回的控制對象。
}
}接下來就可以看CreatePlotter函數(shù)構(gòu)造繪圖對象時(shí),都實(shí)現(xiàn)了怎樣的畫圖功能,可以看到在代碼var plotter = CreatePlotter(exchange, chart)中,構(gòu)造繪圖對象plotter時(shí),傳入了exchange , chart 。前者是用來獲取K線數(shù)據(jù)(通過調(diào)用exchange.GetRecords),后者是用來操作圖表,給圖表上添加數(shù)據(jù)。
最主要的繪圖部分就是Plot函數(shù),注釋已經(jīng)寫在代碼里面。
回測運(yùn)行:
這樣就可以讓策略多圖表顯示了。
關(guān)于“互聯(lián)網(wǎng)中如何給策略增加多圖表支持”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
分享名稱:互聯(lián)網(wǎng)中如何給策略增加多圖表支持
URL網(wǎng)址:http://chinadenli.net/article36/goejpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、域名注冊、面包屑導(dǎo)航、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)