ক্রিপ্টোকারেন্সি ফিউচারগুলির জন্য মার্টিনগেল কৌশল নকশা

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

img

ক্রিপ্টোকারেন্সি ফিউচারগুলির জন্য মার্টিনগেল কৌশল নকশা

সম্প্রতি, এফএমজেড অফিসিয়াল গ্রুপে অনেকগুলি মার্টিনগেল কৌশল নিয়ে আলোচনা করা হয়েছে, এবং প্ল্যাটফর্মে ক্রিপ্টোকারেন্সি চুক্তির অনেকগুলি মার্টিনগেল কৌশল নেই। অতএব, আমি ক্রিপ্টোকারেন্সি ফিউচারগুলির জন্য একটি সহজ মার্টিনগেল কৌশল ডিজাইন করার সুযোগটি গ্রহণ করেছি। কেন এটিকে মার্টিনগেল কৌশল বলা হয়? কারণ মার্টিন কৌশলটির সম্ভাব্য ঝুঁকিগুলি সত্যই ছোট নয়, এটি মার্টিন কৌশল অনুসারে সঠিকভাবে ডিজাইন করা হয়নি। তবে, এই ধরণের কৌশলটির এখনও প্রচুর ঝুঁকি রয়েছে এবং মার্টিন-টাইপ কৌশলটির পরামিতি সেটিংস ঝুঁকির সাথে ঘনিষ্ঠভাবে সম্পর্কিত এবং ঝুঁকি উপেক্ষা করা উচিত নয়।

এই নিবন্ধটি মূলত মার্টিন-টাইপ কৌশলগুলির নকশা থেকে ব্যাখ্যা করে এবং শিখেছে। যেহেতু কৌশল ধারণাটি খুব স্পষ্ট, এফএমজেডের ব্যবহারকারী হিসাবে, আমরা কৌশল নকশা আরও বিবেচনা করি।

মোট মূলধন অর্জন

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

সুতরাং আমরা বিভিন্ন এক্সচেঞ্জের উপর ভিত্তি করে এই তথ্য পেতে ফাংশন ডিজাইন করিঃ

// OKEX V5 obtain total equity
function getTotalEquity_OKEX_V5() {
    var totalEquity = null 
    var ret = exchange.IO("api", "GET", "/api/v5/account/balance", "ccy=USDT")
    if (ret) {
        try {
            totalEquity = parseFloat(ret.data[0].details[0].eq)
        } catch(e) {
            Log("failed to obtain the total equity of the account!")
            return null
        }
    }
    return totalEquity
}

// Binance futures
function getTotalEquity_Binance() {
    var totalEquity = null 
    var ret = exchange.GetAccount()
    if (ret) {
        try {
            totalEquity = parseFloat(ret.Info.totalWalletBalance)
        } catch(e) {
            Log("failed to obtain the total equity of the account!")
            return null
        }
    }
    return totalEquity
}

দ্যtotalEquityতারপর আমরা কল এন্ট্রি হিসাবে একটি ফাংশন লিখুন, এবং বিনিময় নাম অনুযায়ী সংশ্লিষ্ট ফাংশন কল।

function getTotalEquity() {
    var exName = exchange.GetName()
    if (exName == "Futures_OKCoin") {
        return getTotalEquity_OKEX_V5()
    } else if (exName == "Futures_Binance") {
        return getTotalEquity_Binance()
    } else {
        throw "This exchange is not supported"
    }
}

