ایف ایم زیڈ کوالٹی پلیٹ فارم کی حکمت عملی کے لئے ترقیاتی سبق

مصنف:گھاس, تخلیق: 2019-08-19 15:54:35, تازہ کاری: 2021-06-08 16:14:57

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

ایکسچینج کے اصل اعداد و شمار تک رسائی حاصل کریں

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

GetRawJSON (()

واپس کرنے کے لئے آخری REST API کی درخواست واپس کیا گیا تھا جس میں اصل مواد (سٹرنگ) ، اپنے آپ کو توسیع کی معلومات کو تجزیہ کرنے کے لئے استعمال کیا جا سکتا ہے.

function main(){
    var account = exchange.GetAccount() //the account doesn't contain all data returned by the request
    var raw = JSON.parse(exchange.GetRawJSON())//raw data returned by GetAccount()
    Log(raw)
}

HTTPQuery ((() عوامی انٹرفیس تک رسائی

عوامی انٹرفیس تک رسائی، Js استعمال کر سکتے ہیںHttpQueryاس کے علاوہ، آپ کو اپنے آپ کو پیٹنٹ کے ساتھ استعمال کر سکتے ہیں.urllibیاrequests

HttpQuery پہلے سے طے شدہ GET طریقہ کار ہے اور مزید خصوصیات کی حمایت کرتا ہے۔ API دستاویزات کو دیکھیں.

var exchangeInfo = JSON.parse(HttpQuery('https://api.binance.com/api/v1/exchangeInfo'))
Log(exchangeInfo)
var ticker = JSON.parse(HttpQuery('https://api.binance.com/api/v1/ticker/24hr'))
var kline = JSON.parse(HttpQuery("https://www.quantinfo.com/API/m/chart/history?symbol=BTC_USD_BITFINEX&resolution=60&from=1525622626&to=1561607596"))

پیتھون میں درخواستوں کی مثالیں

import requests
resp = requests.get('https://www.quantinfo.com/API/m/chart/history?symbol=BTC_USD_BITFINEX&resolution=60&from=1525622626&to=1561607596')
data = resp.json()

IO فنکشن تک رسائی

API-KEY دستخط کی ضرورت ہے کہ انٹرفیس کے لئے، IO تقریب کا استعمال کیا جا سکتا ہے، صارف کو صرف ان پٹ پیرامیٹرز کے بارے میں فکر مند کرنے کی ضرورت ہے، اور مخصوص دستخط کے عمل کو نیچے کی سطح سے کیا جائے گا.

ایف ایم زیڈ پلیٹ فارم فی الحال بٹ ایم ای ایکس اسٹاپ نقصان کی ادائیگی کی حمایت نہیں کرتا ہے۔

  • BitMEX کے API وضاحت کے صفحے کو تلاش کریں:https://www.bitmex.com/api/explorer/
  • BitMEX کو تلاش کرنے کے لئے مندرجہ ذیل پتے پر جائیں:https://www.bitmex.com/api/v1/orderطریقہ کار یہ ہےPOST◄ چونکہ ایف ایم زیڈ نے اندرونی طور پر روٹ ایڈریس کا تعین کیا ہے، اس لیے صرف "/api/v1/order" داخل کرنے کی ضرورت ہے۔
  • متعلقہ پیرامیٹرزsymbol=XBTUSD&side=Buy&orderQty=1&stopPx=4000&ordType=Stop

اس کا مخصوص کوڈ:

var id = exchange.IO("api", "POST", "/api/v1/order", "symbol=XBTUSD&side=Buy&orderQty=1&stopPx=4000&ordType=Stop")
//也可以直接传入对象
var id = exchange.IO("api", "POST", "/api/v1/order", "", JSON.stringify({symbol:"XBTUSD",side:"Buy",orderQty:1,stopPx:4000,ordType:"Stop"}))

آئی او کی مزید مثالیں:https://www.fmz.com/bbs-topic/3683

ویب ساکٹ کا استعمال کریں

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

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

1.websocket连接

عام طور پر ، براہ راست رابطہ قائم کرنا ممکن ہے ، جیسے کہ سکے کی سیکیورٹی ٹکر کو آگے بڑھانا:

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

واپسی کے اعداد و شمار کے لئے کمپریسڈ فارمیٹ ہے، جو کنکشن میں مخصوص ہے، کمپریسڈ کمپریسڈ فارمیٹ کی وضاحت کرتا ہے، موڈ کا مطلب ہے کہ واپسی کے اعداد و شمار کو جوڑنے کی ضرورت ہے، جیسے کنکشن OKEX:

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

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

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")

کچھ تبادلے کی درخواستیں یو آر ایل میں ہیں ، اور کچھ چینلز بھی ہیں جن کے لئے آپ کو اپنے آپ کو سبسکرائب کرنے کی ضرورت ہوتی ہے ، جیسے سکے بیس:

client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

2.加密接口连接

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

    //火币期货推送例子
    var ACCESSKEYID = '你的火币账户的accesskey'
    var apiClient = Dial('wss://api.hbdm.com/notification|compress=gzip&mode=recv')
    var date = new Date(); 
    var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
    var utc_date = new Date(now_utc)
    var Timestamp = utc_date.toISOString().substring(0,19)
    var quest = 'GET\napi.hbdm.com\n/notification\n'+'AccessKeyId='+ACCESSKEYID+'&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=' + encodeURIComponent(Timestamp)
    var signature = exchange.HMAC("sha256", "base64", quest, "{{secretkey} }") //去掉}}之间的多余空格
    auth = {op: "auth",type: "api",AccessKeyId: ACCESSKEYID, SignatureMethod: "HmacSHA256",SignatureVersion: "2", Timestamp: Timestamp, Signature:encodeURI(signature)}
    apiClient.write(JSON.stringify(auth))
    apiClient.write('{"op": "sub","cid": "orders","topic": "orders.btc'}')
    while (true){
        var data = datastream.read()
        if('op' in data && data.op == 'ping'){
            apiClient.write(JSON.stringify({op:'pong', ts:data.ts}))
        }
    }
    
    //币安推送例子,注意需要定时更新listenKey
    var APIKEY = '你的币安accesskey'
    var req = HttpQuery('https://api.binance.com/api/v3/userDataStream',{method: 'POST',data: ''},null,'X-MBX-APIKEY:'+APIKEY);
    var listenKey = JSON.parse(req).listenKey;
    HttpQuery('https://api.binance.com/api/v3/userDataStream', {method:'DELETE',data:'listenKey='+listenKey}, null,'X-MBX-APIKEY:'+APIKEY);
    listenKey = JSON.parse(HttpQuery('https://api.binance.com/api/v3/userDataStream','',null,'X-MBX-APIKEY:'+APIKEY)).listenKey;
    var datastream = Dial("wss://stream.binance.com:9443/ws/"+listenKey+'|reconnect=true',60);
    var update_listenKey_time =  Date.now()/1000;
    while (true){
        if (Date.now()/1000 - update_listenKey_time > 1800){
            update_listenKey_time = Date.now()/1000;
            HttpQuery('https://api.binance.com/api/v3/userDataStream', {method:'PUT',data:'listenKey='+listenKey}, null,'X-MBX-APIKEY:'+APIKEY);
        }
        var data = datastream.read()
    }

    //BitMEX推送例子
    var APIKEY = "你的Bitmex API ID"
    var expires = parseInt(Date.now() / 1000) + 10
    var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey} }")//secretkey在执行时自动替换,不用填写
    var client = Dial("wss://www.bitmex.com/realtime", 60)
    var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})
    var pos = 0
    client.write(auth)
    client.write('{"op": "subscribe", "args": "position"}')
    while (true) {
        bitmexData = client.read()
        if(bitmexData.table == 'position' && pos != parseInt(bitmexData.data[0].currentQty)){
            Log('position change', pos, parseInt(bitmexData.data[0].currentQty), '@')
            pos = parseInt(bitmexData.data[0].currentQty)
        }
    }

