[TOC] اس سبق کو سیکھنے سے پہلے سیکھنے کی ضرورت ہےایف ایم زیڈ کے تخلیق کاروں کے ذریعہ پیمائش پلیٹ فارم کا استعمالاورایف ایم زیڈ کوانٹومیشن پلیٹ فارم حکمت عملی کے لئے ابتدائی سبقاور پروگرامنگ زبانوں میں مہارت رکھتے ہیں۔ابتدائی سبق میں سب سے زیادہ استعمال ہونے والے افعال کا احاطہ کیا گیا ہے ، لیکن بہت سارے افعال اور خصوصیات ہیں جن کا تعارف نہیں کیا گیا ہے اور نہ ہی اس سبق میں احاطہ کیا جائے گا۔ پلیٹ فارم API دستاویزات کو براؤز کرنے کی ضرورت ہے۔اس سبق کو مکمل کرنے کے بعد، آپ کو زیادہ آزاد اور اپنی مرضی کے مطابق حکمت عملی لکھنے کے قابل ہو جائے گا، FMZ پلیٹ فارم صرف ایک آلہ ہے.
ایف ایم زیڈ پلیٹ فارم تمام معاون تبادلے کے لئے پیکج کیا گیا ہے۔ یکسانیت کو برقرار رکھنے کے لئے ، انفرادی تبادلے کے لئے API کی حمایت مکمل نہیں ہے۔ عام طور پر K لائنوں کی تعداد یا شروع ہونے کا وقت منتقل کیا جاسکتا ہے ، جیسے K لائنوں کا حصول ، جبکہ ایف ایم زیڈ پلیٹ فارم فکسڈ ہے ، کچھ پلیٹ فارم بلک آرڈر کی حمایت کرتے ہیں ، ایف ایم زیڈ اس کی حمایت نہیں کرتا ہے ، وغیرہ۔ لہذا براہ راست تبادلے کے اعداد و شمار تک رسائی کا ایک طریقہ درکار ہے۔عوامی انٹرفیس کے لئے (اگر قابل اطلاق ہو) ، استعمال کیا جا سکتا ہےHttpQueryاس کے علاوہ ، آپ کو اپنے اکاؤنٹ کے بارے میں مزید معلومات حاصل کرنے کے لئے ، آپ کو اپنے اکاؤنٹ کے بارے میں مزید معلومات حاصل کرنے کی ضرورت ہے۔IO。مخصوص ان پٹ پیرامیٹرز کے لئے ، متعلقہ ایکسچینج API دستاویزات کا حوالہ دیں۔ پچھلے سبق میں بتایا گیا ہےInfoفیلڈ نے اصل معلومات واپس کیں ، لیکن اب بھی انٹرفیس کی عدم حمایت کے مسئلے کو حل نہیں کیا جاسکتا ہے۔
آخری 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پیتھون خود ہی متعلقہ پیکجوں کا استعمال کرسکتا ہے ، جیسے: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()
انٹرفیس کے لئے API-KEY دستخط کی ضرورت ہوتی ہے ، IO فنکشن استعمال کیا جاسکتا ہے ، صارف کو صرف پیرامیٹرز کو منتقل کرنے کی فکر کرنے کی ضرورت ہے ، اور دستخط کا عمل نیچے کی طرف سے کیا جائے گا۔
FMZ پلیٹ فارم فی الحال BitMEX اسٹاپ آرڈر کی حمایت نہیں کرتا ہے۔ مندرجہ ذیل اقدامات کے مطابق IO کے ذریعہ اس کا اطلاق کریں۔
https://www.bitmex.com/api/explorer/。https://www.bitmex.com/api/v1/orderطریقہ کارPOST。 چونکہ FMZ نے روٹ ایڈریس کو اندرونی طور پر متعین کیا ہے ، لہذا صرف “/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
بنیادی طور پر تمام ڈیجیٹل کرنسی کے تبادلے میں ویب ساکٹ بھیجنے کے حالات کی حمایت کی جاتی ہے ، کچھ تبادلے میں ویب ساکٹ اکاؤنٹ کی معلومات کو اپ ڈیٹ کرنے کی حمایت کی جاتی ہے۔ باقی API کے مقابلے میں ، ویب ساکٹ عام طور پر کم تاخیر ، اعلی تعدد ، پلیٹ فارم باقی API کی تعدد کی حد سے آزاد ہے۔
اس مضمون میں بنیادی طور پر ایف ایم زیڈ انوینٹرز کوانٹم پلیٹ فارم کے بارے میں بات کی جائے گی ، جس میں جاوا اسکرپٹ کی زبان کا استعمال کیا گیا ہے ، جس میں پلیٹ فارم میں شامل ڈائل فنکشن کا استعمال کیا گیا ہے۔ تفصیلات اور پیرامیٹرز دستاویزات میں ہیں ، ڈائل کو تلاش کریں ، جس میں مختلف افعال کو انجام دینے کے لئے ڈائل فنکشن کو کئی بار اپ ڈیٹ کیا گیا ہے۔ اس مضمون میں اس کا احاطہ کیا جائے گا ، اور ڈبلیو ایس ایس پر مبنی واقعہ سے چلنے والی حکمت عملی ، اور ملٹی ایکسچینج کو مربوط کرنے کے بارے میں بتایا جائے گا۔ ڈائل فنکشن کا استعمال پیتھون میں بھی کیا جاسکتا ہے ، اور اسی طرح کی لائبریری میں بھی استعمال کیا جاسکتا ہے۔
عام طور پر ، براہ راست رابطے دستیاب ہیں ، جیسے کرنسی کے حفاظتی ٹکر کو آگے بڑھانا:
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 زبان کے ذریعہ کیا جاتا ہے ، جس کا پتہ لگایا جاتا ہے کہ کنکشن کاٹ دیا گیا ہے اور دوبارہ جوڑ دیا گیا ہے۔ درخواست کے اعداد و شمار کے مواد کو پہلے سے ہی یو آر ایل میں ، جیسے ابھی بائنان کی مثال میں ، استعمال کرنے کے لئے آسان ہے ، تجویز کردہ ہے۔ آرڈر شدہ پیغامات بھیجنے کی ضرورت کے ل you ، آپ خود ہی دوبارہ جوڑنے کا طریقہ کار برقرار رکھ سکتے ہیں۔
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"]}')
عام طور پر ویب ساکٹ کو پڑھنے کے لئے استعمال کیا جاتا ہے ، لیکن یہ آرڈر ، اکاؤنٹ کی پیش کش کے لئے بھی استعمال کیا جاسکتا ہے۔ اس طرح کے خفیہ کردہ ڈیٹا کی پیش کش میں کبھی کبھی بہت زیادہ تاخیر ہوتی ہے ، لہذا احتیاط سے استعمال کریں۔ چونکہ خفیہ کاری کا طریقہ زیادہ پیچیدہ ہے ، لہذا یہاں کچھ مثالیں دی گئی ہیں۔ نوٹ کریں کہ صرف ایکسیس کی کی ضرورت ہے ، جو پالیسی کے پیرامیٹرز کے طور پر ترتیب دیا جاسکتا ہے ، اگر سیکریٹ کی کی ضرورت ہو تو ، تبادلہ.HMAC () فنکشن کو پوشیدہ طور پر کال کرنے کے لئے ، حفاظت کو یقینی بنائیں۔
//火币期货推送例子
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)
}
}
عام طور پر ڈائی لوپ میں مسلسل پڑھنے کے لئے، کوڈ مندرجہ ذیل ہے:
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数据
}
}
ڈبلیو ایس ایس ڈیٹا کو آگے بڑھانے کی رفتار تیز ہے ، گو کے نچلے حصے میں تمام اعداد و شمار قطار میں محفوظ کردیئے جاتے ہیں ، جیسے پروگرام پڑھتے ہیں ، اور پھر باری باری واپس آتے ہیں۔ جبکہ ریل ڈسک پر آرڈر دینے جیسے آپریشن تاخیر کا باعث بنتے ہیں ، جس سے اعداد و شمار کا جمع ہونا ممکن ہوتا ہے۔ اس طرح کے معاملات کو آگے بڑھانے ، اکاؤنٹ کو آگے بڑھانے ، گہرائی میں پلگ ان کو آگے بڑھانے وغیرہ کے لئے ، ہمیں تاریخی اعداد و شمار کی ضرورت ہوتی ہے ، عملی اعداد و شمار کے لئے ، ہم زیادہ تر معاملات میں صرف تازہ ترین کے بارے میں فکر مند ہیں ، تاریخی اعداد و شمار کی پرواہ نہیں کرتے ہیں۔
read()اگر کوئی پیرامیٹر نہیں ہے تو ، سب سے پرانا ڈیٹا واپس آ جائے گا ، اور اگر کوئی ڈیٹا نہیں ہے تو اسے واپس آنے سے روک دیا جائے گا۔ اگر آپ تازہ ترین ڈیٹا چاہتے ہیں تو ، آپ اسے استعمال کرسکتے ہیںclient.read(-2)اگر آپ کے پاس پہلے سے موجود اعداد و شمار نہیں ہیں تو ، آپ کو دوبارہ حوالہ دینے کی ضرورت ہوگی۔
اس پر منحصر ہے کہ کیشڈ پرانے ڈیٹا کے ساتھ کیا سلوک کیا جاتا ہے ، اور اگر کوئی ڈیٹا بلاک نہیں ہوتا ہے تو ، اس میں مختلف پیرامیٹرز ہوتے ہیں ، جیسا کہ ذیل میں دکھایا گیا ہے ، جو پیچیدہ لگتا ہے ، لیکن پروگرام کو زیادہ لچکدار بنا دیتا ہے۔

