وسائل لوڈ ہو رہے ہیں... لوڈنگ...

کریپٹوکرنسی فیوچر مارٹنگیل ٹائپ اسٹریٹیجی ڈیزائن

مصنف:نینا باداس، تخلیق: 2022-04-12 17:50:07، تازہ کاری: 2022-04-12 18:06:07

کریپٹوکرنسی فیوچر مارٹنگیل ٹائپ اسٹریٹیجی ڈیزائن

حال ہی میں ، ایف ایم زیڈ کے سرکاری گروپ میں مارٹنگیل قسم کی بہت سی حکمت عملیوں پر تبادلہ خیال کیا گیا ہے ، اور ہمارے پلیٹ فارم پر کریپٹوکرنسی معاہدوں کی بہت سی مارٹنگیل حکمت عملیاں موجود نہیں ہیں۔ لہذا ، میں نے اس موقع کو استعمال کرتے ہوئے ایک آسان کریپٹوکرنسی فیوچر مارٹنگیل قسم کی حکمت عملی تیار کی۔ اسے مارٹنگیل قسم کی حکمت عملی کیوں کہا جاتا ہے؟ کیونکہ مارٹنگیل حکمت عملی کا ممکنہ خطرہ دراصل کم نہیں ہے ، لہذا مارٹنگیل حکمت عملی کے مطابق ڈیزائن کرنا ضروری نہیں ہے۔ تاہم ، اس قسم کی حکمت عملی میں ابھی بھی بہت سارے خطرات ہیں ، اور مارٹنگیل قسم کی حکمت عملی کی پیرامیٹر کی ترتیبات خطرات سے قریب سے وابستہ ہیں ، اور خطرات کو نظرانداز نہیں کیا جانا چاہئے۔

اس مضمون میں ، ہم بنیادی طور پر مارٹنگیل قسم کی حکمت عملیوں کے ڈیزائن کی وضاحت اور سیکھتے ہیں۔ حکمت عملی کا خیال خود پہلے ہی بہت واضح ہے ، لہذا ہم ، ایف ایم زیڈ صارفین کی حیثیت سے ، حکمت عملی کے ڈیزائن کے بارے میں مزید غور کرسکتے ہیں۔

کل ایکویٹی حاصل کریں

کل ایکویٹی کا استعمال اکثر کریپٹوکرنسی فیوچر کی حکمت عملی تیار کرتے وقت کیا جاتا ہے ، کیونکہ ہم منافع کا حساب لگانا چاہتے ہیں ، خاص طور پر جب ہمیں تیرتے منافع کا حساب لگانے کی ضرورت ہوتی ہے۔ چونکہ پوزیشنوں کو برقرار رکھنے سے مارجن پر قبضہ ہوتا ہے ، اسی طرح زیر التواء آرڈرز بھی کرتے ہیں۔ اس وقت ، API انٹرفیسexchange.GetAccount()ایف ایم زیڈ پلیٹ فارم کے دستیاب اثاثوں اور زیر التواء آرڈر منجمد اثاثوں کو حاصل کرنے کے لئے کہا جاتا ہے۔ در حقیقت ، زیادہ تر کریپٹوکرنسی فیوچر پلیٹ فارم کل ایکویٹی کے اعداد و شمار فراہم کرتے ہیں ، لیکن یہ پراپرٹی ایف ایم زیڈ پر یکساں طور پر پیک نہیں کی گئی ہے۔

لہذا، ہم علیحدہ علیحدہ پلیٹ فارم کے مطابق اعداد و شمار حاصل کرنے کے لئے افعال ڈیزائن:

// OKEX V5 obtains the 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("Fail to obtain the total equity of the account!")
            return null
        }
    }
    return totalEquity
}

