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

লেখক:নিনাবাদাস, তৈরিঃ ২০২২-০৪-১৪ ১১ঃ৫৭ঃ৪৬, আপডেটঃ ২০২২-০৪-১৪ ১৬ঃ৩২ঃ৫৬

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

কৌশল নকশায় নতুনদের জন্য, হেজিং কৌশল অনুশীলনের জন্য খুব ভাল। এই নিবন্ধটি একটি সহজ কিন্তু কঠিন ক্রিপ্টোকারেন্সি স্পট হেজিং কৌশল বাস্তবায়ন করে, আশা করে নতুনদের কিছু নকশা অভিজ্ঞতা শিখতে দেয়।

পরিকল্পনার প্রয়োজনীয়তা অনুসারে ডিজাইন ফাংশন এবং পরামিতি

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

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

এর উপর ভিত্তি করে, কৌশলটি বিভিন্ন পরামিতি সহ ডিজাইন করা দরকারঃ

  • হেজ স্প্রেডঃhedgeDiffPriceযখন স্প্রেডের মান অতিক্রম করে, তখন হেজিং সক্রিয় করা হবে।
  • ন্যূনতম হেজিং পরিমাণঃminHedgeAmount, হেকজিংয়ের জন্য উপলব্ধ সর্বনিম্ন অর্ডার পরিমাণ (প্রতীক পরিমাণ) ।
  • সর্বাধিক হিজিং পরিমাণঃmaxHedgeAmount, হেকজিংয়ের জন্য সর্বোচ্চ অর্ডার পরিমাণ (প্রতীক পরিমাণ) ।
  • দামের নির্ভুলতা A:pricePrecisionA, প্ল্যাটফর্ম A এর অর্ডার মূল্যের সঠিকতা (দশমিক সংখ্যা) ।
  • অর্ডার পরিমাণের সঠিকতা A:amountPrecisionA, প্ল্যাটফর্ম A এর অর্ডার পরিমাণের নির্ভুলতা (দশমিক সংখ্যা) ।
  • দামের নির্ভুলতা B:pricePrecisionB, প্ল্যাটফর্ম বি এর অর্ডার মূল্যের সঠিকতা (দশমিক সংখ্যা) ।
  • অর্ডার পরিমাণের সঠিকতা B:amountPrecisionB, প্ল্যাটফর্ম বি এর অর্ডার পরিমাণের সঠিকতা (দশমিক সংখ্যা) ।
  • বিনিময় হার A:rateA, প্রথম যোগ করা বিনিময় বস্তুর বিনিময় হার রূপান্তর; ডিফল্ট হল 1, যা রূপান্তর না করার ইঙ্গিত দেয়।
  • বিনিময় হার B:rateB, দ্বিতীয় যোগ করা বিনিময় বস্তুর বিনিময় হার রূপান্তর; ডিফল্ট হল 1, যা রূপান্তর না করার ইঙ্গিত দেয়।

হেজ কৌশল দুটি অ্যাকাউন্টের মুদ্রা প্রতীক পরিমাণ অপরিবর্তিত রাখতে হবে (যেমন, কোন দিকনির্দেশক অবস্থান রাখা না, এবং নিরপেক্ষ বজায় রাখা), তাই সবসময় ভারসাম্য সনাক্ত করার কৌশল একটি ভারসাম্য যুক্তি থাকতে হবে। ভারসাম্য চেক করার সময়, এটি অনিবার্য দুই প্ল্যাটফর্ম থেকে সম্পদ তথ্য পেতে হয়। অতএব, আমরা ব্যবহারের জন্য একটি ফাংশন লিখতে হবে।

  • আপডেটAccs
    function updateAccs(arrEx) {
        var ret = []
        for (var i = 0 ; i < arrEx.length ; i++) {
            var acc = arrEx[i].GetAccount()
            if (!acc) {
                return null
            }
            ret.push(acc)
        }
        return ret 
    }
    