اس طرح کے معاملات کے لئے ، یہ واضح ہے کہ اس عمل میں سادہ read () کا استعمال نہیں کیا جاسکتا ہے ، کیونکہ ایک تبادلے میں انتظار کے پیغامات کو مسدود کردیا جائے گا ، اس دوران دوسرا تبادلے کو کوئی نیا پیغام موصول نہیں ہوگا ، یہاں تک کہ اگر اس میں کوئی نیا پیغام موجود ہو۔ عام طریقہ کار یہ ہے کہ:
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
}
}
اس حصے کو سنبھالنے میں کافی پریشانی ہوتی ہے ، کیوں کہ آگے بڑھنے والا ڈیٹا رک سکتا ہے ، یا آگے بڑھنے میں تاخیر بہت زیادہ ہوتی ہے ، یہاں تک کہ اگر دل کی دھڑکن موصول ہوتی ہے تو اس کا مطلب یہ نہیں ہے کہ ڈیٹا ابھی بھی آگے بڑھ رہا ہے۔ آپ ایک واقعہ کا وقفہ ترتیب دے سکتے ہیں ، اگر وقفہ سے زیادہ اپ ڈیٹ موصول نہیں ہوتا ہے تو دوبارہ رابطہ کریں ، اور بہتر ہے کہ کچھ وقت کے بعد باقی کے ساتھ واپس آنے والے نتائج کا موازنہ کریں ، دیکھیں کہ آیا اعداد و شمار درست ہیں۔
چونکہ پش ڈیٹا کا استعمال ہوچکا ہے ، پروگرام کو قدرتی طور پر ایونٹ ڈرائیو کے طور پر بھی لکھا جانا چاہئے ، نوٹ کریں کہ ڈیٹا کو کثرت سے آگے بڑھایا جاتا ہے ، بہت زیادہ درخواستوں کی وجہ سے بند نہیں ہوتا ہے ، عام طور پر یہ لکھا جاسکتا ہے:
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)
}
}
ہر ایک ایکسچینج کے ویب ساکٹ کا رابطہ ، ڈیٹا بھیجنے کا طریقہ ، سبسکرائب کرنے کے قابل مواد ، اور ڈیٹا فارمیٹ مختلف ہوتے ہیں۔ لہذا پلیٹ فارم کو پیکج نہیں کیا جاتا ہے۔ اسے ڈائل فنکشن کے ذریعہ خود سے منسلک کرنے کی ضرورت ہے۔ اس مضمون میں بنیادی طور پر کچھ بنیادی احتیاطی تدابیر کا احاطہ کیا گیا ہے۔ اگر آپ کے پاس سوالات ہیں تو ، پوچھنے کا خیرمقدم کریں۔
پی ایس۔ کچھ ایکسچینجز اگرچہ ویب ساکٹ ٹریڈنگ کی پیش کش نہیں کرتے ہیں ، لیکن اصل میں ویب سائٹ پر جانے کے لئے فارمیٹنگ کا استعمال کرتے ہوئے ، آپ کو یہ پتہ چل جائے گا کہ سبسکرائب کرنے کے لئے ویب ساکٹ پش استعمال کیا جاتا ہے ، اور اگر آپ اس پر تحقیق کریں گے تو آپ کو سبسکرائب فارمیٹ اور ریٹرن فارمیٹ مل جائے گا۔
جاوا اسکرپٹ کو Go فنکشن کے ذریعہ ہم آہنگی کے ساتھ لاگو کیا جاسکتا ہے ، اور پیتھون اس کے مطابق ملٹی تھریڈ لائبریری کا استعمال کرسکتا ہے۔
جب مقدار کی حکمت عملی کو نافذ کیا جاتا ہے تو ، بہت سے معاملات میں ، بیک وقت عملدرآمد تاخیر کو بڑھانے کی کارکردگی کو کم کرسکتا ہے۔ مثال کے طور پر ، ایک ہیجنگ حکمت عملی کے لئے ، دو سکے کی گہرائی حاصل کرنے کی ضرورت ہے۔ ترتیب میں عملدرآمد کا کوڈ مندرجہ ذیل ہے۔
var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()
باقی API کی درخواست کرنے میں تاخیر ہوتی ہے، اس کے بعد دو بار گہرائی حاصل کرنے کا وقت مختلف ہوتا ہے، جس سے حکمت عملی پر عمل درآمد متاثر ہوتا ہے۔
چونکہ جاوا اسکرپٹ میں کوئی کثیر تار نہیں ہے ، لہذا اس مسئلے کو حل کرنے کے لئے 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 دراصل صرف عارضی امداد ہیں۔ اگر ہمارے پاس بہت سارے ہم آہنگ کام ہیں، تو ہمیں a اور depthA، اور b اور depthB کے درمیان خط و کتابت کو ریکارڈ کرنے کی ضرورت ہے جب ہمارے ہم آہنگ کام غیر یقینی ہوتے ہیں، صورت حال مزید پیچیدہ ہو جاتی ہے۔ لہذا، ہم ایک فنکشن کو نافذ کرنا چاہتے ہیں: Go concurrency لکھتے وقت، ایک ہی وقت میں ایک متغیر کو بائنڈ کریں، اور جب کنکرنٹ چل رہا ہے تو نتیجہ خود بخود متغیر کو تفویض کر دیا جاتا ہے، اس طرح انٹرمیڈیٹ متغیرات کو ختم کر کے پروگرام کو مزید بنایا جاتا ہے۔ مختصر مخصوص نفاذ مندرجہ ذیل ہے:
function G(t, ctx, f) {
return {run:function(){
f(t.wait(1000), ctx)
}}
}
ہم ایک G فنکشن کی وضاحت کرتے ہیں، جہاں پیرامیٹر t گو فنکشن ہے جس پر عمل کیا جائے گا، 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({…})اندرونی پیرامیٹرز ہائی اسٹاک اور ہائی چارٹس آبجیکٹ ہیں ، صرف ایک اضافی پیرامیٹر شامل کیا گیا ہے__isStockہائی اسٹاک کے درمیان فرق کرنے کے لئے ہائی اسٹاک کا استعمال کیا جاتا ہے۔ ہائی اسٹاک وقت کی ترتیب کے چارٹ پر زیادہ توجہ دیتا ہے ، لہذا اس کا استعمال زیادہ عام ہے۔ ایف ایم زیڈ بنیادی طور پر ہائی چارٹس اور ہائی اسٹاک کے بنیادی ماڈیول کی حمایت کرتا ہے ، لیکن اضافی ماڈیولز کی حمایت نہیں کرتا ہے۔
ہائی چارٹس کے مخصوص مثال: https://www.highcharts.com/demo ؛ ہائی اسٹاک مثال: https://www.highcharts.com/stock/demo 。 ان مثالوں کا کوڈ ملاحظہ کریں ، جو FMZ پر آسانی سے پورٹ کیا جاسکتا ہے۔
آپ add پر کال کر سکتے ہیں[series انڈیکس ((جیسے 0) ، ڈیٹا]) ایک مخصوص انڈیکس کی سیریز میں ڈیٹا شامل کریں ، ری سیٹ () کال کریں) خالی چارٹ ڈیٹا ، ری سیٹ ایک عددی پیرامیٹر کے ساتھ ہوسکتا ہے ، محفوظ شدہ شرائط کی وضاحت کریں۔ متعدد چارٹ کو ظاہر کرنے کی حمایت کرتا ہے ، ترتیب دینے کے لئے صرف سرنی کے پیرامیٹرز کو منتقل کرنے کی ضرورت ہے جیسے: var chart = Chart ()[{…}، {…}، {…}]) ، مثال کے طور پر گراف ایک میں دو سیریز ہیں، گراف دو میں ایک سیریز ہے، اور گراف تین میں ایک سیریز ہے، تو پھر جب add کو 0 اور 1 سیریز 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
بیک ٹیسٹنگ
چونکہ ایک مکمل حکمت عملی کے لئے ایک مردہ لوپ کی ضرورت ہوتی ہے ، لہذا اس میں غلطیوں کو برداشت کرنے کی ضرورت ہوتی ہے ، جس کے نتیجے میں ای او ایف کے استثناء کو ریٹرننگ کے اختتام پر پروگرام کو ختم کرنے کے لئے پھینک دیا جائے گا۔
# !/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("导入数据成功")
}
نوٹ: یہ ضروری ہے کہ ابتداء کے وقت ، پہلے اپنی مرضی کے اعداد و شمار کو درآمد کریں (یعنی exchange.SetData فنکشن کو کال کریں) ، اپنی مرضی کے مطابق K لائن ڈیٹا کی مدت ریٹرننگ پیج کی ترتیب سے مماثل ہونی چاہئے ، یعنی: اپنی مرضی کے مطابق K لائن ڈیٹا ، ایک K لائن کا وقت 1 منٹ ہے ، پھر ریٹرننگ میں ترتیب دی گئی بنیادی K لائن کی مدت بھی 1 منٹ کی ہوگی۔
اگر غیر معاون ایکسچینج اور معاون ایکسچینج API بالکل ایک جیسے ہیں ، صرف بیس ایڈریس مختلف ہے ، تو اس کی حمایت بیس ایڈریس کو سوئچ کرنے کے ذریعہ کی جاسکتی ہے۔ ایکسچینج کو شامل کرنے کے لئے معاون ایکسچینج کو منتخب کریں ، لیکن API-KEY غیر معاون ایکسچینج کو پُر کریں ، اسٹریٹجی میں IO کے ساتھ بیس ایڈریس کو سوئچ کریں ، جیسے:
exchange.IO("base", "http://api.huobi.pro")
//http://api.huobi.pro为为支持交易所API基地址,注意不用添加/api/v3之类的,会自动补全
تمام ایکسچینج FMZ کی حمایت نہیں کرتے ہیں، لیکن پلیٹ فارم عام معاہدے تک رسائی فراہم کرتا ہے.
آسان الفاظ میں ، جنرل پروٹوکول ایک بیچوان کے مترادف ہے ، جو میزبان کی درخواست کی نمائندگی کرتا ہے اور متعلقہ معیار کے مطابق ڈیٹا واپس کرتا ہے۔ جنرل پروٹوکول کا کوڈ خود کو مکمل کرنے کی ضرورت ہے ، جنرل پروٹوکول کو لکھنا دراصل اس بات کی نمائندگی کرتا ہے کہ آپ انفرادی طور پر تبادلے تک رسائی حاصل کرسکتے ہیں اور حکمت عملی کو مکمل کرسکتے ہیں۔ ایف ایم زیڈ حکام کبھی کبھی ایکسچینج کے جنرل پروٹوکول کا ایک ای ایکس ورژن جاری کرتے ہیں۔ جنرل پروٹوکول کو پیتھون کے ذریعہ بھی مکمل کیا جاسکتا ہے ، اس وقت یہ ایک عام ڈسک کی حیثیت سے میزبان پر چل سکتا ہے۔
معاہدے کے بارے میں: https://www.fmz.com/bbs-topic/1052 پیتھون لکھنے کے لئے عمومی معاہدے کی مثال: https://www.fmz.com/strategy/101399
ایف ایم زیڈ ویب سائٹ بھی API پر مبنی ہے۔ آپ اپنی ایف ایم زیڈ ویب سائٹ API-KEY کے لئے درخواست دے سکتے ہیں جیسے تخلیق ، دوبارہ شروع ، ڈسک کی فہرست حاصل کرنے ، ڈسک کی فہرست حاصل کرنے ، ڈسک کی تاریخ حاصل کرنے جیسے مختلف افعال۔ API دستاویزی خانہ ایف ایم زیڈ پلیٹ فارم توسیع API خانہ۔
ایف ایم زیڈ پلیٹ فارم کی زبردست توسیع پذیری کی وجہ سے ، آپ توسیع API کے مطابق اپنا کوانٹم پلیٹ فارم تشکیل دے سکتے ہیں ، صارفین کو آپ کے پلیٹ فارم پر ریلکس چلانے دیں۔
ڈیجیٹل کرنسی ٹریڈنگ مارکیٹ اپنی خاصیت کی وجہ سے مقدار کے تاجروں کی توجہ کا مرکز بن رہی ہے۔ در حقیقت ، پروگرامنگ ٹریڈنگ پہلے ہی ڈیجیٹل کرنسیوں کا مرکزی دھارے ہے ، اور مارکیٹ میں ہر وقت ہیجنگ مارکیٹنگ جیسی حکمت عملی سرگرم رہتی ہے۔ اور پروگرامنگ کی کمزور بنیاد والے ابتدائی افراد اس میدان میں داخل ہونا چاہتے ہیں ، بہت سارے تبادلے اور متعدد API کا سامنا کرنا پڑتا ہے ، جس میں مشکلات کا وزن بڑھ جاتا ہے۔ تخلیق کار (FMZ) کوانٹومیشن پلیٹ فارم (اصل BotVs ، www.fmz.com) موجودہ وقت میں سب سے بڑا ڈیجیٹل کرنسی کمیونٹی کوانٹومیشن پلیٹ فارم ہے ، جس نے 4 سال سے زیادہ عرصے میں ہزاروں ابتدائی افراد کو کوانٹومیشن ٹریڈنگ کے راستے پر گامزن کرنے میں مدد فراہم کی ہے۔ اس کورس کی قیمت صرف 20 ہے ، جو ابتدائی افراد کے لئے ہے۔
فروغنیٹ ای کلاؤڈ کلاسز ڈیجیٹل کرنسی کی مقدار میں تجارت کا کورس。 نیٹ ایز کلاؤڈ کلاس روم میں لاگ ان کریں ، اپنے کورس کا لنک شیئر کریں (یہ لنک ایک منفرد کورس آئی ڈی کے ساتھ ہے) ، دوسرے لوگ اس لنک کے ذریعے رجسٹر ہوں گے اور کورس خریدیں گے ، آپ کو 50٪ 10 یوآن کا حصہ ملے گا۔
صارفین کو فروغ دینے کے لنک پر کلک کریں ، اور چھ ماہ کے اندر اندر رجسٹرڈ اور ریچارج ، ہماری کمپنی کو ایک درست آرڈر میں موثر رقم کے مطابق کمیشن واپس کیا جائے گا۔ کمیشن کو فروغ دینے والے کے اکاؤنٹ میں انڈینٹ کی شکل میں واپس کیا جائے گا۔ صارفین کو 10: 1 کے تناسب سے موجد کی مقدار میں تبادلہ کرنے کے لئے ٹریڈنگ پلیٹ فارم کے اکاؤنٹ بیلنس میں تبدیل کیا جاسکتا ہے ، اور بعد میں انڈینٹ کی مقدار میں موجد کی مقدار میں تبادلہ کرنے کے لئے استعمال کیا جاسکتا ہے۔
مکمل ایف ایم زیڈ ویب سائٹ کو کاروباری یا ٹیم کے خصوصی سرور پر تعینات کیا جاسکتا ہے ، جس سے مکمل کنٹرول اور فنکشنل تخصیص کی جاسکتی ہے۔ ایف ایم زیڈ ویب سائٹ تقریبا 100،000 صارفین کے استعمال اور جانچ کے بعد ، اعلی دستیابی اور سیکیورٹی تک پہنچ گئی ہے ، جس سے مقدار کی ٹیم اور کاروباری وقت کی لاگت کو بچایا جاسکتا ہے۔ انٹرپرائز ورژن درمیانے درجے کی مقدار کی تجارت کی ٹیموں ، اجناس کے فیوچر سروس فراہم کرنے والوں وغیرہ کے لئے ہے ، مخصوص قیمتوں کا تعین کرنے کے لئے منتظم سے رابطہ کریں۔
ایکسچینج کے لئے مارکیٹ کی لیکویڈیٹی اور فنڈ مینجمنٹ فراہم کرنے کے لئے پیشہ ورانہ نظام، شاید مارکیٹ میں سب سے بہتر مارکیٹنگ کا نظام ہے، جس میں بہت سے ایکسچینج اور ٹیموں کی طرف سے استعمال کیا جاتا ہے.
تخلیق کاروں کی ٹیکنالوجی اور تجارت کا نظام میموری فولڈنگ ٹیکنالوجی کو اپناتا ہے ، آرڈر پروسیسنگ کی رفتار 2 ملین پیسے / سیکنڈ تک ہے ، اس بات کی ضمانت دے سکتا ہے کہ آرڈر پروسیسنگ میں کوئی تاخیر اور کارٹن نہیں ہوگا۔ 2 ملین سے زیادہ آن لائن صارفین کی ایک ہی وقت میں تبادلہ کی ہموار اور مستحکم آپریشن کو برقرار رکھا جاسکتا ہے۔ کثیر پرت ، کثیر کلسٹر سسٹم کا ڈھانچہ نظام کی حفاظت ، استحکام اور آسانی سے توسیع کو یقینی بناتا ہے۔ فنکشنل تعینات ، ورژن اپ ڈیٹ کو بغیر کسی رکاوٹ کے چلایا جاسکتا ہے ، اور ٹرمینل صارف کے آپریٹنگ تجربے کو زیادہ سے زیادہ تحفظ فراہم کیا جاسکتا ہے۔ اس نظام کا تجربہ فی الحال ویکس ایپ ایمولیٹ ایکسچینج میں کیا جاسکتا ہے۔