// Binance Ftures 
function getTotalEquity_Binance() {
    var totalEquity = null 
    var ret = exchange.GetAccount()
    if (ret) {
        try {
            totalEquity = parseFloat(ret.Info.totalWalletBalance)
        } catch(e) {
            Log("Fail to obtain the total equity!")
            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 "Do not support the platform"
    }
}

کئی معاون افعال کا ڈیزائن

اہم فنکشن اور اہم منطق کو ڈیزائن کرنے سے پہلے، ہمیں تیاری کے لئے کچھ معاون افعال کو بھی ڈیزائن کرنے کی ضرورت ہے.

  • تمام زیر التواء احکامات منسوخ کریں

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

    فیوچر ٹریڈنگ کے لئے چار سمتیں ہیں: اوپن لانگ پوزیشن (openLong) ، اوپن شارٹ پوزیشن (openShort) ، بند لانگ پوزیشن (coverLong) ، اور بند شارٹ پوزیشن (coverShort) ۔ لہذا ، ہم نے ان کارروائیوں کے مطابق چار آرڈر فنکشن ڈیزائن کیے ہیں۔ اگر آپ صرف آرڈر دینے پر غور کرتے ہیں تو ، پھر کئی ضروری عوامل ہیں: سمت ، آرڈر کی قیمت ، اور آرڈر کی رقم۔

    ہم نے ایک فنکشن بھی ڈیزائن کیا ہے جس کا نام ہے:tradeجب آپریشن کو سنبھالنے کے لئےdirection (distance), order price (price)اورorder amount (amount)کی وضاحت کی گئی ہے۔

    کھلی طویل پوزیشنوں (openLong) ، کھلی مختصر پوزیشنوں (openShort) ، بند طویل پوزیشنوں (coverLong) ، اور بند مختصر پوزیشنوں (coverShort) کے فنکشن کالز بالآخر مکمل کر رہے ہیںtradeفنکشن، یعنی، مخصوص سمت، قیمت اور رقم کے مطابق، فیوچر پلیٹ فارمز میں احکامات کی جگہ.

اہم فنکشن

حکمت عملی کا خیال بہت آسان ہے۔ موجودہ قیمت کو بیس لائن کے طور پر لیں ، اور بیس لائن کے اوپر اور نیچے ایک خاص فاصلے سے بیچنے کے آرڈر (شارٹ) اور خریدنے کے آرڈر (لانگ) لگائیں۔ اگر ایک طرف کے آرڈر پر عمل درآمد کیا جاتا ہے تو ، باقی تمام آرڈرز کو منسوخ کردیں ، اور پھر پوزیشن کی قیمت کے مطابق ایک خاص فاصلے پر نئے قریبی آرڈر لگائے جائیں گے ، اور خریدنے کے آرڈر کو اپ ڈیٹ شدہ موجودہ قیمت پر لگایا جائے گا ، لیکن خریدنے کے آرڈر آرڈر کی رقم کو دوگنا نہیں کریں گے۔

  • ابتدائی کام ہم انتظار کے احکامات چاہتے ہیں کے لئے، ہم آرڈر ID ریکارڈ کرنے کے لئے دو متغیرات کی ضرورت ہے.

    var buyOrderId = null
    var sellOrderId = null
    

    اس کے بعد، OKEX_V5 تخروپن بوٹ کا استعمال کرنے کا اختیار حکمت عملی انٹرفیس پیرامیٹرز میں ڈیزائن کیا گیا ہے، لہذا کچھ پروسیسنگ کوڈ میں کیا جانا چاہئے:

    var exName = exchange.GetName()    
    // switch to 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 percision", pricePrecision, amountPrecision)
    

    ڈیزائن میں سادہ ڈیٹا کی وصولی کی تقریب

    if (totalEq == -1 && !IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = getTotalEquity()
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "Fail to obtain the 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, in which we mainly use the latest trading price
          var pos = _C(exchange.GetPosition)       // read the current position data 
          if (pos.length > 1) {                    // judge the position data; due to the strategy logic, it is unlikely to have long and short positions at the same time, so if there are long and short positions at the same time, an error will be thrown
              Log(pos)
              throw "concurrently with long and short positions"                  // raise an error, and stop the strategy 
          }
          // according to the status 
          if (pos.length == 0) {                    // according to the position status, make different operations; if pos.length == 0, it means currently no position
              // when there is no position yet, calculate the equity 
              if (!IsVirtual()) {
                  var currTotalEq = getTotalEquity()
                  if (currTotalEq) {
                      LogProfit(currTotalEq - totalEq, "Current total equity:", currTotalEq)
                  }
              }
    
              buyOrderId = openLong(ticker.Last - targetProfit, amount)       // pend buy order of open long position 
              sellOrderId = openShort(ticker.Last + targetProfit, amount)     // pend sell order of open short position
          } else if (pos[0].Type == PD_LONG) {   // there are long positions; pending position and amount are 
              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) {   // there are short positions; pending position and amount 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 opending orders of one side fails, cancel all pending orders and try again 
              cancelAll()
              buyOrderId = null 
              sellOrderId = null
              continue
          } 
    
          while (1) {  // finish pending the order, and start to monitor 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) {    // both buy order and sell order are detected to be executed 
                  cancelAll()
                  break
              } else if (!isFindBuyId) {   // a buy order execution is detected 
                  Log("buy order executed")
                  cancelAll()
                  break
              } else if (!isFindSellId) {  // a sell order execution is detected 
                  Log("sell order executed")
                  cancelAll()
                  break
              }
              LogStatus(_D())
              Sleep(3000)
          }
          Sleep(500)
      }
    

اس وقت پوری منطق اور ڈیزائن مکمل طور پر بیان کیا جاتا ہے.

بیک ٹیسٹ

اسٹریٹجی کو 19 مئی 2021 کو مارکیٹ کی قیمتوں کا تعین کرنے دیں۔

img

img

جیسا کہ ہم دیکھ سکتے ہیں، مارٹنگیل حکمت عملی کی طرح حکمت عملی اب بھی کچھ خطرات ہیں.

بوٹ ٹیسٹ OKEX V5 مشابہ بوٹ کو چلانے کے لئے استعمال کر سکتے ہیں

img

حکمت عملی کا پتہ:https://www.fmz.com/strategy/294957

حکمت عملی بنیادی طور پر مطالعہ کے لئے استعمال کیا جاتا ہے، تو ایک حقیقی بوٹ میں حکمت عملی کام نہیں کرتے!


مزید