কিছু সহায়ক ফাংশন ডিজাইন করুন

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

  • সমস্ত চলমান অপেক্ষমান অর্ডার বাতিল করুন

    function cancelAll() {
        while (1) {
            var orders = _C(exchange.GetOrders)
            if (orders.length == 0) {
                break
            }
            for (var i = 0 ; i < orders.length ; i++) {
                exchange.CancelOrder(orders[i].Id, orders[i])
                Sleep(500)
            }
            Sleep(500)
        }
    }
    

    এই ফাংশনটি তাদের কাছে পরিচিত যারা প্রায়শই এফএমজেড কৌশল স্কোয়ারে কৌশল উদাহরণ কোডটি পড়ে এবং অনেক কৌশল অনুরূপ নকশা ব্যবহার করেছে। ফাংশনটি হ'ল বর্তমান মুলতুবি অর্ডার তালিকাটি পাওয়া এবং তারপরে একের পর এক বাতিল করা।

  • ফিউচার ফরেক্স ট্রেডিং

    function trade(distance, price, amount) {
        var tradeFunc = null 
        if (distance == "buy") {
            tradeFunc = exchange.Buy
        } else if (distance == "sell") {
            tradeFunc = exchange.Sell
        } else if (distance == "closebuy") {
            tradeFunc = exchange.Sell
        } else {
            tradeFunc = exchange.Buy
        }
        exchange.SetDirection(distance)
        return tradeFunc(price, amount)
    }
    
    function openLong(price, amount) {
        return trade("buy", price, amount)
    }
    
    function openShort(price, amount) {
        return trade("sell", price, amount)
    }
    
    function coverLong(price, amount) {
        return trade("closebuy", price, amount)
    }
    
    function coverShort(price, amount) {
        return trade("closesell", price, amount)
    }
    

    ফিউচার ট্রেডিংয়ের জন্য চারটি দিক রয়েছেঃ ওপেনলং, ওপেনশর্ট, কভারলং এবং কভারশর্ট। সুতরাং আমরা এই ক্রিয়াকলাপগুলির সাথে সামঞ্জস্যপূর্ণ চারটি অর্ডার ফাংশন ডিজাইন করেছি। যদি আপনি কেবল অর্ডারটি বিবেচনা করেন তবে কয়েকটি প্রয়োজনীয় কারণ রয়েছেঃ দিক, অর্ডার মূল্য এবং অর্ডার পরিমাণ। তাই আমরা একটি ফাংশনও ডিজাইন করেছি যার নামঃtradeযখন অপারেশন পরিচালনা করতেdistance, price, amountনির্দিষ্ট করা হয়েছে। ফাংশন কল openLong, openShort, coverLong এবং coverShort শেষ পর্যন্তtradeফাংশন, অর্থাৎ, নির্ধারিত দূরত্ব, মূল্য এবং পরিমাণের উপর ভিত্তি করে একটি ফিউচার এক্সচেঞ্জে একটি অর্ডার স্থাপন করা।

