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

ابتدائی، اسے چیک کریں آپ کو کریپٹوکرنسی کی مقدار کی تجارت میں لے جائیں (6)

مصنف:نینا باداس, تخلیق: 2022-04-21 18:13:03, تازہ کاری: 2022-04-22 12:00:05

ابتدائی، اسے چیک کریں آپ کو کریپٹوکرنسی کی مقدار کی تجارت میں لے جائیں (6)

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

حکمت عملی کی ضرورت پر مبنی ڈیزائن کا سوچنا

اس مضمون میں، پچھلے ایک کی طرح، ہم FMZ کوانٹ ٹریڈنگ پلیٹ فارم پر مبنی ڈیزائن کے بارے میں بحث (FMZ.COM).

  • ایک سے زیادہ علامت ایماندار ہونے کے لئے، میں چاہتا ہوں کہ گرڈ کی حکمت عملی نہ صرفBTC_USDT، بلکہLTC_USDT/EOS_USDT/DOGE_USDT/ETC_USDT/ETH_USDT. بہرحال، اسپاٹ ٹریڈنگ کے جوڑوں کے لئے، ایک ہی وقت میں تجارت کرنا چاہتے ہیں کہ تمام علامتوں کی گرڈ ٹریڈنگ چلائیں.

    جی ہاں، یہ بہت اچھا لگتا ہے کہ متعدد علامتوں کی کمپن مارکیٹ کی قیمتوں کا تعین پر قبضہ.
    اگرچہ یہ شرط سادہ لگتی ہے، لیکن جب آپ ڈیزائن کرنا شروع کرتے ہیں تو یہ مشکل ہو جاتا ہے۔

      1. سب سے پہلے ، متعدد علامتوں کے مارکیٹ کوٹس حاصل کرنا۔ یہ حل کرنے کا پہلا مسئلہ ہے۔ پلیٹ فارم API دستاویزات کو پڑھنے کے بعد ، میں نے پایا کہ پلیٹ فارم عام طور پر مجموعی انٹرفیس فراہم کرتے ہیں۔ ٹھیک ہے ، ہم اعداد و شمار حاصل کرنے کے لئے مجموعی مارکیٹ ڈیٹا انٹرفیس کا استعمال کرتے ہیں۔
      1. دوسرا مسئلہ اکاؤنٹ کے اثاثے ہیں۔ کیونکہ ہم ملٹی علامت کی حکمت عملی انجام دینا چاہتے ہیں ، ہمیں ہر تجارتی جوڑی کے اثاثوں کا الگ الگ انتظام کرنے پر غور کرنا چاہئے ، اور تمام اثاثہ جات کا ڈیٹا حاصل کرنا چاہئے اور اسے ایک بار ریکارڈ کرنا چاہئے۔ ہمیں اکاؤنٹ کے اثاثوں کا ڈیٹا کیوں حاصل کرنا چاہئے؟ اور ہر تجارتی جوڑی کو الگ الگ کیوں ریکارڈ کرنا چاہئے؟

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

      1. حکمت عملی پیرامیٹر ڈیزائن۔ ملٹی علامت کی حکمت عملی کا پیرامیٹر ڈیزائن سنگل علامت کے پیرامیٹر ڈیزائن سے کافی مختلف ہے ، کیونکہ ملٹی علامت کی حکمت عملی میں ہر علامت کا تجارتی منطق بھی ایک جیسا ہے ، یہ ممکن ہے کہ تجارت کے دوران ہر علامت کے پیرامیٹرز مختلف ہوں۔ مثال کے طور پر ، گرڈ حکمت عملی میں ، آپ BTC_USDT ٹریڈنگ جوڑی کرتے وقت ہر بار 0.01 BTC کی تجارت کرنا چاہتے ہیں ، لیکن ظاہر ہے کہ DOGE_USDT کرتے وقت اس پیرامیٹر (0.01 کرنسی کی تجارت) کا استعمال کرنا نامناسب ہے۔ یقینا ، آپ USDT کی مقدار کے لحاظ سے بھی کارروائی کرسکتے ہیں۔ لیکن پھر بھی مسائل پیدا ہوں گے۔ اگر آپ BTC_USDT کے ذریعہ 1000U اور DOGE_USDT کے ذریعہ 10U کی تجارت کرنا چاہتے ہیں تو کیا ہوگا؟ طلب کبھی پوری نہیں ہوسکتی ہے۔ شاید ، کچھ طلباء اس سوال کے بارے میں سوچ سکتے ہیں ، اور تجویز کرتے ہیں کہ ، میں پیرامیٹرز کے مزید گروپس مرتب کرسکتا ہوں ، اور مختلف تجارتی جوڑوں کے پیرامیٹرز کو الگ الگ کنٹرول کرسکتا ہوں جن پر کام کیا جائے۔ کہ اب بھی لچکدار کی ضرورت کو پورا نہیں کر سکتے ہیں، پیرامیٹرز کے کتنے گروپوں کو مقرر کیا جانا چاہئے؟ ہم 3 گروپوں مقرر؛ ہم 4 علامتوں کو چلانے کے لئے چاہتے ہیں تو کیا؟ ہم حکمت عملی کو تبدیل کرنے اور پیرامیٹرز میں اضافہ کرنے کی ضرورت ہے؟ لہذا ، کثیر علامت حکمت عملی کے پیرامیٹرز کو ڈیزائن کرتے وقت تفریق کی ضرورت کے بارے میں مکمل طور پر سوچیں۔ ایک حل پیرامیٹرز کو عام تاروں یا جے ایس او این تاروں میں ڈیزائن کرنا ہے۔
        مثلاً:
      ETHUSDT:100:0.002|LTCUSDT:20:0.1
      

      ہر علامت کے اعداد و شمار کو تقسیم کرنے کے لئے استعمال کیا جاتا ہے، یہ بتاتا ہے کہETHUSDT:100:0.002ٹریڈنگ جوڑی ETH_USDT کو کنٹرول کرتا ہے، اورLTCUSDT:20:0.1ٹریڈنگ جوڑی LTC_USDT کو کنٹرول کرتا ہے۔ وسط میں کوز تقسیم کا کردار ادا کرتا ہے۔ اندرETHUSDT:100:0.002، ETHUSDT ٹریڈنگ جوڑی کی نمائندگی کرتا ہے جسے آپ کام کرنا چاہتے ہیں۔ 100 گرڈ اسپیسنگ ہے۔ 0.002 ہر گرڈ کی ٹریڈ شدہ ETH کی رقم ہے۔ : کا استعمال مذکورہ بالا ڈیٹا کو تقسیم کرنے کے لئے کیا جاتا ہے (یقینا ، پیرامیٹرز کے قواعد حکمت عملی ڈیزائنر کے ذریعہ بنائے جاتے ہیں۔ آپ اپنی ضرورت کی بنیاد پر جو چاہیں ڈیزائن کرسکتے ہیں۔)
      ان تاروں میں پہلے ہی ہر علامت کی پیرامیٹر کی معلومات موجود ہیں جو آپ کو کام کرنے کی ضرورت ہے۔ آپ تاروں کو تجزیہ کرسکتے ہیں ، اور حکمت عملی میں متغیرات کو اقدار تفویض کرسکتے ہیں ، تاکہ ہر علامت کی تجارتی منطق کو کنٹرول کیا جاسکے۔ تجزیہ کیسے کریں؟ آئیے اوپر دی گئی مثال کا استعمال کریں۔

      function main() {
          var net = []  // the recorded grid parameters; when specifically running the grid trading logic, use the data from here 
          var params = "ETHUSDT:100:0.002|LTCUSDT:20:0.1"
          var arrPair = params.split("|")
          _.each(arrPair, function(pair) {
              var arr = pair.split(":")
              var symbol = arr[0]              // trading pair name 
              var diff = parseFloat(arr[1])    // grid spacing 
              var amount = parseFloat(arr[2])  // grid order amount 
              net.push({symbol : symbol, diff : diff, amount : amount})
          })
          Log("Grid parameter data:", net)
      }
      

      img

      دیکھو، ہم نے پیرامیٹرز کو تجزیہ کیا ہے۔ یقینا، آپ براہ راست JSON سٹرنگ استعمال کر سکتے ہیں، جو آسان ہے۔

      function main() {        
          var params = '[{"symbol":"ETHUSDT","diff":100,"amount":0.002},{"symbol":"LTCUSDT","diff":20,"amount":0.1}]'
          var net = JSON.parse(params)  // the recorded grid parameters; when specifically running the grid trading logic, use the data from here         
          _.each(net, function(pair) {
              Log("Trading pair:", pair.symbol, pair)
          })
      }
      

      img

      1. اعداد و شمار کا مستقل رہنا عملی حکمت عملی اور تدریسی حکمت عملی کے درمیان ایک بڑا فرق ہے۔ پچھلے مضمون میں تدریسی حکمت عملی صرف حکمت عملی کی منطق اور حکمت عملی کے ابتدائی ٹیسٹ کے لئے ہے۔ جب کسی بوٹ میں حکمت عملی کو اصل میں چلانے کے بارے میں فکر کرنے کے لئے زیادہ پریشانی ہوتی ہے۔ بوٹ چلانے کے دوران ، بوٹ کو شروع اور روک دیا جاسکتا ہے۔ اس وقت ، بوٹ چلانے کے دوران تمام ڈیٹا ضائع ہوجائے گا۔ تو ، بوٹ کو دوبارہ شروع کرنے کے بعد ، پچھلی حیثیت کو کیسے جاری رکھا جائے؟ یہاں ، جب بوٹ چل رہا ہو تو کلیدی ڈیٹا کو مستقل طور پر محفوظ کرنا ضروری ہے ، تاکہ ڈیٹا پڑھا جاسکے اور بوٹ دوبارہ شروع ہونے پر بوٹ چلتا رہے۔ آپ کو استعمال کر سکتے ہیں_G()FMZ Quant پر فنکشن، یا آپریشن فنکشن استعمال کریںDBExec()ڈیٹا بیس میں، اور آپ کو تفصیلات کے لئے FMZ API دستاویزات کو تلاش کر سکتے ہیں.

      مثال کے طور پر ہم اس فنکشن کا استعمال کرتے ہوئے ایک صفائی کی تقریب ڈیزائن کرنا چاہتے ہیں_G()، گرڈ ڈیٹا کو بچانے کے لئے.

      var net = null 
      function main() {  // strategy main function 
          // first read the stored net 
          net = _G("net")
          
          // ...
      }
      
      function onExit() {
          _G("net", net)
          Log("Execute the clean-up processing, and save the data", "#FF0000")
      }
      
      function onexit() {    // the onexit function defined by the platform system, which will be triggered when clicking the bot to stop 
          onExit()
      }
      
      function onerror() {   // the onerror function defined by the platform system, which will be triggered when the program exception occurs 
          onExit()
      }
      
      1. آرڈر کی مقدار کی درستگی، آرڈر کی قیمت کی درستگی، کم سے کم آرڈر حجم، کم سے کم آرڈر کی مقدار وغیرہ کی حدود

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

      کثیر علامت والے معاملات کے ل the ، ضرورت زیادہ پیچیدہ ہے۔ سنگل علامت کی حکمت عملی کے ل you ، آپ درستگی جیسی معلومات کی وضاحت کرنے کے لئے ایک پیرامیٹر ڈیزائن کرسکتے ہیں۔ تاہم ، جب آپ کثیر علامت کی حکمت عملی ڈیزائن کرتے ہیں تو ، یہ واضح ہے کہ پیرامیٹر میں معلومات لکھنا پیرامیٹر کو بہت تھکا دینے والا بنائے گا۔

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

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

