पिछले लेख में हमने एक सरल हेजिंग रणनीति को लागू किया था, और अब हम सीखते हैं कि इसे कैसे अपग्रेड किया जाए। रणनीति में कोई बड़ा बदलाव नहीं होगा, लेकिन परिवर्तन के विवरण पर ध्यान देना आवश्यक है. कोड में कुछ स्थानों की परिभाषा और पहले के परिवर्तनों को समझने की आवश्यकता है।
A交易所->B交易所
,B交易所->A交易所
हम सीधे उपयोग कर सकते हैं कि हम क्या कर रहे हैं, हम क्या कर रहे हैं, हम क्या कर रहे हैं।画线类库
और हम यहाँ FMZ का उपयोग करने के लिए कैसे सीख रहे हैं।模版类库
फ़ंक्शन ।अब हम इन डिजाइनों को एक-एक करके लागू करते हैं।
विनिमय के लिए कोड का उपयोग करेंexchanges[i].IO
, प्रवेश पैरामीटरtrade_normal
लीवर के लिए स्विच करें, आगे बढ़ेंtrade_super_margin
लीवर को पूर्ण स्टोरेज में स्विच करें, रीमेटर समर्थित नहीं है. यह केवल वास्तविक समय में उपयोग किया जाता है.
मेंmain
फ़ंक्शन की शुरुआत के लिए तैयारी के चरण में वृद्धिः
// 切换杠杆模式
for (var i = 0 ; i < exchanges.length ; i++) { // 遍历检测所有添加的交易所对象
if (exchanges[i].GetName() == "Binance" && marginType != 0) { // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
if (marginType == 1) {
Log(exchanges[i].GetName(), "设置为杠杆逐仓")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "设置为杠杆全仓")
exchanges[i].IO("trade_super_margin")
}
}
}
यहां नीति में केवल विनिमय विनिमय मुद्रा लेवलिंग मोड के कोड को जोड़ा गया है, इसलिए नीति पैरामीटर पर विनिमय सेट करना केवल विनिमय मुद्रा पर लागू होता है।
चित्रों के पैकेज किए गए टेम्पलेट का उपयोग करना बहुत आसान है।画线类库
◎ आप सीधे एफएमजेड प्लेटफॉर्म रणनीति वर्ग पर खोज कर सकते हैं।
या सीधे इस लिंक पर क्लिक करेंःhttps://www.fmz.com/strategy/27293इस टेम्पलेट के प्रतिलिपि पृष्ठ पर जाएं।
एक बटन क्लिक करने के बाद, इस टेम्पलेट को अपनी नीति संग्रह में कॉपी किया जा सकता है।
फिर नीति संपादन पृष्ठ पर, आप टेम्पलेट फ़ील्ड में आवश्यक टेम्पलेट लाइब्रेरी को टैप कर सकते हैं। टैप करने के बाद सहेजें नीति, यह नीति इस टेम्पलेट को संदर्भित करती है। यह केवल टेम्पलेट फ़ील्ड का उपयोग करने के लिए एक संक्षिप्त विवरण है, यह नीति इस टेम्पलेट को संदर्भित कर चुकी है, इसलिए आपको दोहराने की आवश्यकता नहीं है। जब आप इस नीति को नीति वर्ग में कॉपी करते हैं, तो आप इसे नीति संपादन पृष्ठ के टेम्पलेट फ़ील्ड में देख सकते हैं।画线类库
इस लेख में, हम आपको बता रहे हैं कि कैसे।
हम मुख्य रूप से सीखते हैं कि इसे कैसे इस्तेमाल किया जाए।画线类库
फ़ंक्शन का चित्रण करने के लिए।
हम योजना बना रहे हैंA->B
यह एक बहुत ही अच्छा तरीका है।B->A
इस तरह से, दो रेखाएं (वर्तमान A से B और B से A के बीच का अंतर) और दो क्षैतिज रेखाएं (ट्रिगर मूल्य रेखाएं) खींची जाती हैं, जैसा कि ऊपर चित्रित है।
क्योंकि हम एकतरफा हेजिंग डिजाइन करना चाहते हैं।A->B
औरB->A
इस लेख में, हम आपको बता रहे हैं कि क्या आप पहले लेख में वर्णित डिजाइन का उपयोग नहीं कर सकते हैं।
पिछले लेख मेंः
var targetDiffPrice = hedgeDiffPrice
if (diffAsPercentage) {
targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
}
केवल एक ट्रिगर अंतरtargetDiffPrice
..
तो यहाँ हम कोड को बदलना है, पहले पैरामीटर को बदलना है.
फिर कोड को संशोधित करेंः
var targetDiffPriceA2B = hedgeDiffPriceA2B
var targetDiffPriceB2A = hedgeDiffPriceB2A
if (diffAsPercentage) {
targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
}
इस तरह, कीमतों का अंतर पहले के मूल्य से कम हो जाता है।targetDiffPrice
एक, दो बन गया।targetDiffPriceA2B
、targetDiffPriceB2A
..
इसके बाद, आप रेखा रेखा फ़ंक्शन का उपयोग करके इस डेटा को चार्ट पर चित्रित कर सकते हैं।
// 画图
$.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
$.PlotHLine(targetDiffPriceB2A, "B->A")
इस रणनीति को लागू करने के बाद, इस तरह के चार्ट दिखाई देते हैं।
इसके बाद, वास्तविक समय में भिन्नता की रेखाएं खींची जाती हैं, ताकि अत्यधिक रेखाएं नहीं बनाई जा सकें। वास्तविक समय में भिन्नता डेटा की रेखाओं के कोड को संतुलन परीक्षण में रखा जाता है।
if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
nowAccs = _C(updateAccs, exchanges)
var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
cancelAll()
if (isBalance) {
lastKeepBalanceTS = ts
if (isTrade) {
var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
isTrade = false
}
}
$.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price) // 画实时差价曲线
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
}
इस प्रकार चार पंक्तियों के कोड के साथ चार चित्र बनाए जाते हैं, जिससे नीति चलती समय चार्ट दिखाई देती है।
ऊपर दिए गए लेख में उल्लेख किया गया है कि मूल्य अंतर ट्रिगर लाइन को दो लाइनों में बदल दिया गया है, एक नियंत्रण लाइन और दूसरी नियंत्रण लाइन।A->B
इस तरह की एक घटना के बाद, एक और घटना हुई।B->A
इस प्रकार, पहले के नीचे ऑर्डर मूल्य एल्गोरिथ्म का उपयोग नहीं किया जा सकता है, और एक स्टॉक मूल्य स्लाइड मूल्य का उपयोग किया जाता है।
if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) { // A -> B 盘口条件满足
var priceSell = depthA.Bids[0].Price - slidePrice
var priceBuy = depthB.Asks[0].Price + slidePrice
var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // 提示信息
hedge(exB, exA, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
} else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) { // B -> A 盘口条件满足
var priceBuy = depthA.Asks[0].Price + slidePrice
var priceSell = depthB.Bids[0].Price - slidePrice
var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) // 提示信息
hedge(exA, exB, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
}
और चूंकि खरीद और बिक्री की कीमतें दो अलग-अलग आंकड़ों में हैं, इसलिए हम एक हेजिंग फ़ंक्शन के लिए एक विकल्प चुनते हैं।hedge
इस तरह के लोगों के लिए, यह बहुत अच्छा है।
function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
var sellRoutine = sellEx.Go("Sell", priceSell, amount)
Sleep(500)
buyRoutine.wait()
sellRoutine.wait()
}
इन परिवर्तनों के आधार पर कुछ सूक्ष्म समायोजन भी किए गए हैं, जिनका वर्णन यहां नहीं किया गया है, कोड देखें।
रणनीतियों को वास्तविक समय में भिन्नता ट्रिगर लाइन को संशोधित करने की अनुमति देने के लिए बातचीत को जोड़ना। यह एक अर्ध-स्वचालित रणनीति के डिजाइन की आवश्यकता है, जिसे यहां एक शिक्षण उदाहरण के रूप में भी लागू किया गया है। नीति इंटरैक्शन डिजाइन भी बहुत सरल है, पहले नीति संपादित पृष्ठ पर नीति को इंटरैक्शन नियंत्रण जोड़ें।
दो नियंत्रण जोड़े गए हैं, एक A2B और एक B2A. जब आप नियंत्रण इनपुट बॉक्स में एक संख्या दर्ज करते हैं, तो इनपुट बॉक्स के दाईं ओर के बटन पर क्लिक करें. यह तुरंत नीति को एक निर्देश भेजता है, जैसेः इनपुट बॉक्स में एक संख्या दर्ज करें.123
क्लिक करेंA2B
इस बटन के साथ, नीति को तुरंत निर्देश भेजे जाते हैं।
A2B:123
रणनीतिक कोड में डिजाइन पर बातचीत का पता लगाना, कोड को संसाधित करना।
// 交互
var cmd = GetCommand() // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
if (cmd) { // 检测到有交互指令,例如:A2B:123
Log("接收到命令:", cmd)
var arr = cmd.split(":") // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
if (arr[0] == "A2B") { // 判断触发的交互控件是不是A2B
Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // 修改触发差价线
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // 修改触发差价线
}
} else if (arr[0] == "B2A") { // 检测到触发的控件是B2A
Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
इस प्रकार, स्थिति टैब डेटा को अधिक व्यवस्थित और देखने में आसान बनाया जा सकता है।
var tbl = {
"type" : "table",
"title" : "数据",
"cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"],
"rows" : [],
}
tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
पुनः परीक्षण केवल एक परीक्षण रणनीति है, प्रारंभिक पता लगाने की सुविधा है, कई BUG को पुनः परीक्षण चरण में वास्तव में परीक्षण किया जा सकता है। पुनः परीक्षण के परिणामों के बारे में बहुत अधिक चिंता करने की आवश्यकता नहीं है, अंतिम रणनीति को वास्तविक वातावरण में वास्तविक बंदूक की वास्तविक गोली की आवश्यकता है।
रणनीति का स्रोत कोडःhttps://www.fmz.com/strategy/302834
15570686905यह लेन-देन की रणनीति है, जो कि अनुबंधों को जोड़ती है, और यह बहुत अच्छा है कि आप स्थायी अनुबंधों को जोड़ते हैं, और आप सौदे के अनुपात को जोड़ते हैं।
हल्के बादलमुख्यः 127:9 - TypeError: Cannot read property 'SetPrecision of undefined' - टाइप त्रुटिः 'सेट सटीकता' को पढ़ नहीं सका अलग-अलग मुद्राओं के लिए नकदी प्रतिभूति रणनीति Ver1.1
आविष्कारक मात्रा - छोटे सपनेअच्छा, एक ट्यूटोरियल देने का अवसर है।
हल्के बादलमैं समझ गया, शुक्रिया।
आविष्कारक मात्रा - छोटे सपनेदो एक्सचेंज ऑब्जेक्ट जोड़ने के लिए।