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

سکوں کی رقم کی مقدار کے بارے میں بات کرنے کے لئے ایک نیا راستہ ہے - آپ کو سکوں کی رقم کی مقدار کے قریب لے جاتا ہے.

مصنف:ایجاد کاروں کی مقدار - خواب, تخلیق: 2021-06-04 10:08:48, تازہ کاری: 2023-09-21 21:01:06

img

کرنسی کے دائرے کو مقداری بنانے کے لئے تجارت کرنے کے لئے نئے نظر آتے ہیں اور آپ کو کرنسی کے دائرے کو مقداری بنانے کے لئے قریب لے جاتے ہیں.

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

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

اس مضمون میں ، جیسا کہ پچھلے مضمون میں ، یہ بھی موجد کی مقدار پر مبنی ہے۔FMZ.COMاس کے علاوہ ، ہم نے اس کے بارے میں مزید معلومات حاصل کی ہیں۔

  • کثیر اقسام اور یہ کہ میں چاہتا ہوں کہ اس نیٹ ورک کی حکمت عملی نہ صرفBTC_USDTاور کر سکتے ہیں.LTC_USDT/EOS_USDT/DOGE_USDT/ETC_USDT/ETH_USDTاس کے برعکس ، فوری طور پر تجارت کی جوڑی ، اور جوڑ جوڑ جوڑ جوڑ کے ساتھ ساتھ نیٹ کی تجارت کرتے ہیں۔

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

    • 1، سب سے پہلے مختلف اقسام کے بازاروں کو حاصل کرنا۔ یہ پہلا مسئلہ ہے جس کا حل کرنا ہے۔ تبادلے کی API دستاویزات کو دیکھنے کے بعد ، میں نے پایا کہ عام تبادلے مجموعی بازار انٹرفیس پیش کرتے ہیں۔ ٹھیک ہے، تو ہم نے مارکیٹنگ کے انٹرفیس کو جمع کرنے کے لئے اعداد و شمار حاصل کرنے کے لئے استعمال کرتے ہیں.

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

    • 3، حکمت عملی کے پیرامیٹر ڈیزائن؛ متعدد اقسام کے پیرامیٹر ڈیزائن اور ایک قسم کے پیرامیٹر ڈیزائن میں بہت فرق ہے ، کیونکہ اگرچہ متعدد اقسام کے مختلف قسم کے ٹرانزیکشن منطق ایک جیسی ہیں ، لیکن ممکنہ طور پر تجارت کے وقت پیرامیٹر مختلف ہیں۔ مثال کے طور پر ، گرڈ کی حکمت عملی ، ہوسکتا ہے کہ بی ٹی سی_یو ایس ڈی ٹی ٹریڈنگ کا جوڑا ہر تجارت پر 0.01 بی ٹی سی کی توقع کرے ، لیکن DOGE_USDT کرتے وقت اگر یہ پیرامیٹر بھی ہوتا ہے تو یہ واضح طور پر موزوں نہیں ہے ((ٹرانزیکشن 0.01 سکے) ، یقینا you آپ USDT کی رقم پر بھی کام کرسکتے ہیں۔ لیکن پھر بھی آپ کو ایک مسئلہ درپیش ہوگا ، اگر بی ٹی سی_یو ایس ڈی ٹی ٹرانزیکشن 1000UU ، DOGE_USDT ٹرانزیکشن 10U؟ ضرورت ہمیشہ پوری نہیں ہوسکتی ہے۔ اس سوال کے بارے میں سوچنے کے بعد ، آپ کے ساتھی بھی یہ سوال پوچھ سکتے ہیں: کیا میں کئی سیٹ پیرامیٹرز کو الگ الگ ترتیب دے سکتا ہوں تاکہ مختلف ٹرانزیکشن جوڑوں کو الگ الگ کنٹرول کیا جاسکے؟ کیا یہ اب بھی ضروریات کو پورا کرنے کے لئے لچکدار نہیں ہے؟ کیا آپ کے پاس کئی سیٹ پیرامیٹرز ہیں؟ کیا آپ کے پاس تین سیٹ پیرامیٹرز ہیں؟ اگر میں چار قسمیں بنانا چاہتا ہوں تو کیا ہوگا؟ آپ کو اپنی حکمت عملی کو تبدیل کرنا پڑے گا ، پیرامیٹرز کو بڑھانا پڑے گا... لہذا جب آپ کثیر اقسام کی حکمت عملی کے لئے پیرامیٹرز ڈیزائن کرتے ہیں تو ، اس طرح کے مختلف پیرامیٹرز کی ضروریات کو پوری طرح سے مدنظر رکھیں ، اور ایک حل یہ ہے کہ پیرامیٹرز کو عام سٹرنگ یا JSON سٹرنگ کے طور پر ڈیزائن کیا جائے۔ مثال کے طور پر

      ETHUSDT:100:0.002|LTCUSDT:20:0.1
      

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

      function main() {
          var net = []  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据
          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]              // 交易对名称
              var diff = parseFloat(arr[1])    // 网格间距
              var amount = parseFloat(arr[2])  // 网格下单量
              net.push({symbol : symbol, diff : diff, amount : amount})
          })
          Log("网格参数数据:", 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)  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据        
          _.each(net, function(pair) {
              Log("交易对:", pair.symbol, pair)
          })
      }
      

      img

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

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

      var net = null 
      function main() {  // 策略主函数
          // 首先读取储存的net
          net = _G("net")
          
          // ...
      }
      
      function onExit() {
          _G("net", net)
          Log("执行扫尾处理,保存数据", "#FF0000")
      }
      
      function onexit() {    // 平台系统定义的退出扫尾函数,在点击实盘停止时触发执行
          onExit()
      }
      
      function onerror() {   // 平台系统定义的异常退出函数,在程序发生异常时触发执行
          onExit()
      }
      
    • 5، کم سے کم مقدار کی درستگی، کم سے کم قیمت کی درستگی، کم سے کم مقدار، کم سے کم مقدار وغیرہ

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

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

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

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

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

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

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

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()
    
    // 需要实现的接口
    self.interfaceGetTickers = null   // 创建异步获取聚合行情数据线程的函数
    self.interfaceGetAcc = null       // 创建异步获取账户数据线程的函数
    self.interfaceGetPos = null       // 获取持仓
    self.interfaceTrade = null        // 创建并发下单
    self.waitTickers = null           // 等待并发行情数据 
    self.waitAcc = null               // 等待账户并发数据
    self.waitTrade = null             // 等待下单并发数据
    self.calcAmount = null            // 根据交易对精度等数据计算下单量
    self.init = null                  // 初始化工作,获取精度等数据
    
    // 执行配置函数,给对象配置
    funcConfigure(self)

    // 检测configList约定的接口是否都实现
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "接口" + funcName + "未实现"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    // OK期货的实现
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // wexApp的实现
    }
    return dicRegister
}