3.websocket读取

عام طور پر موت کے دور میں پڑھنا جاری رہتا ہے ، کوڈ مندرجہ ذیل ہے:

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg) //把json字符串解析为可引用的object
// 处理data数据
    }
}

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

read()اگر کوئی پیرامیٹر شامل نہیں کیا جاتا ہے تو ، یہ سب سے پرانا ڈیٹا واپس کرتا ہے ، اور جب کوئی ڈیٹا نہیں ہوتا ہے تو اسے واپس کرنے کے لئے بلاک کرتا ہے۔ اگر آپ تازہ ترین ڈیٹا چاہتے ہیں تو ، آپ اس کا استعمال کرسکتے ہیں۔client.read(-2)یہ فوری طور پر تازہ ترین اعداد و شمار واپس کرتا ہے ، لیکن جب کوئی اور ڈیٹا نہیں ہوتا ہے تو یہ صفر واپس آتا ہے ، جس کا فیصلہ کرنے کی ضرورت ہوتی ہے۔

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

4.连接多个交易所websocket

واضح طور پر اس صورت حال کے لئے ایک آسان طریقہ کار استعمال نہیں کیا جاسکتا ہے ، کیونکہ ایک تبادلے میں انتظار کے پیغامات کو روک دیا جاتا ہے ، اس وقت دوسری تبادلے میں کوئی نیا پیغام نہیں ملتا ہے۔ عام طریقہ کار یہ ہے:

    function main() {
        var binance = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
        var coinbase = Dial("wss://ws-feed.pro.coinbase.com", 60)
        coinbase.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
        while (true) {
            var msgBinance = binance.read(-1) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
            var msgCoinbase = coinbase.read(-1)
            if(msgBinance){
                // 此时币安有数据返回
            }
            if(msgCoinbase){
                // 此时coinbase有数据返回
            }
            Sleep(1) // 可以休眠1ms
        }
    }