অর্ডার দেওয়ার পরে, যদি কোনও কার্যকর অর্ডার না থাকে তবে আমাদের এটি সময়মতো বাতিল করতে হবে এবং অর্ডারটি অপেক্ষমান রাখা যাবে না। এই ক্রিয়াকলাপটি ব্যালেন্স মডিউল এবং হেজ লজিক উভয় ক্ষেত্রেই প্রক্রিয়া করা দরকার, তাই সমস্ত অর্ডার বাতিল করার একটি ফাংশন ডিজাইন করাও প্রয়োজনীয়।

  • বাতিল করুন
    function cancelAll() {
        _.each(exchanges, function(ex) {
            while (true) {
                var orders = _C(ex.GetOrders)
                if (orders.length == 0) {
                    break
                }
                for (var i = 0 ; i < orders.length ; i++) {
                    ex.CancelOrder(orders[i].Id, orders[i])
                    Sleep(500)
                }
            }
        })
    }
    

মুদ্রা প্রতীকের পরিমাণ ভারসাম্য করার সময়, আমাদের একটি নির্দিষ্ট পরিমাণে একটি নির্দিষ্ট গভীরতার ডেটা দিয়ে মূল্য খুঁজে বের করতে হবে, তাই এটি পরিচালনা করার জন্য আমাদের এই ধরনের ফাংশন দরকার।

  • getDepthPrice
    function getDepthPrice(depth, side, amount) {
        var arr = depth[side]
        var sum = 0
        var price = null
        for (var i = 0 ; i < arr.length ; i++) {
            var ele = arr[i]
            sum += ele.Amount
            if (sum >= amount) {
                price = ele.Price
                break
            }
        }
        return price
    }
    

তারপরে আমাদের নির্দিষ্ট হেজিং অর্ডার অপারেশন ডিজাইন এবং লিখতে হবে, যা একই সাথে অর্ডার দেওয়ার জন্য ডিজাইন করা দরকারঃ

  • হেজ
    function hedge(buyEx, sellEx, price, amount) {
        var buyRoutine = buyEx.Go("Buy", price, amount)
        var sellRoutine = sellEx.Go("Sell", price, amount)
        Sleep(500)
        buyRoutine.wait()
        sellRoutine.wait()
    }
    

অবশেষে, আসুন ভারসাম্য ফাংশনের নকশাটি সম্পূর্ণ করি, যা কিছুটা জটিল।

  • keepBalance ভারসাম্য বজায় রাখুন
    function keepBalance(initAccs, nowAccs, depths) {
        var initSumStocks = 0
        var nowSumStocks = 0 
        _.each(initAccs, function(acc) {
            initSumStocks += acc.Stocks + acc.FrozenStocks
        })
        _.each(nowAccs, function(acc) {
            nowSumStocks += acc.Stocks + acc.FrozenStocks
        })
      
        var diff = nowSumStocks - initSumStocks
        // calculate currency spread 
        if (Math.abs(diff) > minHedgeAmount && initAccs.length == nowAccs.length && nowAccs.length == depths.length) {
            var index = -1
            var available = []
            var side = diff > 0 ? "Bids" : "Asks"
            for (var i = 0 ; i < nowAccs.length ; i++) {
                var price = getDepthPrice(depths[i], side, Math.abs(diff))
                if (side == "Bids" && nowAccs[i].Stocks > Math.abs(diff)) {
                    available.push(i)
                } else if (price && nowAccs[i].Balance / price > Math.abs(diff)) {
                    available.push(i)
                }
            }
            for (var i = 0 ; i < available.length ; i++) {
                if (index == -1) {
                    index = available[i]
                } else {
                    var priceIndex = getDepthPrice(depths[index], side, Math.abs(diff))
                    var priceI = getDepthPrice(depths[available[i]], side, Math.abs(diff))
                    if (side == "Bids" && priceIndex && priceI && priceI > priceIndex) {
                        index = available[i]
                    } else if (priceIndex && priceI && priceI < priceIndex) {
                        index = available[i]
                    }
                }
            }
            if (index == -1) {
                Log("cannot balance")            
            } else {
                // balanced ordering 
                var price = getDepthPrice(depths[index], side, Math.abs(diff))
                if (price) {
                    var tradeFunc = side == "Bids" ? exchanges[index].Sell : exchanges[index].Buy
                    tradeFunc(price, Math.abs(diff))
                } else {
                    Log("invalid price", price)
                }
            }        
            return false
        } else if (!(initAccs.length == nowAccs.length && nowAccs.length == depths.length)) {
            Log("error:", "initAccs.length:", initAccs.length, "nowAccs.length:", nowAccs.length, "depths.length:", depths.length)
            return true 
        } else {
            return true 
        }
    }
    

