[TOC]
اس سبق کو سیکھنے سے پہلے، آپ کو مطالعہ کرنے کی ضرورت ہےایف ایم زیڈ کوانٹ پلیٹ فارم کے ساتھ شروع کریںاورایف ایم زیڈ کوانٹ پلیٹ فارم کے لئے بنیادی سبق حکمت عملی لکھنا، اور پروگرامنگ زبانوں میں مہارت حاصل کریں.ابتدائی ٹیوٹوریل میں عام طور پر استعمال ہونے والے افعال کا احاطہ کیا گیا ہے ، لیکن بہت سارے افعال اور خصوصیات ہیں جو متعارف نہیں کی گئیں ، اور وہ اس ٹیوٹوریل میں شامل نہیں ہوں گی۔ آپ کو خود کو سمجھنے کے لئے ایف ایم زیڈ پلیٹ فارم پر API دستاویز کو براؤز کرنے کی ضرورت ہے۔اس سبق کو سیکھنے کے بعد، آپ کو زیادہ مفت اور اپنی مرضی کے مطابق حکمت عملی لکھنے کے قابل ہو جائے گا، اور FMZ مقدار پلیٹ فارم صرف ایک آلہ ہے.
ایف ایم زیڈ کوانٹ پلیٹ فارم تمام معاون پلیٹ فارمز کو شامل کرتا ہے۔ یکسانیت کو برقرار رکھنے کے ل our ، ہمارے ایک پلیٹ فارم API کی حمایت ابھی تک مکمل نہیں ہے۔ مثال کے طور پر ، گیٹ ریکارڈز 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)
}
عوامی انٹرفیس تک رسائی حاصل کرنے کے لئے، 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()
انٹرفیس کے لئے جو API-KEY دستخط کی ضرورت ہوتی ہے ، IO فنکشن استعمال کیا جاسکتا ہے ، اور صارفین کو صرف آنے والے پیرامیٹرز کی پرواہ کرنے کی ضرورت ہے ، اور مخصوص دستخط کا عمل انڈر لیئر کے ذریعہ مکمل کیا جائے گا۔
ایف ایم زیڈ پلیٹ فارم فی الحال بٹ ایم ای ایکس اسٹاپ نقصان کے احکامات کی حمایت نہیں کرتا ہے ، جو مندرجہ ذیل اقدامات کے مطابق ، آئی او کے ذریعے نافذ کیا جاسکتا ہے۔
https://www.bitmex.com/api/explorer/
;https://www.bitmex.com/api/v1/order
، کے طریقہ کار کے ساتھPOST
; کے لئے FMZ پہلے ہی اندرونی طور پر بیس ایڈریس کی وضاحت کی ہے، آپ کو صرف میں منتقل کرنے کی ضرورت ہے 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")
// You can also pass in the object
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")
اگر واپس آنے والے ڈیٹا کو کمپریسڈ فارمیٹ میں کیا گیا ہے تو ، کنکشن کرتے وقت وضاحت کی جانی چاہئے۔
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
ڈائل فنکشن دوبارہ رابطہ قائم کرنے کی حمایت کرتا ہے ، جو بنیادی گولنگ کے ذریعہ کیا جاتا ہے۔ اگر پتہ چلا ہوا کنکشن ٹوٹ جاتا ہے تو ، یہ دوبارہ رابطہ قائم ہوجائے گا۔ درخواست کے اعداد و شمار کے لئے جو پہلے ہی یو آر ایل میں موجود ہیں ، جیسے ابھی بائننس کی مثال ، یہ بہت آسان اور تجویز کردہ ہے۔ ان لوگوں کے لئے جن کو خریداری کے پیغامات بھیجنے کی ضرورت ہے ، وہ خود ہی دوبارہ رابطہ قائم کرسکتے ہیں۔
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() فنکشن کے ذریعہ ضمنی طور پر بلایا جاسکتا ہے۔
//Push example of Huobi Futures
var ACCESSKEYID = 'accesskey of your Huobi account'
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} }") // Remove the extra blank spaces between }}
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}))
}
}
// Push example of Binance; pay attention that listenKey needs to be updated regularly
var APIKEY = 'accesskey of your Binance account'
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()
}
// push example of BitMEX
var APIKEY = "your Bitmex API ID"
var expires = parseInt(Date.now() / 1000) + 10
var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey} }")// secretkey is automatically replaced during execution, so no need to fill in
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) // Parse json strings into quotable objects
// Process data
}
}
ڈبلیو ایس ایس ڈیٹا پش کی رفتار بہت تیز ہے۔ گولنگ کی انڈر لیئر قطار میں موجود تمام ڈیٹا کو کیش کرے گی ، اور جب پروگرام کالز پڑھتا ہے تو ، اعداد و شمار باری باری واپس کردیئے جائیں گے۔ تاہم ، بوٹ پر آرڈر دینے جیسے آپریشنز تاخیر کا سبب بنیں گے ، جس کے نتیجے میں ڈیٹا جمع ہوسکتا ہے۔ تجارتی عمل درآمد پش ، اکاؤنٹ پش ، اور گہرائی میں مداخلت پش جیسی معلومات کے ل we ، ہمیں تاریخ کے اعداد و شمار کی ضرورت ہے۔ کوٹ مارکیٹ کے اعداد و شمار کے ل most ، زیادہ تر معاملات میں ، ہم صرف تازہ ترین اعداد و شمار کی پرواہ کرتے ہیں ، تاریخ کے اعداد و شمار کی نہیں۔
اگرread()
کوئی پیرامیٹرز کا اضافہ کرتا ہے، یہ سب سے پرانے ڈیٹا واپس آئے گا، اور جب تک کوئی ڈیٹا نہیں ہے واپسی تک بلاک. اگر آپ تازہ ترین ڈیٹا چاہتے ہیں، آپ استعمال کر سکتے ہیںclient.read(-2)
فوری طور پر تازہ ترین ڈیٹا واپس کرنے کے لئے، لیکن جب کوئی ڈیٹا نہیں ہے، تو یہ null واپس آئے گا، جو حوالہ سے پہلے فیصلہ کرنے کی ضرورت ہے.
پرانے کیچڈ ڈیٹا سے نمٹنے کے طریقہ پر منحصر ہے اور جب کوئی ڈیٹا نہیں ہوتا ہے تو اسے مسدود کردیا جاتا ہے ،
اس معاملے میں یہ واضح ہے کہ صرف
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) // Parameter -1 represents no data and return null immediately; it will not occur that being blocked before there is data to be returned
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// at this time, Binance has data to return
}
if(msgCoinbase){
// at this time, coinbase has data to return
}
Sleep(1) // Sleep for 1 millisecond
}
}
پروسیسنگ کا یہ حصہ زیادہ پریشان کن ہے ، کیونکہ پش ڈیٹا میں خلل پڑ سکتا ہے ، یا پش تاخیر انتہائی لمبی ہے۔ یہاں تک کہ اگر دل کی دھڑکن موصول ہوسکتی ہے تو ، اس کا مطلب یہ نہیں ہے کہ اعداد و شمار کو ابھی بھی دھکا دیا جارہا ہے۔ آپ ایونٹ کا وقفہ طے کرسکتے ہیں۔ اگر وقفے کے بعد کوئی تازہ کاری موصول نہیں ہوتی ہے تو ، دوبارہ رابطہ قائم کریں۔ یہ دیکھنے کے لئے کہ آیا اعداد و شمار درست ہیں ، وقت کی ایک مدت کے بعد
کے لئے دھکا ڈیٹا استعمال کیا گیا ہے، پروگرام قدرتی طور پر واقعہ ٹرگر کے طور پر لکھا جائے گا؛ دھکا ڈیٹا کی تعدد پر توجہ دینا، کیونکہ اعلی تعدد کی درخواستوں کو بلاک کیا جائے گا کی قیادت کریں گے؛ عام طور پر آپ لکھ سکتے ہیں:
var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
if(Date.now() - tradeTime > 2000){//Here it limits only one trade in 2 seconds
tradeTime = Date.now()
// Trading logic
}
}
function GetAccount(){
if(Date.now() - accountTime > 5000){//Here it limits GetAccount only once in 5 seconds
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)
}
}
ہر پلیٹ فارم پر کنکشن کا طریقہ ، ڈیٹا ٹرانسمیشن کا طریقہ ، سبسکرائب کردہ مواد اور ویب ساکٹ کا ڈیٹا فارمیٹ اکثر مختلف ہوتا ہے ، لہذا پلیٹ فارم اسے انکیپسول نہیں کرتا ہے اور خود ہی مربوط ہونے کے لئے ڈائل فنکشن کا استعمال کرنے کی ضرورت ہوتی ہے۔ اس مضمون میں بنیادی طور پر کچھ بنیادی احتیاطی تدابیر کا احاطہ کیا گیا ہے۔ اگر آپ کے پاس مزید سوالات ہیں تو ، براہ کرم بلا جھجھک پوچھیں۔
پی ایس: اگرچہ کچھ پلیٹ فارم ویب ساکٹ اقتباسات فراہم نہیں کرتے ہیں ، در حقیقت ، جب آپ ڈیبگنگ فنکشن استعمال کرنے کے لئے ویب سائٹ پر لاگ ان کرتے ہیں تو ، آپ کو معلوم ہوگا کہ وہ سب ویب ساکٹ پش کا استعمال کررہے ہیں۔ تحقیق کے بعد ، آپ کو معلوم ہوگا کہ کچھ سبسکرپشن فارمیٹس اور واپسی کی شکلیں خفیہ شکل میں دکھائی دیتی ہیں ، جو بیس 64 کے ساتھ ڈیکوڈنگ اور ڈیکمپریسنگ کرکے دیکھی جاسکتی ہیں۔
جاوا اسکرپٹ گو فنکشن کے ذریعہ ہم آہنگی کا احساس کرسکتا ہے ، اور پائتھون اسی ملٹی تھریڈ لائبریری کا استعمال کرسکتا ہے۔
مقداری حکمت عملیوں کے احساس کے دوران ، بیک وقت عملدرآمد وقت کی تاخیر کو کم کرسکتا ہے اور کارکردگی کو بہتر بناسکتا ہے۔ مثال کے طور پر ہیجنگ حکمت عملی بوٹ کو لے لو۔ اسے دو سکے کی گہرائی حاصل کرنے کی ضرورت ہے ، اور ترتیب میں عملدرآمد کا کوڈ اس طرح دکھایا گیا ہے:
var depthA = exchanges[0].GetDepth()
var depthB = exchanges[1].GetDepth()
جب کسی درخواست کے آرام API میں تاخیر ہوتی ہے ، مثال کے طور پر تاخیر کا وقت 100 ملی سیکنڈ ہوتا ہے ، پھر گہرائی کو دو بار حاصل کرنے کا وقت دراصل مختلف ہوتا ہے۔ اگر مزید رسائی کی ضرورت ہو تو ، تاخیر کے مسائل زیادہ واضح ہوں گے ، جو حکمت عملی کے نفاذ کو متاثر کریں گے۔
چونکہ جاوا اسکرپٹ میں ملٹی تھریڈ نہیں ہوتا ہے ، لہذا اس مسئلے کو حل کرنے کے لئے انڈر لیئر میں گو فنکشن شامل ہوتا ہے۔ گو فنکشن ان API کے لئے استعمال کیا جاسکتا ہے جن کے لئے نیٹ ورک تک رسائی کی ضرورت ہوتی ہے ، جیسےGetDepth
, GetAccount
اور اسی طرح.IO
بھی حمایت کی جاتی ہے، جیسے:exchange.Go("IO", "api", "POST", "/api/v1/contract_batchorder", "orders_data=" + JSON.stringify(orders))
، لیکن ڈیزائن میکانزم کی وجہ سے، یہ لاگو کرنے کے لئے زیادہ tedious ہے.
var a = exchanges[0].Go("GetDepth")
var b = exchanges[1].Go("GetDepth")
var depthA = a.wait() // Call "wait" method to wait for the return of the asynchronous GetDepth result
var depthB = b.wait()
زیادہ تر آسان معاملات میں ، اس طرح حکمت عملی لکھنا ٹھیک ہے۔ لیکن نوٹ کریں کہ ہر بار جب حکمت عملی لوپ ہوتی ہے تو اس عمل کو دہرا دیا جاتا ہے ، اور انٹرمیڈیٹ متغیرات a اور b دراصل صرف عارضی طور پر معاون ہوتے ہیں۔ اگر ہمارے پاس بہت سارے ہم آہنگ کام ہیں تو ، ہمیں اضافی طور پر a اور depthA ، b اور depthB کے مابین مطابقت کو ریکارڈ کرنے کی ضرورت ہوتی ہے۔ جب ہمارے ہم آہنگ کام غیر یقینی ہوتے ہیں تو ، صورتحال زیادہ پیچیدہ ہوتی ہے۔ لہذا ، ہم امید کرتے ہیں کہ ایک فنکشن کا احساس کریں: جب Go فنکشن کو بیک وقت لکھتے ہیں تو ، متغیر کو بیک وقت پابند کریں؛ جب ہم آہنگ چلنے والا نتیجہ واپس آتا ہے تو ، نتیجہ کی قیمت خود بخود متغیر کو تفویض کردی جاتی ہے ، اس طرح انٹرمیڈیٹ متغیرات کی ضرورت کو ختم کرتے ہوئے اور پروگرام کو زیادہ جامع بناتے ہیں۔ مخصوص نفاذ مندرجہ ذیل ہے:
function G(t, ctx, f) {
return {run:function(){
f(t.wait(1000), ctx)
}}
}
ہم نے ایک G فنکشن کی وضاحت کی، جہاں پیرامیٹر
اس وقت ، مجموعی طور پر پروگرام فریم ورک کو ایک ماڈل کے طور پر لکھا جاسکتا ہے ، جو
var Info = [{depth:null, account:null}, {depth:null, account:null}] // If we need to obtain the depth and account of the two platforms, more information can also be put in, such as order ID and status, etc.
var tasks = [ ] // Global task list
function produce(){ // Issue all kinds of concurrent tasks
// Here the task producing logic has been omitted, only for demo
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 // Here "v" is the return value of the concurrent Go function "wait()", and you can think about it
}))
}
_.each(jobs, function(t){
t.run() // Here all tasks are executed concurrently
})
tasks = []
}
function main() {
while(true){
produce() // Give trading command
worker() // Concurrently execute
Sleep(1000)
}
}
ایسا لگتا ہے کہ مذکورہ بالا کارروائیوں میں صرف ایک آسان فنکشن کو نافذ کیا گیا ہے۔ در حقیقت ، اس نے کوڈ کی پیچیدگی کو بہت آسان بنا دیا ہے۔ ہمیں صرف اس بات کی پرواہ کرنے کی ضرورت ہے کہ پروگرام کو کون سے کاموں کو پیدا کرنے کی ضرورت ہے ، اور
ابتدائی ٹیوٹوریل میں ، ڈرائنگ کلاس لائبریری کی سفارش ڈرائنگ کے تعارف میں کی جاتی ہے ، جو زیادہ تر معاملات میں ضروریات کو پورا کرسکتی ہے۔ اگر آپ کو مزید تخصیص کی ضرورت ہو تو ، آپ براہ راست
کے اندرونی پیرامیٹرزChart({…})
ہائی اسٹاک اور ہائی چارٹس کی اشیاء ہیں، لیکن ایک اضافی پیرامیٹر__isStock
ایف ایم زیڈ کو بنیادی طور پر ہائی چارٹس اور ہائی اسٹاک کے بنیادی ماڈیولز کی حمایت کرتا ہے ، لیکن اضافی ماڈیولز کی حمایت نہیں کرتا ہے۔
ہائی چارٹس کی مخصوص مثال:https://www.highcharts.com/demo؛ ہائی اسٹاک مثال:https://www.highcharts.com/stock/demo. آپ ان مثالوں میں کوڈز کا حوالہ دے سکتے ہیں، اور FMZ کرنے کے لئے ان کو منتقلی آسان.
آپ مخصوص انڈیکس کے ساتھ سیریز میں ڈیٹا شامل کرنے کے لئے شامل ([سیریز انڈیکس ((جیسے 0 ، ڈیٹا]) کو کال کرسکتے ہیں۔ چارٹ کے اعداد و شمار کو صاف کرنے کے لئے ری سیٹ کو کال کریں۔ ری سیٹ ایک نمبر پیرامیٹر لے سکتا ہے اور بچانے کی رقم کی وضاحت کرسکتا ہے۔ متعدد چارٹ ڈسپلے کی حمایت کی جاتی ہے ، جس میں صرف ترتیب کے دوران صف کے پیرامیٹرز میں گزرنے کی ضرورت ہوتی ہے ، جیسے: var چارٹ = چارٹ (([{...} ، {...} ، {...}) ۔ مثال کے طور پر ، اگر چارٹ 1 میں دو سیریز ہیں تو ، چارٹ 2 میں ایک سیریز ہے ، اور چارٹ 3 میں ایک سیریز ہے ، جب کال کریں شامل کریں ، سیریز ID 0 اور 1 کو اپ ڈیٹ کردہ چارٹ 1 میں دونوں سیریز کے ڈیٹا کو الگ الگ نمائندگی کرنے کے لئے مخصوص کیا جاتا ہے؛ سیریز ID 2 کو چارٹ 2 میں پہلی سیریز کے اعداد و شمار کی نمائندگی کرنے کے لئے مخصوص کیا جاتا ہے؛ سیریز ID 3 کو چارٹ 3 میں پہلی سیریز کے اعداد و شمار کی نمائندگی کرنے کے لئے مخصوص کیا جاتا ہے۔
ایک مخصوص مثال:
var chart = { // This "chart" in JS is an object; before using the Chart function, we need to declare the object variable of a configured chart "chart"
__isStock: true, // Mark whether it is a general chart; you can change it to false and try to operate it, if you are interested
tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'}, // Zoom tool
title : { text : 'spread chart'}, // Theme
rangeSelector: { // Choose the range
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'}, // Horizontal axis, namely X axis; currently set type: time
yAxis : { // Vertical axis, namely Y axis; the default changes according to the data
title: {text: 'spread'}, // Theme
opposite: false, // whether to enable the vertical axis on the right
},
series : [ // Data series; the attribute saves all kinds of data series (lines, K-lines, labels, etc.)
{name : "line1", id : "line1,buy1Price", data : []}, // The index is 0; the data stroed in the data array is the data of the index series
{name : "line2", id : "line2,lastPrice", dashStyle : 'shortdash', data : []}, // The index is 1; set dashStyle: 'shortdash', namely: set dashed line
]
};
function main(){
var ObjChart = Chart(chart); // Call the Chart function, and initialize the chart
ObjChart.reset(); // Empty
while(true){
var nowTime = new Date().getTime(); // Obtain the timestamp of this polling, namely a millisecond tiemstamp, to ensure the location of writing to the X axis in the chart
var ticker = _C(exchange.GetTicker); // Obtain the market quotes data
var buy1Price = ticker.Buy; // Get buy one price from the return value of the market quotes
var lastPrice = ticker.Last + 1; // Get the final executed price, and we add 1 to split the 2 lines
ObjChart.add([0, [nowTime, buy1Price]]); // Use the timestamp as the value of X, and buy one price as the value of Y; pass in the data series of index 0
ObjChart.add([1, [nowTime, lastPrice]]); // Same as above.
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__
# ------------------------------ Start of the Strategy --------------------------
print exchange.GetAccount() # Call some interfaces, and print their return values
print exchange.GetTicker()
def adjustFloat(v): # the custom functions in the strategy
v = math.floor(v * 1000)
return v / 1000
def onTick():
Log("onTick")
# Specific strategy code
def main():
InitAccount = GetAccount()
while True:
onTick()
Sleep(1000)
# ------------------------------ End of the Strategy --------------------------
try:
main() # The end of the backtest will raise EOFError() to stop stop the backtest loop. Therefore, we should handle with the error, and call task.Join() to print the backtest result, after the error is detected
except:
print task.Join()
exchange.SetData(arr) بیک ٹیسٹ ڈیٹا ماخذ کو سوئچ کرتا ہے اور اپنی مرضی کے مطابق K- لائن ڈیٹا استعمال کرتا ہے۔ پیرامیٹر
arr کے صف میں، ایک عنصر کا ڈیٹا فارمیٹ:
[
1530460800, // time Timestamp
2841.5795, // open Open Price
2845.6801, // high Highest Price
2756.815, // low Lowest Price
2775.557, // close Close Price
137035034 // volume Executed Volume
]
اعداد و شمار کا ماخذ
function init() { // The init function in the template will be executed first when the template is loaded; ensure the exchange.SetData(arr) function is executed first, initialized, and set the data to the backtest system
var arr = [ // The K-line data to be used during backtest
[1530460800,2841.5795,2845.6801,2756.815,2775.557,137035034], // The data of the earliest K-line bar
... , // If the K-line data is too long, use "..." to represent the omitted data here
[1542556800,2681.8988,2703.5116,2674.1781,2703.5116,231662827] // The data of the latest K-line bar
]
exchange.SetData(arr) // Import the custom data mentioned above
Log("Import data successfully")
}
نوٹ: پہلے اپنی مرضی کے مطابق ڈیٹا کو درآمد کرنا یقینی بنائیں (یعنی ، ڈیٹا کو ترتیب دینے کے لئے تبادلہ.سیٹ ڈیٹا فنکشن کو کال کریں۔) ابتدائیہ کے دوران۔ کسٹم K- لائن ڈیٹا کی مدت بیک ٹسٹ پیج پر سیٹ کردہ انڈر لیئر K- لائن مدت کے مطابق ہونی چاہئے ، یعنی: کسٹم K- لائن ڈیٹا ؛ ایک K- لائن کا وقت 1 منٹ ہے ، لہذا بیک ٹسٹ میں سیٹ کردہ انڈر لیئر K- لائن کا دورانیہ بھی 1 منٹ پر مقرر کیا جانا چاہئے۔
اگر کسی غیر تعاون یافتہ پلیٹ فارم کی API بنیادی ایڈریس کے علاوہ کسی تعاون یافتہ پلیٹ فارم کی بالکل ایک جیسی ہے تو ، غیر تعاون یافتہ پلیٹ فارم کو بنیادی ایڈریس کو سوئچ کرکے سپورٹ کیا جاسکتا ہے۔ مخصوص ہونے کے لئے ، پلیٹ فارم شامل کرتے وقت ایک تعاون یافتہ پلیٹ فارم کا انتخاب کریں ، لیکن غیر تعاون یافتہ پلیٹ فارم کی API-KEY کو پُر کریں ، اور حکمت عملی میں بیس ایڈریس کو تبدیل کرنے کے لئے IO کا استعمال کریں ، جیسے:
exchange.IO("base", "http://api.huobi.pro")
//http://api.huobi.pro is the base address of the unsupported platform API, and notice not to add api/v3 and so on, for the address will be automatically completed
ایف ایم زیڈ کے ذریعہ تمام پلیٹ فارمز کی حمایت نہیں کی جاتی ہے ، لیکن ہمارے پلیٹ فارم نے عام پروٹوکول تک رسائی کا طریقہ فراہم کیا ہے۔ مخصوص اصول یہ ہیں:
عام طور پر ، عام پروٹوکول ایک انٹرمیڈیٹر کی طرح ہے ، جو ڈوکر کی درخواست کو پراکسی کرتا ہے اور اسی معیار کے مطابق ڈیٹا واپس کرتا ہے۔ عام پروٹوکول کا کوڈ خود ہی مکمل کرنے کی ضرورت ہے۔ عام پروٹوکول لکھنے کا اصل مطلب یہ ہے کہ آپ صرف پلیٹ فارم تک رسائی حاصل کرسکتے ہیں اور حکمت عملی کو مکمل کرسکتے ہیں۔ ایف ایم زیڈ آفیشل کبھی کبھی پلیٹ فارمز کے عام پروٹوکول کا ایکسی ورژن جاری کرتا ہے۔ عام پروٹوکول پائیتھون میں بھی کیا جاسکتا ہے ، جسے پھر عام بوٹ کی طرح ڈوکر پر چلایا جاسکتا ہے۔
عام پروٹوکول کا مخصوص تعارف:https://www.fmz.com/bbs-topic/9120پیتھون میں عام پروٹوکول لکھنے کا مثال:https://www.fmz.com/strategy/101399
بالکل اسی طرح جیسے کسی پلیٹ فارم کے مختلف آپریشنز کو API کے ذریعے لاگو کیا جاسکتا ہے ، ایف ایم زیڈ کی ویب سائٹ بھی API پر مبنی ہے۔ آپ اپنی API-KEY کے لئے درخواست دے سکتے ہیں ایف ایم زیڈ ویب سائٹ افعال کو پورا کرنے کے لئے ، جیسے
ایف ایم زیڈ کوانٹ پلیٹ فارم کی طاقتور توسیع پذیری کی وجہ سے ، آپ اپنے API توسیع پر مبنی اپنا مقداری پلیٹ فارم تشکیل دے سکتے ہیں ، جس سے آپ کے صارفین کو اپنے پلیٹ فارم پر بوٹس چلانے کی اجازت ملتی ہے ، وغیرہ۔ مخصوص حوالہ:https://www.fmz.com/bbs-topic/1697 .
کریپٹوکرنسی ٹریڈنگ مارکیٹ نے اپنی خاصیت کی وجہ سے مقداری تاجروں کی طرف سے زیادہ سے زیادہ توجہ مبذول کروائی ہے۔ در حقیقت ، پروگرام ٹریڈنگ کریپٹوکرنسی کا مرکزی دھارے بن گیا ہے ، اور ہیجنگ اور مارکیٹ بنانے جیسی حکمت عملی ہمیشہ مارکیٹ میں سرگرم رہتی ہے۔ کمزور پروگرامنگ فاؤنڈیشن والے ابتدائی اس نئے میدان میں داخل ہونا چاہتے ہیں ، متعدد پلیٹ فارمز اور بدلتے ہوئے اے پی آئی کا سامنا کرتے ہوئے ، مشکلات سے بھرا ہوا ہے۔ ایف ایم زیڈ کوانٹ پلیٹ فارم ، (سابقہ بوٹ ویز ،www.fmz.com) فی الحال سب سے بڑی کریپٹوکرنسی مقداری کمیونٹی اور پلیٹ فارم ہے ، جس نے 4 سال سے زیادہ عرصے سے ہزاروں ابتدائیوں کو مقداری تجارت کی راہ پر گامزن ہونے میں مدد فراہم کی ہے۔ نیٹ ایز پر کورس لینے کے ل you ، آپ کو صرف 20 یوآن کی ضرورت ہے ، اور کورس مکمل طور پر ابتدائیوں کے لئے ہے۔
فروغنیٹ ایز کلاؤڈ کلاس روم پر کریپٹوکرنسی کوانٹیٹیٹیو ٹریڈنگ کورس. نیٹ ایز کلاؤڈ کلاس روم میں لاگ ان کریں اور اپنے کورس کا لنک شیئر کریں (لنک میں ایک انوکھا کورس آئی ڈی ہے) ۔ دوسرے ، جو اس لنک کے ذریعے رجسٹر ہوتے ہیں اور کورس خریدتے ہیں ، آپ کو مجموعی طور پر 50٪ کمیشن ، یعنی 10 یوآن کے طور پر ملے گا۔ نقد رقم نکالنے کے لئے
صارفین جو پروموشن لنک پر کلک کرتے ہیں ، آدھے سال کے اندر اندراج اور ری چارج کرتے ہیں ، وہ اس پالیسی سے لطف اندوز ہوں گے کہ ہماری کمپنی درست آرڈر میں موثر رقم کے مطابق رعایت دے گی۔ کمیشن کو پوائنٹس کی شکل میں پروموٹر کے اکاؤنٹ میں واپس کردیا جائے گا۔ صارفین پوائنٹس کو ایف ایم زیڈ پلیٹ فارم کے اکاؤنٹ بیلنس میں 10: 1 کے تناسب سے تبدیل کرسکتے ہیں ، اور صارفین مستقبل میں ایف ایم زیڈ کوانٹ کی متعلقہ مصنوعات کا تبادلہ کرنے کے لئے پوائنٹس کا استعمال بھی کرسکتے ہیں۔ سرگرمی کے لئے مخصوص لنک:https://www.fmz.com/bbs-topic/3828
مکمل ایف ایم زیڈ ویب سائٹ کو کسی انٹرپرائز یا ٹیم کے خصوصی سرور پر مکمل کنٹرول اور فنکشنل حسب ضرورت کے لئے تعینات کیا جاسکتا ہے۔ ایف ایم زیڈ ویب سائٹ کو تقریبا 100,000،XNUMX صارفین نے استعمال کیا ہے اور اس کا تجربہ کیا ہے ، اور اس نے اعلی دستیابی اور سیکیورٹی حاصل کی ہے ، جو مقداری ٹیموں اور کاروباری اداروں کے لئے وقت کی بچت کرسکتی ہے۔ انٹرپرائز ورژن درمیانے درجے کی مقداری تجارتی ٹیموں ، خام مال فیوچر سروس فراہم کرنے والوں وغیرہ کے لئے ہے۔ براہ کرم مخصوص قیمتوں کے لئے منتظم سے رابطہ کریں۔
پیشہ ورانہ نظام ، جو پلیٹ فارمز کے لئے مارکیٹ لیکویڈیٹی اور فنڈز کا انتظام فراہم کرتا ہے ، مارکیٹ میں مارکیٹ بنانے کا سب سے بہتر نظام ہوسکتا ہے۔ یہ بہت سارے پلیٹ فارمز اور ٹیموں کے ذریعہ وسیع پیمانے پر استعمال ہوتا ہے۔
ایف ایم زیڈ ٹکنالوجی ٹریڈنگ سسٹم میموری میچنگ ٹکنالوجی کو اپناتا ہے ، اور آرڈر پروسیسنگ کی رفتار 2 ملین تجارت فی سیکنڈ تک زیادہ ہے ، جو اس بات کو یقینی بناسکتی ہے کہ آرڈر پروسیسنگ میں کوئی تاخیر یا تاخیر نہیں ہوگی۔ یہ 20 ملین سے زیادہ بیک وقت آن لائن صارفین کے ساتھ پلیٹ فارمز کے ہموار اور مستحکم آپریشن کو برقرار رکھ سکتا ہے۔ کثیر پرت اور کثیر کلسٹر سسٹم فریم ورک سسٹم کی حفاظت ، استحکام اور توسیع کو یقینی بناتا ہے۔ فنکشن کی تعیناتی اور ورژن کی تازہ کاریوں کو بغیر کسی ٹائم ٹائم کے کیا جاسکتا ہے ، جو ٹرمینل صارفین کے آپریٹنگ تجربے کی زیادہ سے زیادہ ضمانت دیتا ہے۔ فی الحال ، سسٹم wex.app تخروپن پلیٹ فارم میں تجربہ کیا جاسکتا ہے۔