5.断线重连问题

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

6.使用websocket的一般程序框架

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

    var tradeTime = Date.now()
    var accountTime = Date.now()
    function trade(data){
        if(Date.now() - tradeTime > 2000){//这里即限制了2s内只交易一次
            tradeTime = Date.now()
            //交易逻辑
        }
    }
    function GetAccount(){
        if(Date.now() - accountTime > 5000){//这里即限制了5s内只获取账户一次
            accountTime = Date.now()
            return exchange.GetAccount()
        }
    }
    function main() {
        var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true");
        while (true) {
            var msg = client.read()
            var data = JSON.parse(msg)
            var account = GetAccount()
            trade(data)
        }
    }

7.总结

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

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

ملٹی تھریڈ بیک وقت

جاوا اسکرپٹ Go فنکشن کے ذریعہ ہم آہنگی کا نفاذ کرسکتا ہے ، اور پیتھون اسی طرح کے ملٹی تھریڈ لائبریری کا استعمال کرسکتا ہے۔

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

var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()

ایک بار درخواست کرنے کے بعد rest API میں تاخیر ہوتی ہے ، فرض کریں کہ یہ 100ms ہے ، پھر دو بار گہرائی حاصل کرنے میں دراصل وقت مختلف ہوتا ہے ، اگر زیادہ سے زیادہ رسائی کی ضرورت ہوتی ہے تو ، تاخیر کا مسئلہ زیادہ نمایاں ہوگا ، جس سے حکمت عملی کے نفاذ پر اثر پڑے گا۔

جاوا اسکرپٹ میں بہت سارے موضوعات نہیں ہیں ، لہذا نیچے والے حصے میں Go فنکشن کو احاطہ کیا گیا ہے جو اس مسئلے کو حل کرتا ہے۔ Go فنکشن ایسے APIs کے لئے استعمال کیا جاسکتا ہے جن کو نیٹ ورک تک رسائی کی ضرورت ہوتی ہے ، جیسے:GetDepth,GetAccountاسی طرح.IOاس کے علاوہ ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے۔exchange.Go("IO", "api", "POST", "/api/v1/contract_batchorder", "orders_data=" + JSON.stringify(orders))لیکن ڈیزائن میکانزم کی وجہ سے ، اس پر عمل درآمد کرنا زیادہ مشکل ہے۔