এই ফাংশনগুলো কৌশলগত প্রয়োজনীয়তা অনুযায়ী ডিজাইন করা হয়েছে, এবং আমরা কৌশলটির প্রধান ফাংশন ডিজাইন করতে শুরু করতে পারি।

কৌশল প্রধান ফাংশন ডিজাইন

এফএমজেডে, কৌশলটিmainকর্মের শুরুতেmainফাংশন, আমরা কৌশল কিছু initialization করতে হবে.

  • এক্সচেঞ্জ অবজেক্টের নাম কৌশল অনেক অপারেশন জন্য বিনিময় বস্তু ব্যবহার করুন, যেমন বাজারের উদ্ধৃতি পেতে, অর্ডার স্থাপন, এবং তাই উপর, তাই এটি একটি দীর্ঘ নাম ব্যবহার করতে অসুবিধাজনক হবে প্রতিটি সময়, আমার সামান্য কৌতুক পরিবর্তে একটি সহজ সংক্ষিপ্ত নাম ব্যবহার করা হয়, উদাহরণস্বরূপঃ

    var exA = exchanges[0]
    var exB = exchanges[1]
    

    তাহলে, কোডটি পরে লিখতে আরও আরামদায়ক হবে।

  • বিনিময় হার ও নির্ভুলতা

      // settings of precision and exchange rate
      if (rateA != 1) {
          // set exchange rate A 
          exA.SetRate(rateA)
          Log("Platform A sets exchange rate:", rateA, "#FF0000")
      }
      if (rateB != 1) {
          // set exchange rate B
          exB.SetRate(rateB)
          Log("Platform B sets exchange rate:", rateB, "#FF0000")
      }
      exA.SetPrecision(pricePrecisionA, amountPrecisionA)
      exB.SetPrecision(pricePrecisionB, amountPrecisionB)
    

    যদি বিনিময় হার পরামিতিগুলির মধ্যে একটি, যথাrateAএবংrateB, 1 এ সেট করা হয় (ডিফল্ট হল 1), অর্থাৎ,rateA != 1অথবাrateB != 1অর্থ সক্রিয় করা হয়নি, এবং বিনিময় হার রূপান্তর করা যাবে না।

  • সমস্ত তারিখ পুনরায় সেট করুন

    img

    কখনও কখনও, এটা সব লগ মুছে ফেলার প্রয়োজন হয় এবং কৌশল শুরু করার সময় ডাটা রেকর্ড ভ্যাকুয়াম. আপনি একটি কৌশল ইন্টারফেস পরামিতি ডিজাইন করতে পারেনisReset, এবং তারপরে কৌশলটির সূচনা অংশে পুনরায় সেট কোডটি ডিজাইন করুন, উদাহরণস্বরূপঃ

      if (isReset) {   // when "isReset" is true, reset the data 
          _G(null)
          LogReset(1)
          LogProfitReset()
          LogVacuum()
          Log("Reset all data", "#FF0000")
      }
    
  • প্রাথমিক অ্যাকাউন্ট ডেটা পুনরুদ্ধার করুন এবং বর্তমান অ্যাকাউন্ট ডেটা আপডেট করুন ব্যালেন্সের মূল্যায়ন করার জন্য, কৌশলটি বর্তমানের সাথে তুলনা করার জন্য প্রাথমিক অ্যাকাউন্টের সম্পদ অবস্থার ক্রমাগত রেকর্ড করা প্রয়োজন।nowAccsবর্তমান অ্যাকাউন্টের তথ্য রেকর্ড করার জন্য ব্যবহৃত হয়।updateAccsবর্তমান প্ল্যাটফর্মের অ্যাকাউন্ট ডেটা পেতে আমরা যে ফাংশনটি ডিজাইন করেছি।initAccsএটি প্রাথমিক অ্যাকাউন্টের অবস্থা রেকর্ড করতে ব্যবহৃত হয় (যেমন A এবং B উভয়ের মুদ্রা প্রতীক পরিমাণ, কোট মুদ্রার পরিমাণ ইত্যাদি) ।initAccs, প্রথমে ব্যবহার করুন_G()পুনরুদ্ধার করার ফাংশন ( _ জি ফাংশন ডেটা স্থায়ীভাবে রেকর্ড করবে এবং রেকর্ড করা ডেটা আবার ফিরিয়ে দিতে পারে; বিস্তারিত জানার জন্য API ডকুমেন্টেশন পড়ুনঃলিঙ্ক).
    যদি আপনি তথ্য অনুসন্ধান করতে পারবেন না, বরাদ্দ এবং ব্যবহার করার জন্য বর্তমান অ্যাকাউন্ট তথ্য ব্যবহার_G()রেকর্ড করার জন্য ফাংশন.

    যেমন নিম্নলিখিত কোডঃ

      var nowAccs = _C(updateAccs, exchanges)
      var initAccs = _G("initAccs")
      if (!initAccs) {
          initAccs = nowAccs
          _G("initAccs", initAccs)
      }
    

