ابتدائیوں کے لئے کریپٹوکرنسی کی کوانٹیٹیو ٹریڈنگ - آپ کو کریپٹوکرنسی کی کوانٹیٹیو کے قریب لانا (6)

مصنف:لیدیہ, تخلیق: 2022-08-05 17:13:26, تازہ کاری: 2023-09-21 21:02:17

img

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

اسٹریٹجک ضروریات پر مبنی ڈیزائن سوچ

یہ مضمون، پچھلے ایک کی طرح، اب بھی FMZ Quant (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 کی تجارت کرنا چاہتے ہیں تو کیا ہوگا؟ طلب کبھی پوری نہیں ہوسکتی ہے۔ کوئی ہو سکتا ہے جو اس مسئلے کے بارے میں سوچیں گے اور پھر پوچھیں گے: میں مختلف ٹریڈنگ جوڑوں کے پیرامیٹرز کو الگ الگ کرنے کے لئے پیرامیٹرز کے کئی سیٹ مقرر کر سکتا ہوں. یہ اب بھی ضروریات کو پورا کرنے کے لئے کافی لچکدار نہیں ہے، پیرامیٹرز کے کتنے سیٹ مقرر کرنے کے لئے اچھے ہیں؟ پیرامیٹرز کے تین سیٹ مقرر کیے گئے ہیں، اگر میں 4 اقسام بنانا چاہتا ہوں تو کیا ہوگا؟ کیا مجھے حکمت عملی میں ترمیم کرنے اور پیرامیٹرز کو بڑھانے کی ضرورت ہے؟ لہذا ، ملٹی پرجاتیوں کی حکمت عملی کے پیرامیٹرز کو ڈیزائن کرتے وقت ، اس طرح کے مختلف پیرامیٹرز کی ضروریات پر مکمل طور پر غور کرنا ضروری ہے۔ ایک حل پیرامیٹرز کو عام تاروں یا جے ایس او این تاروں کے طور پر ڈیزائن کرنا ہے۔ مثلاً:
      ETHUSDT:100:0.002|LTCUSDT:20:0.1
      

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

      function main() {
          var net = []  // The recorded grid parameters, use the data when running to the grid trading logic
          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 volume
              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, use the data when running to the grid trading logic        
          _.each(net, function(pair) {
              Log("Trading pairs:", pair.symbol, pair)
          })
      }
      

      img

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

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

      var net = null 
      function main() {  // Strategy main functions
          // Read the stored net first
          net = _G("net")
          
          // ...
      }
      
      function onExit() {
          _G("net", net)
          Log("Perform tail-sweeping processing and save data", "#FF0000")
      }
      
      function onexit() {    // The exit sweep function defined by the platform system, triggered the execution when the real bot is clicked to stop
          onExit()
      }
      
      function onerror() {   // The abnormal exit function defined by the platform system, triggered the execution when the program is abnormal
          onExit()
      }
      
      1. حدیں جیسے آرڈر کی مقدار کی درستگی ، آرڈر کی قیمت کی درستگی ، کم سے کم آرڈر کی مقدار ، اور کم سے کم آرڈر کی رقم وغیرہ۔

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

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

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

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

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

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

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

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()
    
    // Interfaces to be implemented
    self.interfaceGetTickers = null   // Create a function to asynchronously obtain a thread of aggregated market data
    self.interfaceGetAcc = null       // Create a function that asynchronously obtains account data thread
    self.interfaceGetPos = null       // Get a position
    self.interfaceTrade = null        // Create concurrent orders
    self.waitTickers = null           // Waiting for concurrent market data 
    self.waitAcc = null               // Waiting for account concurrent data
    self.waitTrade = null             // Waiting for order concurrent data
    self.calcAmount = null            // Calculate the order volume based on data such as trading pair accuracy
    self.init = null                  // Initialization work, obtaining data such as accuracy
    
    // Execute the configuration function to configure the object
    funcConfigure(self)

    // Check whether the interfaces agreed by configList are implemented
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "interface" + funcName + "unimplemented"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    // Implementation of OK futures
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // 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 trading pair information
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ", the trading pair information cannot be checked"
        }
        var tradeAmount = null 
        var equalAmount = null  // Number of coins recorded
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // Check the minimum trading volume
            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))
            // Check the minimum trading volume
            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() {   // Functions that deal with conditions such as accuracy automatically
        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 get tickers
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // Test to obtain account information
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // print ticker data
                Log(symbol, ticker)
            }
        })

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

حکمت عملی حقیقی بوٹ

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

img

img

یہ فی الحال پیسے کھو رہا ہےT_T، ماخذ کوڈ فی الحال جاری نہیں کیا جائے گا۔

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

Buy address: https://www.fmz.com/m/s/284507
Registration code: 
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

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


متعلقہ

مزید