রিসোর্স লোড হচ্ছে... লোডিং...

ক্রিপ্টোকারেন্সির স্পট হেজিং কৌশল ডিজাইন করা (২)

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২২-০৭-১৯ ১৫ঃ১৯ঃ৫২, আপডেটঃ ২০২৩-০৯-২৪ ১৯ঃ৩৪ঃ৩৮

img

ক্রিপ্টোকারেন্সি স্পট হেজিং কৌশল ডিজাইন (2)

পূর্ববর্তী নিবন্ধে, আমরা একসাথে একটি সহজ হেজিং কৌশল বাস্তবায়ন করেছি, এবং তারপর আমরা শিখব কিভাবে এই কৌশল আপগ্রেড করতে হয়। কৌশলগত পরিবর্তনগুলি বড় নয়, তবে পরিবর্তনের বিবরণগুলির প্রতি মনোযোগ দেওয়া দরকার। কোডের কিছু জায়গার সংজ্ঞা পূর্ববর্তীগুলির থেকে পরিবর্তিত হয়েছে, যা বোঝার প্রয়োজন।

এই কৌশল উন্নত করার প্রয়োজনীয়তা

  • স্পট এক্সচেঞ্জ অবজেক্ট লিভারেজ মোড পরিবর্তন করা এই পরিবর্তনটি শুধুমাত্র আসল বটের সাথে সম্পর্কিত। কিছু স্পট এক্সচেঞ্জের স্পট লিভারেজ ইন্টারফেস রয়েছে, যা এফএমজেডেও ক্যাপসুল করা হয়। এক্সচেঞ্জ অবজেক্টগুলির জন্য যা সরাসরি এফএমজেডে প্যাকেজ করা হয়েছে এবং স্পট লিভারেজ সমর্থন করে, মোডটি সরাসরি স্যুইচ করা যেতে পারে।
  • স্প্রেড চার্ট প্রদর্শন যোগ করুন স্প্রেড চার্ট প্রদর্শন যোগ করুন, কারণ এটি শুধুমাত্র স্প্রেড লাইন অঙ্কন করছেA exchange -> B exchange, B exchange -> A exchange, এবং অনুভূমিক রেখা অঙ্কন যে ছড়িয়ে ট্রিগার. আমরা ব্যবহারline drawing class libraryসরাসরি মোকাবেলা করার জন্য, সুবিধা হল যে এটি ব্যবহার করা সহজ, এখানে আমরা কিভাবে ব্যবহার করতে শিখতেtemplate class libraryFMZ এর ফাংশন।
  • একতরফা হেজিং ফাংশন এই পরিবর্তনটি বেশ উল্লেখযোগ্য হতে পারে, কারণ নির্দিষ্ট হেজিং লেনদেনের সময় দুটি এক্সচেঞ্জের মধ্যে মূল্যের পার্থক্যকে পুরোপুরি বিপরীত করা কঠিন। বেশিরভাগ সময় এক এক্সচেঞ্জের দাম অন্য এক্সচেঞ্জের দামের তুলনায় ধারাবাহিকভাবে বেশি থাকে। এই সময়ে, যদি আমাদের সম্পদগুলি সম্পূর্ণরূপে হেজ করা হয় (যেমন, মুদ্রাগুলি কম দামের বিনিময়ে রয়েছে এবং অর্থটি উচ্চ দামের বিনিময়ে রয়েছে) । হেজিং স্থবির হয়ে পড়েছে এবং মুনাফা অর্জনের জন্য স্প্রেডের অস্থিরতার উপর নির্ভর করা আর সম্ভব নয়। এই সময়ে, আমাদের কৌশলটি তৈরি করতে হবে যাতে আপনি মুদ্রাগুলি ফিরে হেজ করার জন্য কিছুটা অর্থ হারাতে পারেন (মুদ্রাগুলিকে আবার উচ্চ দামের বিনিময়ে বিদ্যমান থাকতে দিন), এবং যখন দামের পার্থক্য আবার বড় হয়, আমরা হেজিং চালিয়ে যেতে পারি এবং মুনাফা অর্জন করতে পারি।
  • হেকিং স্প্রেড লাইনের মতো পরামিতিগুলি ইন্টারেক্টিভভাবে সংশোধন করুন রিয়েল টাইমে স্প্রেড ট্রিগার লাইন পরিবর্তন করতে কৌশলটিতে ইন্টারেক্টিভ ফাংশন যুক্ত করুন।
  • স্ট্যাটাস বার তথ্য সংগঠিত করুন এবং এটি একটি টেবিল বিন্যাসে প্রদর্শন করুন সহজেই দেখার জন্য প্রদর্শিত হওয়া তথ্যগুলি সাজান।