ٹیمپلیٹ لائبریری ڈیزائن کریں

مندرجہ بالا تجزیہ کی بنیاد پر، ہم حکمت عملی، پلیٹ فارم میکانزم اور انٹرفیس کے درمیان جوڑ کو کم کرنے کے لئے ایک ٹیمپلیٹ لائبریری ڈیزائن کرتے ہیں.
ہم اس طرح ٹیمپلیٹ لائبریری ڈیزائن کر سکتے ہیں (کوڈ کا حصہ خارج کر دیا گیا ہے):

function createBaseEx(e, funcConfigure) {
    var self = {}
    self.e = e 
    
    self.funcConfigure = funcConfigure
    self.name = e.GetName()
    self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
    self.label = e.GetLabel()
    
    // the interfaces that need to be implemented 
    self.interfaceGetTickers = null   // create a function that asynchronously obtains the aggregated market quote threads
    self.interfaceGetAcc = null       // create a function that asynchronously obtains the account data threads 
    self.interfaceGetPos = null       // obtain positions 
    self.interfaceTrade = null        // create concurrent orders 
    self.waitTickers = null           // wait for the concurrent market quote data  
    self.waitAcc = null               // wait for the account concurrent data 
    self.waitTrade = null             // wait for order concurrent data
    self.calcAmount = null            // calculate the order amount according to the trading pair precision and other data 
    self.init = null                  // initialization; obtain the precision and other data 
    
    // execute the configuration function, to configure objects 
    funcConfigure(self)

    // detect whether all the interfaces arranged by configList can be implemented 
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "interface" + funcName + "not implemented"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    //  the implementation of OKEX Futures 
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // the implementation of wexApp
    }
    return dicRegister
}

