4
ফোকাস
1271
অনুসারী

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

তৈরি: 2021-07-30 16:36:48, আপডেট করা হয়েছে: 2023-09-20 10:36:43
comments   5
hits   2474

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

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

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

এই কৌশল আপগ্রেড করা প্রয়োজন

  • স্পট এক্সচেঞ্জ অবজেক্ট লিভারেজ মোড স্যুইচ করুন এই পরিবর্তনটি শুধুমাত্র প্রকৃত ট্রেডিং এর সাথে সম্পর্কিত কিছু স্পট এক্সচেঞ্জে স্পট লিভারেজ ইন্টারফেস রয়েছে এবং এই ইন্টারফেসগুলিও FMZ-এ প্যাকেজ করা হয়। বিনিময় বস্তুর জন্য যেগুলি সরাসরি FMZ-এ প্যাকেজ করা হয় এবং স্পট লিভারেজ সমর্থন করে, শুধুমাত্র মোডগুলি সরাসরি স্যুইচ করুন৷
  • স্প্রেড চার্ট প্রদর্শন যোগ করুন শুধু অঙ্কন থেকে স্প্রেড চার্ট প্রদর্শন যোগ করা হয়েছেA交易所->B交易所B交易所->A交易所স্প্রেড লাইন হল একটি অনুভূমিক রেখা যা স্প্রেডকে ট্রিগার করে। আমরা এটি সরাসরি ব্যবহার করি画线类库এটি পরিচালনা করার জন্য, সুবিধা হল এটি সহজ এবং ব্যবহার করা সহজ এখানে আমরা FMZ ব্যবহার করতে শিখি模版类库ফাংশন।
  • একতরফা হেজিং ফাংশন এই পরিবর্তনটিকে তুলনামূলকভাবে বড় বলা যেতে পারে, কারণ নির্দিষ্ট হেজিং লেনদেনের সময় দুটি এক্সচেঞ্জের মধ্যে মূল্যের পার্থক্য সম্পূর্ণভাবে বিপরীত করা কঠিন। বেশিরভাগ সময় একটি এক্সচেঞ্জের দাম অন্য এক্সচেঞ্জের দামের চেয়ে ধারাবাহিকভাবে বেশি থাকে। এই সময়ে, যদি আমাদের সমস্ত সম্পদ হেজ করা হয় (অর্থাৎ, সমস্ত কয়েন কম দামের বিনিময়ে থাকে এবং সমস্ত অর্থ উচ্চ মূল্যের বিনিময়ে থাকে)। হেজিং স্থবির হয়ে পড়েছে, এবং আপনি আর লাভের জন্য দামের পার্থক্যের ওঠানামার উপর নির্ভর করতে পারবেন না। এই সময়ে, কৌশলটি কারেন্সি ফেরত হেজ করার জন্য সামান্য অর্থ হারাতে সক্ষম হওয়া প্রয়োজন (আবার একটি উচ্চ মূল্যের সাথে একটি বিনিময়ে মুদ্রা বিদ্যমান থাকুক), এবং যখন মূল্যের পার্থক্য আবার বড় হয়ে যায়, তখন হেজিং করা চালিয়ে যেতে পারে। লাভ
  • ইন্টারেক্টিভভাবে পরামিতি পরিবর্তন করুন যেমন হেজিং স্প্রেড লাইন কৌশলটিতে ইন্টারেক্টিভ ফাংশন যোগ করুন এবং আপনি রিয়েল টাইমে স্প্রেড ট্রিগার লাইন পরিবর্তন করতে পারেন।
  • স্ট্যাটাস বার তথ্য সংগঠিত এবং টেবিল আকারে প্রদর্শন পর্যবেক্ষণের সুবিধার্থে যে তথ্যগুলি প্রদর্শন করা প্রয়োজন তা সাজান।

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

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

উদাহরণ হিসাবে Binance স্পট রিয়েল অফার নিন, স্পট লিভারেজ মোডে স্যুইচ করুন এবং কোড ব্যবহার করুন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")
            }
        }
    }

এখানে কৌশলটি শুধুমাত্র Binance Spot-এর কারেন্সি লিভারেজ মোড স্যুইচ করার জন্য কোড যোগ করে, তাই কৌশল প্যারামিটারে স্যুইচিং সেটিংস শুধুমাত্র Binance Spot-এর জন্য বৈধ।

স্প্রেড চার্ট প্রদর্শন যোগ করুন

ইতিমধ্যে প্যাকেজ করা অঙ্কন টেমপ্লেট ব্যবহার করা খুবই সহজ। আমরা যে টেমপ্লেট ব্যবহার করি তার নাম画线类库. আপনি সরাসরি FMZ প্ল্যাটফর্ম স্ট্র্যাটেজি স্কোয়ারে এটি অনুসন্ধান এবং পেতে পারেন।

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

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

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

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

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

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

চলুন জেনে নিই কিভাবে ব্যবহার করতে হয়画线类库গ্রাফ আঁকার ফাংশন।

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

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

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

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

        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একজন দুই হয়ে গেলtargetDiffPriceA2BtargetDiffPriceB2A。 এর পরে, আপনি চার্টে এই ডেটা আঁকতে লাইন ড্রয়িং ক্লাস লাইব্রেরির লাইন ড্রয়িং ফাংশন ব্যবহার করতে পারেন।

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

যখন কৌশলটি চলছে, তখন এরকম একটি চার্ট আসবে।

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

এরপরে, রেখাটি ওভারড্রিং এড়াতে একটি রিয়েল-টাইম স্প্রেড কার্ভ আঁকুন। ভারসাম্য সনাক্তকরণে রিয়েল-টাইম স্প্রেড ডেটার কার্ভ আঁকার জন্য কোডটি রাখুন।

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

এই পরিবর্তনগুলির উপর ভিত্তি করে কিছু ছোটখাটো সামঞ্জস্য রয়েছে।

ইন্টারেক্টিভভাবে পরামিতি পরিবর্তন করুন যেমন হেজিং স্প্রেড লাইন

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

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

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

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

ব্যাকটেস্ট

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

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

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

কৌশল সোর্স কোড: https://www.fmz.com/strategy/302834