এরপর, আসুন আমরা এই ডিজাইনগুলো একের পর এক বাস্তবায়ন করি।

স্পট এক্সচেঞ্জ অবজেক্ট লিভারেজ মোড পরিবর্তন করুন

উদাহরণস্বরূপ 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এটি সরাসরি এফএমজেড প্ল্যাটফর্মের কৌশল স্কোয়ারে অনুসন্ধান করে পাওয়া যাবে।

img

অথবা সরাসরি লিঙ্কে ক্লিক করুনঃhttps://www.fmz.com/strategy/27293এই টেমপ্লেটের জন্য কপি পৃষ্ঠায় ঝাঁপ দিতে।

img

এই টেমপ্লেট ক্লাস লাইব্রেরিটি আপনার নিজস্ব কৌশল লাইব্রেরিতে কপি করতে এই বোতামটি ক্লিক করুন।

img

তারপরে আপনি কৌশল সম্পাদনা পৃষ্ঠায় টেমপ্লেট কলামে ব্যবহার করার জন্য টেমপ্লেট ক্লাস লাইব্রেরি পরীক্ষা করতে পারেন। এটি পরীক্ষা করার পরে কৌশল সংরক্ষণ করুন, এবং কৌশলটি এই টেমপ্লেটটি উল্লেখ করবে। এটি টেমপ্লেট ক্লাস লাইব্রেরির ব্যবহারের একটি সংক্ষিপ্ত বিবরণ। এই কৌশলটি ইতিমধ্যে এই টেমপ্লেটটি উল্লেখ করেছে, তাই অপারেশনটি পুনরাবৃত্তি করার দরকার নেই। যখন আপনি কৌশল স্কোয়ারে এই কৌশলটি অনুলিপি করেন, আপনি দেখতে পারেন যেLine Drawing Libraryকৌশল সম্পাদনা পৃষ্ঠার টেমপ্লেট বারে উল্লেখ করা হয়েছে।

আমরা প্রধানত শিখব কিভাবেLine Drawing Libraryএকটি চার্ট আঁকতে।

img

আমাদের পরিকল্পনা হচ্ছে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. সুতরাং এখানে আমাদের কোডটি রূপান্তর করতে হবে, প্রথমে প্যারামিটারগুলোকে রূপান্তর করতে হবে।

img

তারপর কোড পরিবর্তন করুনঃ

        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")

যখন কৌশলটি চালানো হয়, তখন এরকম একটি চার্ট থাকে।

img

তারপর রিয়েল টাইম স্প্রেড কার্ভ আঁকুন, লাইন 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()
}

এই পরিবর্তনগুলির উপর ভিত্তি করে কিছু ছোটখাট সমন্বয়ও রয়েছে, যা এখানে পুনরাবৃত্তি করা হবে না। বিস্তারিত জানার জন্য আপনি কোডটি দেখতে পারেন।

হেকিং স্প্রেড লাইনের মতো পরামিতিগুলি ইন্টারেক্টিভভাবে সংশোধন করুন

কৌশলটিতে ইন্টারঅ্যাকশন যুক্ত করুন, যাতে কৌশলটি রিয়েল টাইমে স্প্রেড ট্রিগার লাইনটি পরিবর্তন করতে পারে। এটি একটি অর্ধ-স্বয়ংক্রিয় কৌশলটির নকশার প্রয়োজনীয়তা, যা এখানে একটি শিক্ষামূলক প্রদর্শন হিসাবেও প্রয়োগ করা হয়েছে। কৌশল ইন্টারঅ্যাকশন ডিজাইনটিও খুব সহজ। প্রথমত, কৌশল সম্পাদনা পৃষ্ঠায় কৌশলটিতে ইন্টারঅ্যাকশন কন্ট্রোল যুক্ত করুন।

img

যোগ করা হয়েছে দুটি কন্ট্রোল, এক নামক 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) + "`")

img

ব্যাকটেস্টিং

ব্যাকটেস্টিং কেবল একটি পরীক্ষার কৌশল, একটি প্রাথমিক সনাক্তকরণ ফাংশন, এবং অনেক বাগ ব্যাকটেস্টিং পর্যায়ে আসলে পরীক্ষা করা যেতে পারে। ব্যাকটেস্টিং ফলাফলগুলিতে খুব বেশি মনোযোগ দেওয়ার দরকার নেই। চূড়ান্ত কৌশলটি এখনও বাস্তব পরিবেশে পরীক্ষা করা দরকার।

img

কৌশল উৎস কোডঃhttps://www.fmz.com/strategy/302834


সম্পর্কিত

আরো