91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何移植一個my語言策略

發布時間:2022-03-25 16:51:59 來源:億速云 閱讀:176 作者:iii 欄目:互聯網科技

本篇內容主要講解“如何移植一個my語言策略”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何移植一個my語言策略”吧!

對于趨勢策略移植來說是非常簡單的,我們可以使用一段范例代碼,填充驅動策略的數據計算部分代碼,填充交易信號觸發條件即可。

  • 可復用的范例代碼:

    以用于OKEX期貨的策略為例。

    // 全局變量
    var IDLE = 0
    var LONG = 1
    var SHORT = 2
    var OPENLONG = 3
    var OPENSHORT = 4
    var COVERLONG = 5
    var COVERSHORT = 6  
    
    var BREAK = 9
    var SHOCK = 10  
    
    var _State = IDLE
    var Amount = 0                 // 記錄持倉數量
    var TradeInterval = 500        // 輪詢間隔
    var PriceTick = 1              // 價格一跳
    var Symbol = "this_week"  
    
    function OnTick(){
        // 驅動策略的行情處理部分
        // 待填充...
         
        // 交易信號觸發處理部分
        // 待填充...  
    
        // 執行交易邏輯
        var pos = null
        var price = null
        var currBar = records[records.length - 1]
        if(_State == OPENLONG){
            pos = GetPosition(PD_LONG)
            // 判斷是不是 滿足狀態,如果滿足 修改狀態
            if(pos[1] >= Amount){
                _State = LONG
                Amount = pos[1]   // 更新實際量
                return
            }
            price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
            Trade(OPENLONG, price, Amount - pos[1], pos, PriceTick)                // (Type, Price, Amount, CurrPos, PriceTick)
        }  
    
        if(_State == OPENSHORT){
            pos = GetPosition(PD_SHORT)
            if(pos[1] >= Amount){
                _State = SHORT
                Amount = pos[1]   // 更新實際量
                return
            }
            price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
            Trade(OPENSHORT, price, Amount - pos[1], pos, PriceTick)
        }  
    
        if(_State == COVERLONG){
            pos = GetPosition(PD_LONG)
            if(pos[1] == 0){
                _State = IDLE
                return
            }
            price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
            Trade(COVERLONG, price, pos[1], pos, PriceTick)
        }
        
        if(_State == COVERSHORT){
            pos = GetPosition(PD_SHORT)
            if(pos[1] == 0){
                _State = IDLE
                return
            }
            price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
            Trade(COVERSHORT, price, pos[1], pos, PriceTick)
        }
    }  
    
    // 交易邏輯部分
    function GetPosition(posType) {
        var positions = _C(exchange.GetPosition)
        var count = 0
        for(var j = 0; j < positions.length; j++){
            if(positions[j].ContractType == Symbol){
                count++
            }
        }  
    
        if(count > 1){
            throw "positions error:" + JSON.stringify(positions)
        }  
    
        for (var i = 0; i < positions.length; i++) {
            if (positions[i].ContractType == Symbol && positions[i].Type === posType) {
                return [positions[i].Price, positions[i].Amount];
            }
        }
        Sleep(TradeInterval);
        return [0, 0];
    }  
    
    function CancelPendingOrders() {
        while (true) {
            var orders = _C(exchange.GetOrders)
            for (var i = 0; i < orders.length; i++) {
                exchange.CancelOrder(orders[i].Id);
                Sleep(TradeInterval);
            }
            if (orders.length === 0) {
                break;
            }
        }
    }  
    
    function Trade(Type, Price, Amount, CurrPos, OnePriceTick){    // 處理交易
        if(Type == OPENLONG || Type == OPENSHORT){                 // 處理開倉
            exchange.SetDirection(Type == OPENLONG ? "buy" : "sell")
            var pfnOpen = Type == OPENLONG ? exchange.Buy : exchange.Sell
            var idOpen = pfnOpen(Price, Amount, CurrPos, OnePriceTick, Type)
            Sleep(TradeInterval)
            if(idOpen) {
                exchange.CancelOrder(idOpen)
            } else {
                CancelPendingOrders()
            }
        } else if(Type == COVERLONG || Type == COVERSHORT){        // 處理平倉
            exchange.SetDirection(Type == COVERLONG ? "closebuy" : "closesell")
            var pfnCover = Type == COVERLONG ? exchange.Sell : exchange.Buy
            var idCover = pfnCover(Price, Amount, CurrPos, OnePriceTick, Type)
            Sleep(TradeInterval)
            if(idCover){
                exchange.CancelOrder(idCover)
            } else {
                CancelPendingOrders()
            }
        } else {
            throw "Type error:" + Type
        }
    }  
    
    function main() { 
        // 設置合約
        exchange.SetContractType(Symbol)  
    
        while(1){
            OnTick()
            Sleep(1000)
        }
    }


  • 舉例:雙均線策略的移植

    麥語言回測:
    如何移植一個my語言策略

    麥語言策略代碼:

    MA5^^MA(C,5);
    MA15^^MA(C,15);
    CROSSUP(MA5,MA15),BPK;
    CROSSDOWN(MA5,MA15),SPK;


  • 移植為JavaScript策略

    首先給可復用的范例代碼填充上行情獲取、指標計算部分:

    // 驅動策略的行情處理部分
    var records = _C(exchange.GetRecords)  
    
    if (records.length < 15) {
        return 
    }  
    
    var ma5 = TA.MA(records, 5)
    var ma15 = TA.MA(records, 15)
    var ma5_pre = ma5[ma5.length - 3]
    var ma15_pre = ma15[ma15.length - 3]
    var ma5_curr = ma5[ma5.length - 2]
    var ma15_curr = ma15[ma15.length - 2]


    可以看到,雙均線策略非常簡單,只是首先獲取K線數據records,然后使用TA函數庫的均線函數TA.MA計算出5日均線、15日均線(回測界面上可以看到,K線周期設置的是日K線,所以TA.MA(records, 5)計算出的就是5日均線,TA.MA(records, 15)15日均線)。
    然后獲取ma5指標數據的倒數第二個點ma5_curr(指標值),倒數第三個點ma5_pre(指標值),ma15指標數據同理。然后就可以使用這些指標數據去判斷金叉死叉了,如圖:
    如何移植一個my語言策略
    只要形成這樣的狀態,即為確定的金叉死叉。

    那么判斷信號的部分就可以寫成:

    if(_State == IDLE && ma5_pre < ma15_pre && ma5_curr > ma15_curr){     
        _State = OPENLONG
        Amount = 1
    }  
    
    if(_State == IDLE && ma5_pre > ma15_pre && ma5_curr < ma15_curr){     
        _State = OPENSHORT
        Amount = 1
    }  
    
    if(_State == LONG && ma5_pre > ma15_pre && ma5_curr < ma15_curr){     
        _State = COVERLONG
        Amount = 1
    }  
    
    if(_State == SHORT && ma5_pre < ma15_pre && ma5_curr > ma15_curr){     
        _State = COVERSHORT
        Amount = 1
    }


    這樣就移植OK了,可以回測試下:

    可以看到回測結果基本一樣,這樣如果希望對于策略繼續增加交互功能、增加數據處理(例如K線合成)、增加自定義的圖表畫圖顯示就可以實現了。

    • JavaScript策略的回測
      回測配置:
      如何移植一個my語言策略

      回測結果:
      如何移植一個my語言策略

    • my語言的回測
      如何移植一個my語言策略

到此,相信大家對“如何移植一個my語言策略”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邢台市| 溧阳市| 闵行区| 申扎县| 隆昌县| 通化县| 太白县| 衡阳市| 陵川县| 三穗县| 杭锦旗| 广汉市| 肃宁县| 安丘市| 新民市| 崇仁县| 德保县| 区。| 锦屏县| 永靖县| 海淀区| 绥中县| 九江县| 唐河县| 永福县| 潢川县| 全椒县| 娱乐| 吴旗县| 栖霞市| 墨江| 红河县| 东阳市| 阿巴嘎旗| 宜君县| 梁山县| 夏河县| 龙游县| 洱源县| 沽源县| 延吉市|