avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

میں تخلیق کیا: 2021-06-04 10:08:48, تازہ کاری: 2024-12-04 21:14:15
comments   6
hits   2596

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

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

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

یہ مضمون، پچھلے مضمون کی طرح، اب بھی موجد کوانٹائزیشن (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 کے ساتھ 10U اور DOGE_USDT کے ساتھ تجارت کرنا چاہتے ہیں تو کیا ہوگا؟ کچھ طلباء اس سوال کے بارے میں سوچ سکتے ہیں اور پھر کہہ سکتے ہیں: “میں مختلف تجارتی جوڑوں کے پیرامیٹرز کو الگ الگ کنٹرول کرنے کے لیے پیرامیٹرز کے کئی گروپس ترتیب دے سکتا ہوں۔” یہ اب بھی لچکدار طریقے سے ضروریات کو پورا نہیں کر سکتا ہے کہ پیرامیٹرز کے کتنے گروپ بنائے جائیں؟ پیرامیٹرز کے تین سیٹ ہیں اگر میں 4 اقسام کی تجارت کرنا چاہتا ہوں؟ کیا حکمت عملی میں ترمیم کرنا اور پیرامیٹرز شامل کرنا ممکن ہے؟ لہذا، ایک کثیر قسم کی حکمت عملی کے پیرامیٹرز کو ڈیزائن کرتے وقت، ہمیں مختلف پیرامیٹرز کی مانگ پر پوری طرح غور کرنا چاہیے، ایک حل یہ ہے کہ پیرامیٹر کو عام سٹرنگز یا JSON سٹرنگز کے طور پر ڈیزائن کیا جائے۔ مثال کے طور پر:
    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 = []  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据
        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)
    }
    

    کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

    آپ دیکھ سکتے ہیں کہ پیرامیٹرز کو اس طرح پارس کیا گیا ہے، یقیناً آپ 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)
        })
    }
    

    کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

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

    مثال کے طور پر، ہم استعمال کرتے ہوئے ایک جھاڑو فنکشن ڈیزائن کرتے ہیں۔_G()فنکشن، گرڈ ڈیٹا کو محفوظ کریں۔

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

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

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

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

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

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

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

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

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+ لائنوں پر مشتمل ہے، جو ڈیجیٹل کرنسی اسپاٹ ملٹی ورائٹی گرڈ حکمت عملی کو نافذ کرتی ہے۔

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

کریپٹو کرنسی حلقوں میں مقداری تجارت میں نئے بچے، براہ کرم اس پر ایک نظر ڈالیں - آپ کو کریپٹو کرنسی حلقوں میں مقداری تجارت کے قریب لے جانا (VI)

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

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

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

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