var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() //调用wait方法等待返回异步获取depth结果 
var depthB = b.wait()

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

function G(t, ctx, f) {
    return {run:function(){
        f(t.wait(1000), ctx)
    }}
}

ہم نے ایک G فنکشن کی وضاحت کی ہے جس میں آپریشن t Go فنکشن ہے جسے چلایا جائے گا، ctx ریکارڈ پروگرام کا سیاق و سباق ہے، f مخصوص تفویض کے لئے ایک فنکشن ہے۔ اور اسی طرح آپ اس فنکشن کا کردار دیکھیں گے۔

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

var Info = [{depth:null, account:null}, {depth:null, account:null}] //加入我们需要获取两个交易所的深度和账户,跟多的信息也可以放入,如订单Id,状态等。
var tasks = [ ] //全局的任务列表

function produce(){ //下发各种并发任务
  //这里省略了任务产生的逻辑,仅为演示
  tasks.push({exchange:0, ret:'depth', param:['GetDepth']})
  tasks.push({exchange:1, ret:'depth', param:['GetDepth']})
  tasks.push({exchange:0, ret:'sellID', param:['Buy', Info[0].depth.Asks[0].Price, 10]})
  tasks.push({exchange:1, ret:'buyID', param:['Sell', Info[1].depth.Bids[0].Price, 10]})
}
function worker(){
    var jobs = []
    for(var i=0;i<tasks.length;i++){
        var task = tasks[i]
        jobs.push(G(exchanges[task.exchange].Go.apply(this, task.param), task, function(v, task) {
                    Info[task.exchange][task.ret] = v //这里的v就是并发Go函数wait()的返回值,可以仔细体会下
                }))
    }
    _.each(jobs, function(t){
            t.run() //在这里并发执行所有任务
        })
    tasks = []
}
function main() {
    while(true){
        produce()         // 发出交易指令
        worker()        // 并发执行
        Sleep(1000)
    }
}

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

Chart فنکشن گراف

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

Chart({…})اندرونی پیرامیٹرز ہائی اسٹاک اور ہائی چارٹس آبجیکٹ ہیں ، صرف ایک اضافی پیرامیٹر شامل کیا گیا ہے۔__isStockیہ فرق کرنے کے لئے کہ آیا یہ ہائی اسٹاک ہے۔ ہائی اسٹاک زیادہ وقت کی ترتیب پر توجہ مرکوز کرتا ہے ، لہذا یہ زیادہ عام ہے۔ ایف ایم زیڈ بنیادی طور پر ہائی چارٹس اور ہائی اسٹاک کے بنیادی ماڈیولز کی حمایت کرتا ہے ، لیکن اضافی ماڈیولز کی حمایت نہیں کرتا ہے۔

ہائی چارٹس کی مخصوص مثالیں:https://www.highcharts.com/demoہائی اسٹاک مثال:https://www.highcharts.com/stock/demo◄ ان مثالوں کا حوالہ دیتے ہوئے کوڈ کو ایف ایم زیڈ میں آسانی سے منتقل کیا جاسکتا ہے۔

