最近和朋友聊策略的時候,瞭解到有很多使用my語言編寫策略苦於靈活的問題。不少狀況下須要使用非系統提供的標準K線週期,例如提出最多的就是需求使用4小時K線。這個問題已經在一篇文章中得以解決,有興趣的能夠先看下:連接。不過在my語言策略中這個問題因爲my語言高度的封裝特性,沒法靈活的自行處理數據。這個時候就須要把策略思路移植爲其它語言。javascript
對於趨勢策略移植來講是很是簡單的,咱們可使用一段範例代碼,填充驅動策略的數據計算部分代碼,填充交易信號觸發條件便可。java
-
可複用的範例代碼:函數
以用於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) } }
-
舉例:雙均線策略的移植this
麥語言回測:
url
麥語言策略代碼:.net
MA5^^MA(C,5); MA15^^MA(C,15); CROSSUP(MA5,MA15),BPK; CROSSDOWN(MA5,MA15),SPK;
-
移植爲JavaScript策略3d
首先給可複用的範例代碼填充上行情獲取、指標計算部分:code
// 驅動策略的行情處理部分 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
指標數據同理。而後就可使用這些指標數據去判斷金叉死叉了,如圖:
只要造成這樣的狀態,即爲肯定的金叉死叉。blog那麼判斷信號的部分就能夠寫成:
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了,能夠回測試下:
-
JavaScript策略的回測
回測配置:
回測結果:
-
my語言的回測
能夠看到回測結果基本同樣,這樣若是但願對於策略繼續增長交互功能、增長數據處理(例如K線合成)、增長自定義的圖表畫圖顯示就能夠實現了。
-
有興趣的同窗動手試試吧