পূর্ববর্তী নিবন্ধে, আমরা একসাথে একটি সহজ হেজিং কৌশল বাস্তবায়ন করেছি, এবং তারপর আমরা শিখব কিভাবে এই কৌশল আপগ্রেড করতে হয়। কৌশলগত পরিবর্তনগুলি বড় নয়, তবে পরিবর্তনের বিবরণগুলির প্রতি মনোযোগ দেওয়া দরকার। কোডের কিছু জায়গার সংজ্ঞা পূর্ববর্তীগুলির থেকে পরিবর্তিত হয়েছে, যা বোঝার প্রয়োজন।
A exchange -> B exchange
, B exchange -> A exchange
, এবং অনুভূমিক রেখা অঙ্কন যে ছড়িয়ে ট্রিগার. আমরা ব্যবহারline drawing class library
সরাসরি মোকাবেলা করার জন্য, সুবিধা হল যে এটি ব্যবহার করা সহজ, এখানে আমরা কিভাবে ব্যবহার করতে শিখতেtemplate class library
FMZ এর ফাংশন।এরপর, আসুন আমরা এই ডিজাইনগুলো একের পর এক বাস্তবায়ন করি।
উদাহরণস্বরূপ Binance স্পট বাস্তব বট নিন, স্পট লিভারেজ মোডে স্যুইচ, কোড ব্যবহারexchanges[i].IO
, প্যারামিটার ইনপুটtrade_normal
পজিশন অনুসারে লিভারেজ পজিশনে স্যুইচ করতে এবং ইনপুটtrade_super_margin
সম্পূর্ণ অবস্থানে লিভারেজ স্যুইচ করার জন্য, ব্যাকটেস্টিং সমর্থিত নয়। এটি শুধুমাত্র বাস্তব বট ব্যবহার করা হয়।
প্রস্তুতির পর্যায়ে যোগ করুনmain
ফাংশনঃ
// Switch leverage mode
for (var i = 0 ; i < exchanges.length ; i++) { // Traverse and detect all added exchange objects
if (exchanges[i].GetName() == "Binance" && marginType != 0) { //If the exchange object represented by the current i-index is Binance spot, and the parameter marginType of the strategy interface is not the option of "common currency", execute the switch operation
if (marginType == 1) {
Log(exchanges[i].GetName(), "Set to leveraged position-by-position")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "Set to leveraged full position")
exchanges[i].IO("trade_super_margin")
}
}
}
এখানে কৌশলটি শুধুমাত্র Binance স্পটের মুদ্রা থেকে মুদ্রা লিভারেজ মোডে স্যুইচ করার জন্য কোড যোগ করে, তাই কৌশল পরামিতিগুলির স্যুইচ সেটিংটি শুধুমাত্র Binance স্পটের জন্য বৈধ।
এটি ইতিমধ্যে মোড়ানো অঙ্কন টেমপ্লেট ব্যবহার করা খুব সহজ. আমরা ব্যবহার টেমপ্লেট নাম হলLine Drawing Library
এটি সরাসরি এফএমজেড প্ল্যাটফর্মের কৌশল স্কোয়ারে অনুসন্ধান করে পাওয়া যাবে।
অথবা সরাসরি লিঙ্কে ক্লিক করুনঃhttps://www.fmz.com/strategy/27293এই টেমপ্লেটের জন্য কপি পৃষ্ঠায় ঝাঁপ দিতে।
এই টেমপ্লেট ক্লাস লাইব্রেরিটি আপনার নিজস্ব কৌশল লাইব্রেরিতে কপি করতে এই বোতামটি ক্লিক করুন।
তারপরে আপনি কৌশল সম্পাদনা পৃষ্ঠায় টেমপ্লেট কলামে ব্যবহার করার জন্য টেমপ্লেট ক্লাস লাইব্রেরি পরীক্ষা করতে পারেন। এটি পরীক্ষা করার পরে কৌশল সংরক্ষণ করুন, এবং কৌশলটি এই টেমপ্লেটটি উল্লেখ করবে। এটি টেমপ্লেট ক্লাস লাইব্রেরির ব্যবহারের একটি সংক্ষিপ্ত বিবরণ। এই কৌশলটি ইতিমধ্যে এই টেমপ্লেটটি উল্লেখ করেছে, তাই অপারেশনটি পুনরাবৃত্তি করার দরকার নেই। যখন আপনি কৌশল স্কোয়ারে এই কৌশলটি অনুলিপি করেন, আপনি দেখতে পারেন যেLine Drawing Library
কৌশল সম্পাদনা পৃষ্ঠার টেমপ্লেট বারে উল্লেখ করা হয়েছে।
আমরা প্রধানত শিখব কিভাবেLine Drawing Library
একটি চার্ট আঁকতে।
আমাদের পরিকল্পনা হচ্ছে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
.
পরবর্তী ধাপ হল লাইন অঙ্কন লাইব্রেরির লাইন অঙ্কন ফাংশন ব্যবহার করে চার্টে এই ডেটা আঁকা।
// drawing
$.PlotHLine(targetDiffPriceA2B, "A->B") // The first parameter of this function is the value of the horizontal line in the Y-axis direction, and the second parameter is the display text
$.PlotHLine(targetDiffPriceB2A, "B->A")
যখন কৌশলটি চালানো হয়, তখন এরকম একটি চার্ট থাকে।
তারপর রিয়েল টাইম স্প্রেড কার্ভ আঁকুন, লাইন overdrawing এড়াতে. ব্যালেন্স চেক মধ্যে রিয়েল টাইম স্প্রেড তথ্য কার্ভ আঁকা কোড রাখুন.
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) // Draw real-time spread curves
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // The first parameter is the name of the curve, and the second parameter is the value of the curve at the current moment, that is, the value in the Y-axis direction at the current moment
}
এইভাবে, অঙ্কন কোডটি মাত্র 4 টি লাইন, যা কৌশলটিকে রানটাইমে একটি গ্রাফ প্রদর্শিত হতে দেয়।
উপরে উল্লিখিত হিসাবে, স্প্রেড ট্রিগার লাইন দুটিতে পরিবর্তিত হয়েছে, যা হিজিং ট্রিগারকে নিয়ন্ত্রণ করে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 market conditions are met
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("trigger A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // Tips
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 market conditions are met
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("trigger B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) //Tips
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
কৌশল কোডে ইন্টারেক্টিভ সনাক্তকরণ এবং প্রক্রিয়াকরণ কোড ডিজাইন করুন।
// interact
var cmd = GetCommand() // Every time the loop is executed here, it checks whether there is an interactive command, and returns to an empty string if not.
if (cmd) { // An interactive command was detected, such as A2B:123
Log("command received:", cmd)
var arr = cmd.split(":") // Split out the interactive control name and the value in the input box, arr[0] is A2B, arr[1] is 123
if (arr[0] == "A2B") { // Determine whether the triggered interactive control is A2B
Log("Modify the parameters of A2B, ", diffAsPercentage ? "The parameter is the difference percentage" : "The parameter is the difference:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // Modify the trigger spread line
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // Modify the trigger spread line
}
} else if (arr[0] == "B2A") { // Triggered control detected is B2A
Log("Modify the parameters of B2A, ", diffAsPercentage ? "The parameter is the difference percentage" : "The parameter is the difference:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
স্ট্যাটাস বার ডেটা প্রদর্শন আরো সংগঠিত এবং সহজ পর্যবেক্ষণ করুন।
var tbl = {
"type" : "table",
"title" : "data",
"cols" : ["exchange", "coin", "freeze coin", "denominated currency", "freeze denominated currency", "trigger spread", "current spread"],
"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) + "`")
ব্যাকটেস্টিং কেবল একটি পরীক্ষার কৌশল, একটি প্রাথমিক সনাক্তকরণ ফাংশন, এবং অনেক বাগ ব্যাকটেস্টিং পর্যায়ে আসলে পরীক্ষা করা যেতে পারে। ব্যাকটেস্টিং ফলাফলগুলিতে খুব বেশি মনোযোগ দেওয়ার দরকার নেই। চূড়ান্ত কৌশলটি এখনও বাস্তব পরিবেশে পরীক্ষা করা দরকার।
কৌশল উৎস কোডঃhttps://www.fmz.com/strategy/302834