ٹیمپلیٹ میں ، کسی مخصوص کھیل کی شکل کا مقصد کوڈ تحریر کو نافذ کریں۔ مثال کے طور پر ایف ایم زیڈ سمیلیٹڈ بوٹ ویکس ایپ لیں:

function funcConfigure_WexApp(self) {
    var formatSymbol = function(originalSymbol) {
        // BTC_USDT
        var arr = originalSymbol.split("_")
        var baseCurrency = arr[0]
        var quoteCurrency = arr[1]
        return [originalSymbol, baseCurrency, quoteCurrency]
    }

    self.interfaceGetTickers = function interfaceGetTickers() {
        self.routineGetTicker = HttpQuery_Go("https://api.wex.app/api/v1/public/tickers")
    }

    self.waitTickers = function waitTickers() {
        var ret = []
        var arr = JSON.parse(self.routineGetTicker.wait()).data
        _.each(arr, function(ele) {
            ret.push({
                bid1: parseFloat(ele.buy), 
                bid1Vol: parseFloat(-1),
                ask1: parseFloat(ele.sell), 
                ask1Vol: parseFloat(-1),
                symbol: formatSymbol(ele.market)[0],
                type: "Spot", 
                originalSymbol: ele.market
            })
        })
        return ret 
    }

    self.interfaceGetAcc = function interfaceGetAcc(symbol, updateTS) {
        if (self.updateAccsTS != updateTS) {
            self.routineGetAcc = self.e.Go("GetAccount")
        }
    }

    self.waitAcc = function waitAcc(symbol, updateTS) {
        var arr = formatSymbol(symbol)
        var ret = null 
        if (self.updateAccsTS != updateTS) {
            ret = self.routineGetAcc.wait().Info
            self.bufferGetAccRet = ret 
        } else {
            ret = self.bufferGetAccRet
        }
        if (!ret) {
            return null 
        }        
        var acc = {symbol: symbol, Stocks: 0, FrozenStocks: 0, Balance: 0, FrozenBalance: 0, originalInfo: ret}
        _.each(ret.exchange, function(ele) {
            if (ele.currency == arr[1]) {
                // baseCurrency
                acc.Stocks = parseFloat(ele.free)
                acc.FrozenStocks = parseFloat(ele.frozen)
            } else if (ele.currency == arr[2]) {
                // quoteCurrency
                acc.Balance = parseFloat(ele.free)
                acc.FrozenBalance = parseFloat(ele.frozen)
            }
        })
        return acc
    }

    self.interfaceGetPos = function interfaceGetPos(symbol, price, initSpAcc, nowSpAcc) {
        var symbolInfo = self.getSymbolInfo(symbol)
        var sumInitStocks = initSpAcc.Stocks + initSpAcc.FrozenStocks
        var sumNowStocks = nowSpAcc.Stocks + nowSpAcc.FrozenStocks
        var diffStocks = _N(sumNowStocks - sumInitStocks, symbolInfo.amountPrecision)
        if (Math.abs(diffStocks) < symbolInfo.min / price) {
            return []
        }
        return [{symbol: symbol, amount: diffStocks, price: null, originalInfo: {}}]
    }

    self.interfaceTrade = function interfaceTrade(symbol, type, price, amount) {
        var tradeType = ""
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeType = "bid"
        } else {
            tradeType = "ask"
        }
        var params = {
            "market": symbol,
            "side": tradeType,
            "amount": String(amount),
            "price" : String(-1),
            "type" : "market"
        }
        self.routineTrade = self.e.Go("IO", "api", "POST", "/api/v1/private/order", self.encodeParams(params))
    }

    self.waitTrade = function waitTrade() {
        return self.routineTrade.wait()
    }

    self.calcAmount = function calcAmount(symbol, type, price, amount) {
        // obtain the trading pair information 
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ",trading pair information not found"
        }
        var tradeAmount = null 
        var equalAmount = null  // record the symbol amount  
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // detect the minimum trading amount 
            if (tradeAmount < symbolInfo.min) {
                Log(self.name, " tradeAmount:", tradeAmount, "less than", symbolInfo.min)
                return false 
            }
            equalAmount = tradeAmount / price
        } else {
            tradeAmount = _N(amount, parseFloat(symbolInfo.amountPrecision))
            // detect the minimum trading amount 
            if (tradeAmount < symbolInfo.min / price) {
                Log(self.name, " tradeAmount:", tradeAmount, "less than", symbolInfo.min / price)
                return false 
            }
            equalAmount = tradeAmount
        }
        return [tradeAmount, equalAmount]
    }

    self.init = function init() {   // the function that automatically processes conditions like precision, etc.  
        var ret = JSON.parse(HttpQuery("https://api.wex.app/api/v1/public/markets"))
        _.each(ret.data, function(symbolInfo) {
            self.symbolsInfo.push({
                symbol: symbolInfo.pair,
                amountPrecision: parseFloat(symbolInfo.basePrecision),
                pricePrecision: parseFloat(symbolInfo.quotePrecision),
                multiplier: 1,
                min: parseFloat(symbolInfo.minQty),
                originalInfo: symbolInfo
            })
        })        
    }
}