آپ add (([series index ((مثلاً 0، ڈیٹا]) کو کال کر کے مخصوص انڈیکس کی سیریز میں ڈیٹا شامل کر سکتے ہیں، reset (مثلاً 0، ڈیٹا)) کو کال کر کے خالی گراف ڈیٹا، reset کو ایک عددی پیرامیٹر کے ساتھ استعمال کر سکتے ہیں، جو مخصوص محفوظ کردہ ٹریک کو ظاہر کرتا ہے۔ متعدد گراف دکھانے کی حمایت کرتا ہے، ترتیب کے وقت صرف عددی سیریز کے پیرامیٹرز کو منتقل کرنے کی ضرورت ہوتی ہے، جیسے: var chart = Chart (([{...}، {...}، {...}) ، مثال کے طور پر گراف ایک دو سیریز ہے، گراف ایک سیریز ہے، گراف تین سیریز ہے، تو جب add کو ایک 01 سیریز ID کو مخصوص کیا جاتا ہے تو یہ گراف 1 کی دو سیریزوں کے اعداد و شمار کی نمائندگی کرتا ہے، جب add کو سیریز ID کو مخصوص کیا جاتا ہے تو سیریز 2 گراف 2 کی پہلی سیریز کے اعداد و شمار کی نمائندگی کرتا ہے، اور سیریز 3 کو مخصوص کیا جاتا ہے جو گراف 3 کی پہلی سیریز کے اعداد و شمار کی نمائندگی کرتا ہے۔

ایک مخصوص مثال:

var chart = { // 这个 chart 在JS 语言中 是对象, 在使用Chart 函数之前我们需要声明一个配置图表的对象变量chart。
    __isStock: true,                                    // 标记是否为一般图表,有兴趣的可以改成 false 运行看看。
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},    // 缩放工具
    title : { text : '差价分析图'},                       // 标题
    rangeSelector: {                                    // 选择范围
        buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
        selected: 0,
        inputEnabled: false
    },
    xAxis: { type: 'datetime'},                         // 坐标轴横轴 即:x轴, 当前设置的类型是 :时间
    yAxis : {                                           // 坐标轴纵轴 即:y轴, 默认数值随数据大小调整。
        title: {text: '差价'},                           // 标题
        opposite: false,                                // 是否启用右边纵轴
    },
    series : [                                          // 数据系列,该属性保存的是 各个 数据系列(线, K线图, 标签等..)
        {name : "line1", id : "线1,buy1Price", data : []},  // 索引为0, data 数组内存放的是该索引系列的 数据
        {name : "line2", id : "线2,lastPrice", dashStyle : 'shortdash', data : []}, // 索引为1,设置了dashStyle : 'shortdash' 即:设置 虚线。
    ]
};
function main(){
    var ObjChart = Chart(chart);  // 调用 Chart 函数,初始化 图表。
    ObjChart.reset();             // 清空
    while(true){
        var nowTime = new Date().getTime();   // 获取本次轮询的 时间戳,  即一个 毫秒 的时间戳。用来确定写入到图表的X轴的位置。
        var ticker = _C(exchange.GetTicker);  // 获取行情数据
        var buy1Price = ticker.Buy;           // 从行情数据的返回值取得 买一价
        var lastPrice = ticker.Last + 1;      // 取得最后成交价,为了2条线不重合在一起 ,我们加1
        ObjChart.add([0, [nowTime, buy1Price]]); // 用时间戳作为X值, 买一价 作为Y值 传入 索引0 的数据序列。
        ObjChart.add([1, [nowTime, lastPrice]]); // 同上。
        Sleep(2000);
    }
}

ایک مثال چارٹ ترتیب کا استعمال کرتے ہوئے:https://www.fmz.com/strategy/136056

دوبارہ جانچ پڑتال

پائیتھون کا مقامی ردعمل

ایک اور صارف نے لکھا:https://github.com/fmzquant/backtest_python

نصب

کمانڈ لائن میں درج ذیل کمانڈ درج کریں:

pip install https://github.com/fmzquant/backtest_python/archive/master.zip

سادہ مثالیں

ریٹرن کی پیرامیٹرز کو پالیسی کوڈ کے آغاز میں ایک تشریح کے طور پر مقرر کیا جاتا ہے، خاص طور پر ایف ایم زیڈ ویب سائٹ کی پالیسی ایڈیٹر انٹرفیس میں ریٹرن کی ترتیبات کو محفوظ کریں.

'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import *
task = VCtx(__doc__) # initialize backtest engine from __doc__
print exchange.GetAccount()
print exchange.GetTicker()
print task.Join() # print backtest result

دوبارہ جانچ پڑتال

چونکہ مکمل حکمت عملی میں موت کی لپیٹ کی ضرورت ہوتی ہے ، لہذا غلطیاں کرنے کی ضرورت ہوتی ہے ، لہذا EOF غیر معمولی کو دوبارہ جانچ پڑتال کے اختتام پر ختم کرنے کے لئے پھینک دیا جائے گا۔

# !/usr/local/bin/python
# -*- coding: UTF-8 -*-

'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD","balance":10000,"stocks":3}]
'''

from fmz import *
import math
import talib

task = VCtx(__doc__) # initialize backtest engine from __doc__

# ------------------------------ 策略部分开始 --------------------------

print exchange.GetAccount()     # 调用一些接口,打印其返回值。
print exchange.GetTicker()

def adjustFloat(v):             # 策略中自定义的函数
    v = math.floor(v * 1000)
    return v / 1000

def onTick():
    Log("onTick")
    # 具体的策略代码


def main():
    InitAccount = GetAccount()
    while True:
        onTick()
        Sleep(1000)

# ------------------------------ 策略部分结束 --------------------------

try:
    main()                     # 回测结束时会 raise EOFError() 抛出异常,来停止回测的循环。所以要对这个异常处理,在检测到抛出的异常后调用 task.Join() 打印回测结果。
except:
    print task.Join()         

اپنی مرضی کے مطابق ریورس ڈیٹا

exchange.SetData ((arr) ، دوبارہ جانچ پڑتال کے اعداد و شمار کے ذرائع کو تبدیل کریں ، اپنی مرضی کے مطابق K لائن ڈیٹا کا استعمال کرتے ہوئے۔ Arr کی شرائط ، ایک عنصر ہے جو K لائن کالم ڈیٹا کے لئے ایک صف ہے ((یعنی: K لائن ڈیٹا صفیں ، جو صرف جاوا اسکرپٹ دوبارہ جانچ پڑتال کی حمایت کرتے ہیں) ۔

arr صفوں میں، انفرادی عناصر کے اعداد و شمار کی شکل:

[
    1530460800,    // time     时间戳
    2841.5795,     // open     开盘价
    2845.6801,     // high     最高价
    2756.815,      // low      最低价
    2775.557,      // close    收盘价
    137035034      // volume   成交量
]

اعداد و شمار کے ذرائع کو شیٹ ٹیمپلیٹ لائبریری میں درآمد کیا جاسکتا ہے۔

function init() {                                                          // 模板中的 init 初始化函数会在加载模板时,首先执行,确保 exchange.SetData(arr) 函数先执行,初始化,设置数据给回测系统。
    var arr = [                                                            // 回测的时候需要使用的K线数据
        [1530460800,2841.5795,2845.6801,2756.815,2775.557,137035034],      // 时间最早的一根 K线柱 数据
        ... ,                                                              // K线数据太长,用 ... 表示,数据此处省略。
        [1542556800,2681.8988,2703.5116,2674.1781,2703.5116,231662827]     // 时间最近的一根 K线柱 数据
    ]
    exchange.SetData(arr)                                                  // 导入上述 自定义的数据
    Log("导入数据成功")
}

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

ایف ایم زیڈ کی حمایت نہ کرنے والے تبادلے کا استعمال کریں

اگر غیر تعاون یافتہ تبادلے اور تعاون یافتہ تبادلے کا API بالکل ایک جیسا ہے ، صرف بیس ایڈریس مختلف ہے ، تو بیس ایڈریس کو تبدیل کرنے کے طریقے سے تعاون کیا جاسکتا ہے۔ خاص طور پر جب آپ تبادلے کو شامل کرتے ہیں تو تعاون یافتہ تبادلے کا انتخاب کریں ، لیکن API-KEY غیر تعاون یافتہ تبادلے کو پُر کریں ، حکمت عملی میں بیس ایڈریس کو IO کے ساتھ تبدیل کریں ، جیسے:

exchange.IO("base", "http://api.huobi.pro") 
//http://api.huobi.pro为为支持交易所API基地址,注意不用添加/api/v3之类的,会自动补全

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

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

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

اس معاہدے کا تعارف:https://www.fmz.com/bbs-topic/1052پیتھون میں ایک عام پروٹوکول لکھنے کا ایک مثال:https://www.fmz.com/strategy/101399

اپنے مقداری پلیٹ فارم کی تخلیق

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

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

ایف ایم زیڈ کے شراکت دار بنیں

نیٹ ایزی کلاؤڈ کلاسوں کو فروغ دینا

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

فروغنیٹ ایزی کلاؤڈ کلاس میں ڈیجیٹل کرنسی کی مقدار میں تجارت کا کورس◎ لاگ ان کریں نیٹ ایزی کلاؤڈ کلاس ، اپنے کورس کا لنک شیئر کریں (لنک کے ساتھ خصوصی کورس آئی ڈی) ، اور دوسرے لوگ اس لنک کے ذریعے رجسٹر ہوں اور کورس خریدیں ، آپ کو 50٪ مجموعی طور پر 10 یوآن کا تقسیم ملے گا۔ ◎ توجہ دیں نیٹ ایزی کلاؤڈ کلاس کی خوبصورتی کی کلاس کو فروغ دیں ◎ ویکیوم عوامی نمبر کو فوری طور پر پیش کریں۔ ◎ خوش آمدید ، دوسروں کو مدعو کریں ، ویکی پیڈیا QQ گروپ میں فروغ دیں ◎

نوکریوں کی واپسی کی مہم کا فروغ

صارفین کو فروغ دینے کے لنک پر کلک کریں، اور چھ ماہ کے اندر اندر رجسٹرڈ بھرنے، ہماری ڈویژن کے مطابق قابل عمل رقم کے مطابق کمیشن کی واپسی کی جائے گی مؤثر حکم. کمیشن کے طور پر پوائنٹس میں واپس آ جائے گا کے طور پر فروغ دینے والے کے اکاؤنٹ میں، صارفین کو تبدیل کر سکتے ہیں کرنے کے لئے ایک تناسب میں 10:1 کے لئے موجد کی مقدار ٹریڈنگ پلیٹ فارم کے اکاؤنٹ کے توازن، یا بعد میں پوائنٹس میں تبدیل کر سکتے ہیں کے لئے موجد کی مقدار کے ارد گرد کی مصنوعات. مخصوص سرگرمیاں لنک:https://www.fmz.com/bbs-topic/3828

ایف ایم زیڈ کوانٹیفیکیشن پلیٹ فارم انٹرپرائز ایڈیشن

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

شہر کا نظام

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

ایکسچینج پروگرام

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


مزید

بی بی ڈبلیو 2009کیا آپ گروپ میں شامل ہوسکتے ہیں؟

مائیکوگراس دیوتا، وائی وو!!!

گھاس`` // ٹوکن فیوچر پش کی مثال var ACCESSKEYID = 'آپ کے ٹوکن اکاؤنٹ کی رسائی کی چابی' var apiClient = Dial (('wss://api.hbdm.com/notification_compress=gzip&mode=recv') var date = new Date ((); ); var now_utc = Date.UTC ((date.getUTCFullYear ((), date.getUTCMonth ((), date.getUTCDate ((), date.getUTCHours ((), date.getUTCMinutes ((), date.getUTCSeconds (())); var utc_date = new Date ((now_utc)) var ٹائم اسٹیمپ = utc_date.toISOString (().substring ((0,19) var quest = 'GET\napi.hbdm.com\n/notification\n'+'AccessKeyId='+ACCESSKEYID+'&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=' + encodeURIComponent(Timestamp var signature = exchange.HMAC (("sha256"، "base64"، quest، "{{secretkey}}") ``

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

گھاسٹپ کی تصدیق پر عمل کریں

جزیلیوبراہ کرم ذیل میں ایف ایم زیڈ ٹیلی گراف گروپ کی تصدیق کی معلومات دیکھیں

شیلٹیلٹھیک ہے

گھاسجی ہاں، بہتر ہے کہ تمام ویب ساکٹ ڈائل کے ساتھ ہیں، زیادہ بدیہی کنٹرول