ٹیمپلیٹ میں مخصوص تبادلے کے لئے لکھنے کے لئے، مثال کے طور پر FMZ کی الیکٹرانک ڈسک WexApp کے ساتھ:

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) {
        // 获取交易对信息
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ",交易对信息查询不到"
        }
        var tradeAmount = null 
        var equalAmount = null  // 记录币数
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // 检查最小交易量
            if (tradeAmount < symbolInfo.min) {
                Log(self.name, " tradeAmount:", tradeAmount, "小于", symbolInfo.min)
                return false 
            }
            equalAmount = tradeAmount / price
        } else {
            tradeAmount = _N(amount, parseFloat(symbolInfo.amountPrecision))
            // 检查最小交易量
            if (tradeAmount < symbolInfo.min / price) {
                Log(self.name, " tradeAmount:", tradeAmount, "小于", symbolInfo.min / price)
                return false 
            }
            equalAmount = tradeAmount
        }
        return [tradeAmount, equalAmount]
    }

    self.init = function init() {   // 自动处理精度等条件的函数
        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()
    
    // 测试获取行情
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // 测试获取账户信息
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // 打印行情数据
                Log(symbol, ticker)
            }
        })

        // 打印资产数据
        var acc = ex.getAcc(symbol, ts)
        Log("acc:", acc.symbol, acc)
    })
}

حکمت عملی کی حقیقت

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

img

img

فی الحال پیسے کھو رہے ہیںT_Tاس کے بعد ، میں نے ایک بار پھر اس کے بارے میں سوچا۔

ویکس ایپ پر کھیلنے کے لیے چند رجسٹریشن کوڈز بھیجیں:

购买地址: https://www.fmz.com/m/s/284507
注册码: 
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

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


متعلقہ

مزید

چھوٹی مچھلیوں کی مقدارشکریہ ڈومین، کوانٹیٹیٹڈ، ڈومین پر روشنی ہے

نو سورجمین وائی وو!

ٹریک حیاتیاتشکریہ

ایجاد کاروں کی مقدار - خوابآپ کی حمایت کا شکریہ!

ایجاد کاروں کی مقدار - خوابآپ کی حمایت کا شکریہ!