প্রধান কাজ

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

  • প্রাথমিক কাজ আদেশের জন্য, আমাদের দুটি গ্লোবাল ভেরিয়েবল দরকার অর্ডার আইডি রেকর্ড করার জন্য।

    var buyOrderId = null
    var sellOrderId = null
    

    তারপর কৌশল ইন্টারফেস পরামিতি OKEX_V5 সিমুলেটেড বট বিকল্প ব্যবহার করার জন্য ডিজাইন করা হয়, তাই কিছু প্রক্রিয়াকরণ কোডে করা প্রয়োজনঃ

    var exName = exchange.GetName()    
    // Switch OKEX V5 simulated bot
    if (isSimulate && exName == "Futures_OKCoin") {
        exchange.IO("simulate", true)
    }
    

    ইন্টারফেস প্যারামিটারে সমস্ত তথ্য পুনরায় সেট করার একটি বিকল্পও রয়েছে, তাই কোডে সংশ্লিষ্ট প্রক্রিয়াকরণ হওয়া উচিতঃ

    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("reset all data", "#FF0000")
    }
    

    আমরা শুধুমাত্র চিরস্থায়ী চুক্তি চালাচ্ছি, তাই এখানে লেখা স্থির করা হয়েছে এবং শুধুমাত্র চিরস্থায়ী সেট করা হয়েছে।

    exchange.SetContractType("swap")
    

    তারপর আমাদের অর্ডার মূল্য এবং অর্ডার পরিমাণের নির্ভুলতা বিবেচনা করতে হবে। যদি নির্ভুলতা সঠিকভাবে সেট করা না হয় তবে কৌশল গণনা প্রক্রিয়া চলাকালীন নির্ভুলতা হারিয়ে যাবে। যদি ডেটাতে অসংখ্য দশমিক স্থান থাকে তবে এক্সচেঞ্জ ইন্টারফেসের দ্বারা অর্ডারটি প্রত্যাখ্যান করা সহজ।

    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("set precision", pricePrecision, amountPrecision)
    

    ডিজাইন দ্বারা সহজ তথ্য পুনরুদ্ধার

    if (totalEq == -1 && !IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = getTotalEquity()
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "failed to obtain initial equity"
            }
        } else {
            totalEq = recoverTotalEq
        }
    }
    

    যদি আপনি কৌশল চলমান যখন অ্যাকাউন্টের প্রাথমিক মোট ইক্যুইটি নির্দিষ্ট করতে চান, আপনি পরামিতি সেট করতে পারেনtotalEq. যদি এই পরামিতিটি -1 এ সেট করা থাকে তবে কৌশলটি সঞ্চিত মোট ইক্যুইটি ডেটা পড়বে। যদি কোনও সঞ্চিত মোট ইক্যুইটি ডেটা না থাকে তবে চলমান অগ্রগতি কৌশলটির প্রাথমিক মোট ইক্যুইটি হিসাবে বর্তমান পঠিত মোট ইক্যুইটি ব্যবহার করা হয়। এর পরে, মোট ইক্যুইটি বৃদ্ধি লাভের ইঙ্গিত দেয় এবং মোট ইক্যুইটি হ্রাস ক্ষতির ইঙ্গিত দেয়। যদি মোট ইক্যুইটি ডেটা পড়া হয় তবে কৌশলটি এই ডেটা দিয়ে চালানো চালিয়ে যাবে।

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

      while (1) {                                  // The main logic of the strategy is designed as an infinite loop
          var ticker = _C(exchange.GetTicker)      // Read the current market information first, mainly using the latest transaction price
          var pos = _C(exchange.GetPosition)       // Read current position data
          if (pos.length > 1) {                    // Judging the position data, because of the logic of this strategy, it is unlikely that long and short positions will appear at the same time, so if there are long and short positions at the same time, an error will be thrown
              Log(pos)
              throw "Simultaneous long and short positions"                  // Throw an error to stop the strategy
          }
          //Depends on status
          if (pos.length == 0) {                    // Make different operations according to the position status, when there is no position, pos.length == 0 
              // If you have not held a position, count the profit once
              if (!IsVirtual()) {
                  var currTotalEq = getTotalEquity()
                  if (currTotalEq) {
                      LogProfit(currTotalEq - totalEq, "current total equity:", currTotalEq)
                  }
              }
    
              buyOrderId = openLong(ticker.Last - targetProfit, amount)       // Open a buy order for a long position
              sellOrderId = openShort(ticker.Last + targetProfit, amount)     // Open a short sell order
          } else if (pos[0].Type == PD_LONG) {   // For long positions, the position and quantity of pending orders are different
              var n = 1
              var price = ticker.Last
              buyOrderId = openLong(price - targetProfit * n, amount)
              sellOrderId = coverLong(pos[0].Price + targetProfit, pos[0].Amount)
          } else if (pos[0].Type == PD_SHORT) {   // For short positions, the position and quantity of pending orders are different
              var n = 1
              var price = ticker.Last
              buyOrderId = coverShort(pos[0].Price - targetProfit, pos[0].Amount)
              sellOrderId = openShort(price + targetProfit * n, amount)
          }
    
          if (!sellOrderId || !buyOrderId) {   // If one side of the pending order fails, cancel all pending orders and start over
              cancelAll()
              buyOrderId = null 
              sellOrderId = null
              continue
          } 
    
          while (1) {  // The pending order is completed, start monitoring the order
              var isFindBuyId = false 
              var isFindSellId = false
              var orders = _C(exchange.GetOrders)
              for (var i = 0 ; i < orders.length ; i++) {
                  if (buyOrderId == orders[i].Id) {
                      isFindBuyId = true 
                  }
                  if (sellOrderId == orders[i].Id) {
                      isFindSellId = true 
                  }               
              }
              if (!isFindSellId && !isFindBuyId) {    // Detected that both buy and sell orders have been filled
                  cancelAll()
                  break
              } else if (!isFindBuyId) {   // Detected buy order closing
                  Log("buy order closing")
                  cancelAll()
                  break
              } else if (!isFindSellId) {  // Detected sell order closing
                  Log("sell order closing")
                  cancelAll()
                  break
              }
              LogStatus(_D())
              Sleep(3000)
          }
          Sleep(500)
      }
    

পুরো যুক্তি এবং নকশা ব্যাখ্যা করা হয়।

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

১৯ মে'র বাজারের মধ্য দিয়ে কৌশলটি যেতে দাও।

img

img

এটা দেখা যায় যে, মার্টিনগেল কৌশল এখনও কিছু ঝুঁকি আছে।

আসল বট OKEX V5 সিমুলেশন বট দিয়ে চালানো যেতে পারে

কৌশল ঠিকানাঃhttps://www.fmz.com/strategy/294957

কৌশল মূলত শেখার জন্য ব্যবহার করা হয়, এবং বাস্তব অর্থ সতর্কতার সাথে ব্যবহার করা উচিত~!


সম্পর্কিত

আরো