互聯(lián)網(wǎng)中如何給策略增加多圖表支持

這篇文章將為大家詳細(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)行:
互聯(lián)網(wǎng)中如何給策略增加多圖表支持

這樣就可以讓策略多圖表顯示了。

關(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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司