ট্রেডিং লজিক, প্রধান ফাংশনে প্রধান লুপ

প্রধান লুপের কোডটি কৌশল লজিক এক্সিকিউশনের প্রতিটি রাউন্ডের প্রক্রিয়া এবং নন-স্টপ পুনরাবৃত্তি এক্সিকিউশন কৌশল প্রধান লুপ তৈরি করে। আসুন প্রধান লুপের প্রোগ্রামের প্রতিটি এক্সিকিউশন প্রবাহের দিকে নজর দেওয়া যাক।

  • বাজারের উদ্ধৃতি পান এবং বৈধতা বিচার করুন

          var ts = new Date().getTime()
          var depthARoutine = exA.Go("GetDepth")
          var depthBRoutine = exB.Go("GetDepth")
          var depthA = depthARoutine.wait()
          var depthB = depthBRoutine.wait()
          if (!depthA || !depthB || depthA.Asks.length == 0 || depthA.Bids.length == 0 || depthB.Asks.length == 0 || depthB.Bids.length == 0) {
              Sleep(500)
              continue 
          }
    

    এখানে আপনি দেখতে পারেন যে সমান্তরাল ফাংশনexchange.GoFMZ প্ল্যাটফর্মের সমান্তরাল বস্তু তৈরি করতে ব্যবহৃত হয়depthARoutineএবংdepthBRoutineযে কলGetDepth()ইন্টারফেস. যখন এই দুটি সমান্তরাল বস্তু তৈরি করা হয়,GetDepth()ইন্টারফেস অবিলম্বে কল করা হয়, এবং উভয় গভীরতা তথ্যের জন্য অনুরোধ প্ল্যাটফর্ম পাঠানো হয়। তাহলে, কল করুনwait()বস্তুর পদ্ধতিdepthARoutineএবং বস্তুdepthBRoutineগভীরতার তথ্য পেতে। গভীরতার তথ্য পাওয়ার পর, গভীরতার তথ্য যাচাই করা প্রয়োজন যাতে এর বৈধতা বিচার করা যায়।continueপ্রধান লুপ পুনরায় চালানোর জন্য স্ট্রিং ট্রিগার করা হয়।

  • ব্যবহারprice spreadঅথবাspread ratio?

          var targetDiffPrice = hedgeDiffPrice
          if (diffAsPercentage) {
              targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
          }
    

    প্যারামিটার পরিপ্রেক্ষিতে, আমরা যেমন একটি নকশা তৈরি করেছি। FMZ প্যারামিটার হতে পারেপ্রদর্শনীঅথবালুকিয়ে থাকাএকটি প্যারামিটার উপর ভিত্তি করে, তাই আমরা একটি প্যারামিটার করতে পারেন সিদ্ধান্ত নিতে কিনা ব্যবহারprice spread, অথবাspread ratio.

    img

    প্যারামিটারdiffAsPercentageকৌশল ইন্টারফেসের পরামিতি যোগ করা হয়েছে. অন্যান্য দুটি পরামিতি, যা প্যারামিটার উপর ভিত্তি করে প্রদর্শন বা লুকিয়ে রাখা হবেঃhedgeDiffPrice@!diffAsPercentageযখনdiffAsPercentageমিথ্যা, তা প্রমাণিত হবে।hedgeDiffPercentage@diffAsPercentageযখনdiffAsPercentageসত্য, এটা প্রদর্শিত হবে।
    পরিকল্পনার পর, আমরাdiffAsPercentageপ্যারামিটার, যা হেজিং ট্রিগার শর্ত হিসাবে স্প্রেড অনুপাত ব্যবহার করা হয়।diffAsPercentageপ্যারামিটারটি চেক করা না হলে, হেক্জ ট্রিগার শর্ত হিসেবে দামের স্প্রেড ব্যবহার করা হয়।

  • বিচারক হেজ ট্রিগার

          if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPrice && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) {          // A -> B market condition satisfied             
              var price = (depthA.Bids[0].Price + depthB.Asks[0].Price) / 2
              var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
              if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance / price > minHedgeAmount) {
                  amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance / price, maxHedgeAmount)
                  Log("triggerA->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, price, amount, nowAccs[1].Balance / price, nowAccs[0].Stocks)  // prompt message 
                  hedge(exB, exA, price, amount)
                  cancelAll()
                  lastKeepBalanceTS = 0
                  isTrade = true 
              }            
          } else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPrice && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) {   // B -> A market condition satisfied 
              var price = (depthB.Bids[0].Price + depthA.Asks[0].Price) / 2
              var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
              if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance / price > minHedgeAmount) {
                  amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance / price, maxHedgeAmount)
                  Log("triggerB->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, price, amount, nowAccs[0].Balance / price, nowAccs[1].Stocks)  // prompt message
                  hedge(exA, exB, price, amount)
                  cancelAll()
                  lastKeepBalanceTS = 0
                  isTrade = true 
              }            
          }
    

    হিজিংয়ের জন্য বেশ কয়েকটি শর্ত রয়েছেঃ ১.প্রথমত, হেজ স্প্রেড পূরণ করুন; শুধুমাত্র যখন মার্কেট স্প্রেড সেট স্প্রেড প্যারামিটার পূরণ করে তখনই হেজিং সম্ভব।

    ২.বাজারের হেজিংয়ের পরিমাণটি পরামিতিগুলিতে নির্ধারিত সর্বনিম্ন হেজিংয়ের পরিমাণ পূরণ করা উচিত। যেহেতু বিভিন্ন প্ল্যাটফর্মের সর্বনিম্ন অর্ডার পরিমাণ আলাদা, তাই দুটি থেকে সর্বনিম্নটি নেওয়া উচিত।

    ৩.বিক্রয় অপারেশনের সাথে প্ল্যাটফর্মের সম্পদগুলি বিক্রয়ের জন্য যথেষ্ট, এবং ক্রয় অপারেশনের সাথে প্ল্যাটফর্মের সম্পদগুলি কেনার জন্য যথেষ্ট। যখন এই শর্তগুলি পূরণ হয়, হেজিং দ্বারা অর্ডার দেওয়ার জন্য হেজ ফাংশনটি সম্পাদন করুন। প্রধান ফাংশনের আগে, আমরা একটি পরিবর্তনশীল ঘোষণা করিisTradeআগে থেকে চিহ্নিত করতে হবে কিনা হেজ ঘটেছে. এখানে, যদি হেজ ট্রিগার করা হয়, পরিবর্তনশীল সেট করা হয়true. এবং গ্লোবাল ভেরিয়েবল রিসেট করুনlastKeepBalanceTS0 (lastKeepBalanceTS ব্যবহার করা হয় সর্বশেষ ব্যালেন্স অপারেশনের টাইমস্ট্যাম্প চিহ্নিত করতে, এবং এটি 0 এ সেট করা হবে অবিলম্বে ব্যালেন্স অপারেশন ট্রিগার হবে), এবং তারপর সমস্ত অপেক্ষমান অর্ডার বাতিল করুন।

  • ব্যালেন্স অপারেশন

          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 
                  }                
              }            
          }
    

    এটা দেখা যায় যে ভারসাম্য ফাংশন পর্যায়ক্রমে সঞ্চালিত হয়, কিন্তু যদিlastKeepBalanceTSহিজিং অপারেশন শুরু হওয়ার পর যদি রিসেট করা হয়, তাহলে অবিলম্বে ব্যালেন্স অপারেশন শুরু হবে। ব্যালেন্স সফল হলে রিটার্ন গণনা করা হবে।

  • অবস্থা বার তথ্য

          LogStatus(_D(), "A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, " B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, " targetDiffPrice:", targetDiffPrice, "\n", 
              "currentA,Stocks:", nowAccs[0].Stocks, "FrozenStocks:", nowAccs[0].FrozenStocks, "Balance:", nowAccs[0].Balance, "FrozenBalance", nowAccs[0].FrozenBalance, "\n", 
              "currentB,Stocks:", nowAccs[1].Stocks, "FrozenStocks:", nowAccs[1].FrozenStocks, "Balance:", nowAccs[1].Balance, "FrozenBalance", nowAccs[1].FrozenBalance, "\n", 
              "initialA,Stocks:", initAccs[0].Stocks, "FrozenStocks:", initAccs[0].FrozenStocks, "Balance:", initAccs[0].Balance, "FrozenBalance", initAccs[0].FrozenBalance, "\n", 
              "initialB,Stocks:", initAccs[1].Stocks, "FrozenStocks:", initAccs[1].FrozenStocks, "Balance:", initAccs[1].Balance, "FrozenBalance", initAccs[1].FrozenBalance)
    

    স্ট্যাটাস বারটি বিশেষত জটিল হওয়ার জন্য ডিজাইন করা হয়নি। এটি বর্তমান সময়, প্ল্যাটফর্ম এ থেকে প্ল্যাটফর্ম বি থেকে দামের স্প্রেড এবং বি থেকে এ পর্যন্ত দামের স্প্রেড প্রদর্শন করে; এটি বর্তমান হেজ লক্ষ্য স্প্রেড, প্ল্যাটফর্ম এ এর অ্যাকাউন্ট সম্পদ তথ্য এবং প্ল্যাটফর্ম বি এর অ্যাকাউন্ট সম্পদ তথ্য প্রদর্শন করে।

