這篇文章將為大家詳細(xì)講解有關(guān)互聯(lián)網(wǎng)中如何給策略增加多圖表支持,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站主營(yíng)長(zhǎng)泰網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶App定制開(kāi)發(fā),長(zhǎng)泰h5小程序開(kāi)發(fā)搭建,長(zhǎng)泰網(wǎng)站營(yíng)銷推廣歡迎長(zhǎng)泰等地區(qū)企業(yè)咨詢
特別是在編寫趨勢(shì)策略時(shí),有時(shí)候被各種指標(biāo)的觸發(fā)條件弄的一頭霧水,這個(gè)時(shí)候就迫切需要讓數(shù)據(jù)可視化,方便分析查看。在給策略添加單一的圖表時(shí),可以直接使用「畫線類庫(kù)」模板畫圖。不過(guò)有時(shí)候需要多圖表,并且是不同K線周期的,甚至指標(biāo)要單獨(dú)使用Y坐標(biāo)軸的情況。這樣就需要單獨(dú)實(shí)現(xiàn)畫圖代碼了。
以下給出一個(gè)范例,可以作為參考學(xué)習(xí),我會(huì)在范例代碼上逐行注釋,當(dāng)你讀完代碼,會(huì)對(duì)給策略增加圖表支持有一個(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è)空對(duì)象,用于以下代碼中添加方法,最后返回這個(gè)對(duì)象,即構(gòu)造的繪圖對(duì)象。 obj.e = e // 參數(shù)傳來(lái)的交易所對(duì)象引用,賦值給obj對(duì)象的一個(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í)間戳,用于對(duì)比 obj.GetAllRecords = function () { // 繪圖對(duì)象的一個(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í)行繪圖對(duì)象的功能 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] // 圖表對(duì)象中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沒(méi)有更新時(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í),說(shuō)明K線有新的bar生成,這個(gè)時(shí)候要添加新bar,并且添加新指標(biāo)數(shù)據(jù)點(diǎn)。 obj.runTime.arrPreBarTime[i] = arr[i][j].Time // 更新最后一bar時(shí)間戳的記錄,用于接下來(lái)的對(duì)比,接下來(lái)的時(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)然本策略什么也不做,沒(méi)有任何交易,只是畫圖 var chart = Chart([chart0, chart1, chart2]) // chart0,chart1,chart2 是預(yù)先聲明好的圖表配置對(duì)象,調(diào)用Chart函數(shù),就是把圖表配置載入,返回一個(gè)圖表控制對(duì)象 chart chart.reset() // 調(diào)用圖表控制對(duì)象chart的reset方法,重置圖表。 exchange.SetContractType("quarter") // 回測(cè)配置 選擇的是OKEX期貨,所以這里要設(shè)置一下合約,合約設(shè)置為季度(quarter) var plotter = CreatePlotter(exchange, chart) // 調(diào)用 CreatePlotter 函數(shù)生成繪圖對(duì)象 plotter while (true) { plotter.Run() // 執(zhí)行繪圖對(duì)象 plotter 成員函數(shù) Run 繪圖 Sleep(1000) // 繪圖對(duì)象 plotter 是負(fù)責(zé)“如何畫”,圖表控制對(duì)象chart是負(fù)責(zé)具體畫圖,這兩者中前者是我們代碼實(shí)現(xiàn)的,后者是系統(tǒng)底層API函數(shù)返回的控制對(duì)象。 } }
接下來(lái)就可以看CreatePlotter
函數(shù)構(gòu)造繪圖對(duì)象時(shí),都實(shí)現(xiàn)了怎樣的畫圖功能,可以看到在代碼var plotter = CreatePlotter(exchange, chart)
中,構(gòu)造繪圖對(duì)象plotter時(shí),傳入了exchange , chart 。前者是用來(lái)獲取K線數(shù)據(jù)(通過(guò)調(diào)用exchange.GetRecords),后者是用來(lái)操作圖表,給圖表上添加數(shù)據(jù)。
最主要的繪圖部分就是Plot
函數(shù),注釋已經(jīng)寫在代碼里面。
回測(cè)運(yùn)行:
這樣就可以讓策略多圖表顯示了。
關(guān)于“互聯(lián)網(wǎng)中如何給策略增加多圖表支持”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
分享名稱:互聯(lián)網(wǎng)中如何給策略增加多圖表支持
URL網(wǎng)址:http://bm7419.com/article36/goejpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、域名注冊(cè)、面包屑導(dǎo)航、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)