Type/to search
8
Follow
1364
Followers
आपको सिखाता है कि कैसे कदम दर कदम रणनीतियाँ लिखें - मेरी भाषा रणनीति को प्रत्यारोपित करें
Original
Created 2019-10-21 14:59:12  Updated 2024-12-17 20:37:18
 1
 2971

img

आपको सिखाता है कि कैसे कदम दर कदम रणनीतियाँ लिखें - मेरी भाषा रणनीति को प्रत्यारोपित करें

हाल ही में जब मैं अपने मित्रों के साथ रणनीतियों के बारे में बात कर रहा था, तो मुझे पता चला कि कई लोग जो रणनीति लिखने के लिए मेरी भाषा का उपयोग करते हैं, वे लचीलेपन की समस्या से ग्रस्त हैं। कई मामलों में, मानक K-लाइन अवधि का उपयोग करना आवश्यक है जो सिस्टम द्वारा प्रदान नहीं की जाती है। उदाहरण के लिए, सबसे अधिक अनुरोधित आवश्यकता 4-घंटे की K-लाइन का उपयोग करना है। इस समस्या का समाधान एक लेख में किया गया है। यदि आप रुचि रखते हैं, तो आप पहले इसे देख सकते हैं:जोड़ना. हालाँकि, मेरी भाषा रणनीति में, मेरी भाषा की अत्यधिक संपुटित प्रकृति के कारण, यह समस्या अपने आप लचीले ढंग से डेटा को संसाधित नहीं कर सकती है। इस समय रणनीतिक सोच को अन्य भाषाओं में प्रत्यारोपित करना आवश्यक है।

ट्रेंड रणनीतियों को ट्रांसप्लांट करना बहुत सरल है। हम ड्राइविंग रणनीति के डेटा गणना भाग को भरने और ट्रेडिंग सिग्नल ट्रिगर स्थितियों को भरने के लिए एक नमूना कोड का उपयोग कर सकते हैं।

पुन: प्रयोज्य नमूना कोड:

उदाहरण के तौर पर OKEX वायदा के लिए प्रयुक्त रणनीति को लें।

javascript
// 全局变量 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) } }

उदाहरण: डबल मूविंग एवरेज रणनीति का प्रत्यारोपण

माई भाषा बैकटेस्ट:
img

माई भाषा रणनीति कोड:

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

जावास्क्रिप्ट रणनीति पर माइग्रेट करें

सबसे पहले, पुन: प्रयोज्य नमूना कोड में बाजार अधिग्रहण और संकेतक गणना भागों को भरें:

// 驱动策略的行情处理部分 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.MA5-दिवसीय चलती औसत और 15-दिवसीय चलती औसत की गणना करें (आप बैकटेस्ट इंटरफ़ेस पर देख सकते हैं कि K-लाइन अवधि दैनिक K-लाइन पर सेट है, इसलिएTA.MA(records, 5)5-दिवसीय चलती औसत की गणना की जाती है।TA.MA(records, 15)15-दिवसीय चलती औसत)।
फिर पाओma5सूचक डेटा का दूसरा से अंतिम बिंदुma5_curr(संकेतक मान), तीसरा से अंतिम बिंदुma5_pre(संकेतक मूल्य),ma15यही बात संकेतक डेटा पर भी लागू होती है। फिर आप इन संकेतक डेटा का उपयोग गोल्डन क्रॉस और डेड क्रॉस का आकलन करने के लिए कर सकते हैं, जैसा कि चित्र में दिखाया गया है:
img
जब तक ऐसी स्थिति बनती है, यह एक निश्चित स्वर्णिम क्रॉस या मृत क्रॉस होता है।

तब संकेत निर्णय भाग को इस प्रकार लिखा जा सकता है:

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 }

इसका मतलब यह है कि प्रत्यारोपण ठीक है, और आप वापस जाकर इसका परीक्षण कर सकते हैं:
जावास्क्रिप्ट रणनीतियों का बैकटेस्टिंग
बैकटेस्ट कॉन्फ़िगरेशन:
img

回测结果: [/upload/asset/16baa65d35e034e06a58.png](/upload/asset/16baa65d35e034e06a58.png)

मेरी भाषा का बैकटेस्टिंग
img

यह देखा जा सकता है कि बैकटेस्टिंग परिणाम मूल रूप से समान हैं, इसलिए यदि आप रणनीति में इंटरैक्टिव फ़ंक्शन जोड़ना जारी रखना चाहते हैं, तो डेटा प्रोसेसिंग (जैसे के-लाइन संश्लेषण) जोड़ें, और अनुकूलित चार्ट ड्राइंग और डिस्प्ले जोड़ें, आप कर सकते हैं यह।

जो छात्र इच्छुक हों, वे इसे आज़मा सकते हैं।

Related Recommendations
Comment
All comments (1)

    学习下

    7 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)