বিভিন্ন কোট মুদ্রার জন্য ট্রেডিং জোড়া প্রসেসিং

প্যারামিটারগুলির ক্ষেত্রে, আমরা বিনিময় হার মান রূপান্তর প্যারামিটার ডিজাইন করেছি, এবং আমরা প্রথম অপারেশন মধ্যে বিনিময় হার রূপান্তর ডিজাইন করেছিmainএটি লক্ষ্য করা উচিত যে,SetRateবিনিময় হার রূপান্তর ফাংশন প্রথম কার্যকর করা প্রয়োজন।

এই ফাংশন দুটি দিক প্রভাবিত করবেঃ

  • সমস্ত বাজার কোটেশন ডেটা, অর্ডার ডেটা এবং অবস্থান ডেটাতে মূল্য রূপান্তর।
  • কোটেশন মুদ্রার রূপান্তর অ্যাকাউন্টের সম্পদ।

উদাহরণস্বরূপ, বর্তমান ট্রেডিং জোড়া হলBTC_USDT, দামের একক হলUSDT, এবং অ্যাকাউন্টের সম্পদগুলিতে উপলব্ধ কোট মুদ্রাটিওUSDT. যদি আমি সম্পদ মান CNY রূপান্তর করতে চান, সেটexchange.SetRate(6.8)কোডের অধীনে সমস্ত ফাংশন দ্বারা প্রাপ্ত তথ্য রূপান্তর করতেexchangeএবং তারপর CNY তে রূপান্তর করুন। কোন কোট মুদ্রায় রূপান্তর করতে, আমদানিবর্তমান কোটিং মুদ্রার থেকে লক্ষ্য কোটিং মুদ্রার বিনিময় হারমধ্যেSetRate function.

সম্পূর্ণ কৌশল:বিভিন্ন কোটেশন মুদ্রার স্পট হেজিং কৌশল (শিক্ষা)


আরো