حکمت عملی میں ٹیمپلیٹ کا استعمال کرنا بہت آسان ہوگا:

function main() {
    var fuExName = exchange.GetName()
    var fuConfigureFunc = $.getConfigureFunc()[fuExName]
    var ex = $.createBaseEx(exchange, fuConfigureFunc)

    var arrTestSymbol = ["LTC_USDT", "ETH_USDT", "EOS_USDT"]
    var ts = new Date().getTime()
    
    // test to obtain the market quotes 
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // test to obtain the account information 
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // print the market quote data 
                Log(symbol, ticker)
            }
        })

        // print asset data 
        var acc = ex.getAcc(symbol, ts)
        Log("acc:", acc.symbol, acc)
    })
}

حکمت عملی بوٹ

مندرجہ بالا ٹیمپلیٹ کی بنیاد پر حکمت عملی کو ڈیزائن اور لکھنا بہت آسان ہے۔ پوری حکمت عملی میں 300 سے زیادہ لائنوں کا کوڈ ہے۔ جو کریپٹوکرنسی اسپاٹ ملٹی علامت گرڈ حکمت عملی کو نافذ کرتا ہے۔

img

img

ابھی، اس کے نقصانات ہیںT_T، لہذا ماخذ کوڈ فراہم نہیں کیا جائے گا.

رجسٹریشن کے کئی کوڈز ہیں۔ اگر آپ دلچسپی رکھتے ہیں تو ، آپ ان کو wexApp میں آزما سکتے ہیں:

Purchase Address: https://www.fmz.com/m/s/284507
Registration Code:
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

صرف 200 امریکی ڈالر سے زیادہ تھا ، اور جب بوٹ ابھی شروع ہوا تھا ، تو اسے ایک بڑی یک طرفہ مارکیٹ کا سامنا کرنا پڑا۔ اسے نقصان کو پورا کرنے کے لئے وقت کی ضرورت ہے۔ اسپاٹ گرڈ کی حکمت عملی کا سب سے بڑا فائدہ یہ ہے: گھبراہٹ محسوس کریں! حکمت عملی کا استحکام ٹھیک ہے، اور میں نے 27 مئی کے بعد سے اس میں ترمیم نہیں کی ہے۔ میں عارضی طور پر مستقبل کی گرڈ حکمت عملی کی کوشش کرنے کی ہمت نہیں کرتا۔


مزید