FMZ حکمت عملی کے ابتدائی ڈیزائن میں، اگر غیر متزلزل بیک وقت آپریشن کی ضرورت ہے،exchange.Go()
یہ فنکشن صرف ایف ایم زیڈ انکیپسولڈ انٹرفیس کے بیک وقت عملدرآمد کو حاصل کرنے کے لئے استعمال کیا جاسکتا ہے ، اور بیک وقت کچھ کسٹم آپریشنز (فنکشن) کو انجام دینا ممکن نہیں ہے۔ اگرچہ اس ڈیزائن سے حکمت عملی پروگرام کی کارکردگی میں بہتری آتی ہے ، لیکن مقامی پروگرامنگ زبانوں میں بیک وقت ڈیزائن میں تجربہ رکھنے والے طلباء اکثر بہت تکلیف محسوس کرتے ہیں۔
یہاں تک کہ نئے طلباء جو FMZ کو تعارفی مقداری تجارت کے لئے استعمال کرتے ہیں وہ بھی اس کا استعمال نہیں سمجھتے ہیںexchange.Go()
استعمال کرناexchange.Go()
اس مضمون میں ، ہم ایف ایم زیڈ پلیٹ فارم میں نئے شامل کردہ متوازی تھریڈ کی فعالیت کے استعمال کا جائزہ لیں گے:__Thread()
اور دیگر متعلقہ افعال کے ساتھ ساتھ حکمت عملی کے پروگراموں کے غیر متزلزل ڈیزائن.
اگر ہم چاہتے ہیں کہ اسٹریٹجی کا مین تھریڈ ہم آہنگ ایک ذیلی تھریڈ کے ساتھ چلتا ہے جو ہم نے لکھا ہے کہ کسٹم فنکشن کو انجام دیتا ہے تو ، ہم مندرجہ ذیل کوڈ کی طرح ایک ڈیزائن استعمال کرسکتے ہیں۔ اسٹریٹجی کوڈ میں ، کسٹم فنکشن کی وضاحت کریںGetTickerAsync()
اور اس فنکشن کی مخصوص فعالیت لکھیں. یہ فنکشن ایک لامحدود لوپ چلاتا ہے اور مسلسل FMZ API انٹرفیس بلاتا ہےGetTicker()
مارکیٹ کے اعداد و شمار کو حاصل کرنے کے لئے.
پھر، بیان کا استعمال کریں__threadSetData(0, "ticker", t)
مرکزی موضوع پر ڈیٹا لکھنے کے لئے. ڈیٹا کا نام ہےticker
اور اعداد و شمار کی قدر ہےt
، جو کہ واپسی کی قیمت ہےGetTicker()
.
__threadSetData(0, "ticker", t)
ہم آہنگ تھریڈ عملدرآمد کے لئے اپنی مرضی کے مطابق تقریب ڈیزائن کرنے کے بعد، ہم میں کوڈ لکھ سکتے ہیںmain()
فنکشن.main()
فنکشن، ہم استعمال کرتے ہیں:
__Thread(GetTickerAsync, 0) // GetTickerAsync is a custom function that needs to be executed concurrently, and 0 is the parameter that is passed to the GetTickerAsync function.
ایک متوازی تھریڈ تخلیق کریں جو عملدرآمد شروع کرتا ہےGetTickerAsync()
اس کے بعد،main()
فنکشن اپنے آپ کو چلانے کے لئے شروع ہوتا ہےwhile
لوپ، جس میں یہ ڈیٹا کی طرف سے اپ ڈیٹ موصولGetTickerAsync()
کام کرتا ہے اور اسے پرنٹ کرتا ہے:
var t = __threadGetData(0, "ticker")
Log(t)
مکمل کوڈ مثال:
function GetTickerAsync(index) {
while (true) {
var t = exchanges[index].GetTicker()
__threadSetData(0, "ticker", t)
Sleep(500)
}
}
function main() {
__Thread(GetTickerAsync, 0)
while(true) {
var t = __threadGetData(0, "ticker")
Log(t)
Sleep(1000)
}
}
لائیو ٹریڈنگ ٹیسٹ:
یہ سب سے آسان ایپلی کیشن ڈیزائن میں سے ایک ہے، تو چلو کچھ دیگر ضروریات کے ڈیزائن پر نظر ڈالیں.
ہم ایک فنکشن ڈیزائن کر سکتے ہیں کہ 10 تھریڈز بیک وقت بنائیں، ہر ایک آرڈر کی جگہ کا تعین کرنے کا فنکشن انجام دے.main()
فنکشن، ہم ایک ڈیزائن کر سکتے ہیںwhile
لوپ حکمت عملی بات چیت کے احکامات کا پتہ لگانے کے لئے. جب ہم بات چیت کے حکم وصولplaceMultipleOrders
، ہم متوازی آرڈر کی جگہ کا تعین کرنے کی تقریب کہتے ہیںtestPlaceMultipleOrders()
.
if (cmd == "placeMultipleOrders") {
// ...
}
حکمت عملی میں ترمیم کے صفحے پر حکمت عملی کے تعامل ڈیزائن شامل کریں کمانڈ کے ساتھ ایک بٹن شامل کرکے: placeMultipleOrders.
مکمل کوڈ مثال:
function placeOrder(exIndex, type, price, amount) {
var id = null
if (type == "Buy") {
id = exchanges[exIndex].Buy(price, amount)
} else if (type == "Sell") {
id = exchanges[exIndex].Sell(price, amount)
} else {
throw "type error! type:" + type
}
}
function testPlaceMultipleOrders(index, beginPrice, endPrice, step, type, amount) {
Log("beginPrice:", beginPrice, ", endPrice:", endPrice, ", step:", step, ", type:", type, ", amount:", amount)
var tids = []
for (var p = beginPrice; p <= endPrice; p += step) {
var tid = __Thread(placeOrder, index, type, p, amount)
tids.push(tid)
Sleep(10)
}
Sleep(1000)
for (var i = 0; i < tids.length; i++) {
__threadTerminate(tids[i])
}
}
function main() {
while(true) {
LogStatus(_D())
var cmd = GetCommand()
if (cmd) {
if (cmd == "placeMultipleOrders") {
var t = _C(exchange.GetTicker)
var beginPrice = t.Last * 0.8
var endPrice = t.Last * 0.9
var step = t.Last * 0.01
testPlaceMultipleOrders(0, beginPrice, endPrice, step, "Buy", 0.01)
var orders = exchange.GetOrders()
for (var i = 0; i < orders.length; i++) {
Log(orders[i])
}
}
}
Sleep(1000)
}
}
یہ ضرورت ایک FMZ صارف کی طرف سے اٹھایا گیا تھا جو ایک سادہ مثال کا مظاہرہ کرنا چاہتا ہے کہ کس طرح استعمال کرنا ہےویب ساکٹمتوازی موضوعات میں کنکشن اور کس طرح ڈیٹا کو منتقل کرنے کے لئےmain()
مرکزی موضوع میں کام کرتا ہے.
اصل میں، یہ بہت آسان ہے اور پچھلی مثالوں میں متوازی موضوعات بنانے کے لئے اسی طرح کی ہے. فرق صرف یہ ہے کہ ہم استعمال کرتے ہیں__threadPeekMessage()
اور__threadPostMessage()
انٹر تھریڈ مواصلات کے لئے افعال۔ بائننس ایکسچینج کے لئے ویب ساکٹ API کال کو بطور مثال لیتے ہوئے ، ہمیں ویب ساکٹ کنکشن کے اختتامی آپریشن کو بھی سنبھالنے کی ضرورت ہے۔ مندرجہ ذیل مثال میں دکھایا گیا ہے کہ متوازی تھریڈ کو روکنے کے لئے کیسے مطلع کیا جائے۔
مکمل کوڈ مثال:
var tid = null
function createWS() {
// wss://stream.binance.com:9443/ws/<streamName> , <symbol>@ticker
var stream = "wss://stream.binance.com:9443/ws/btcusdt@ticker"
var ws = Dial(stream)
Log("Create a WS connection:", stream)
while (true) {
var data = ws.read()
if (data) {
__threadPostMessage(0, data)
}
Log("receiving data pushed by the WS link, data:", data)
// __threadPeekMessage timeout parameter set to -1, no blocking
var msg = __threadPeekMessage(-1)
if (msg) {
if (msg == "stop") {
Log("Concurrent Thread Id:", __threadId(), "Received stop command")
break
}
}
}
Log("Concurrent threads finish execution, close ws connection")
ws.close()
}
function main() {
tid = __Thread(createWS)
Log("Create concurrent threads, thread Id:", tid)
while(true) {
// __threadPeekMessage's timeout parameter is set to 0, blocking for data
var data = __threadPeekMessage(0)
Log("Received from concurrent thread", ", Id:", tid, ", the data sent, data:", data, "#FF0000")
var tbl = {
type : "table",
title : "<symbol>@ticker channel push message",
cols : ["Event Type", "Event Time", "Trading Pairs", "24 Hour Price Change", "24 Hour Price Change %", "Average Price", "Last Traded Price", "Volume in 24 Hours", "Turnover in 24 Hours"],
rows : []
}
try {
data = JSON.parse(data)
tbl.rows.push([data.e, _D(data.E), data.s, data.p, data.P, data.w, data.c, data.v, data.q])
} catch (e) {
Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
}
}
function onexit() {
Log("Finalize function, send a stop command to the concurrent thread with ID ", tid,"")
__threadPostMessage(tid, "stop")
Log("Wait for the concurrent thread with ID ", tid, " to stop")
__threadJoin(tid)
Log("Finalize function execution completed")
}
لائیو ٹریڈنگ ٹیسٹنگ کے دوران، ہم دیکھ سکتے ہیںmain()
تقریب مسلسل متوازی موضوعات کی طرف سے پیدا ویب ساکٹ کنکشن سے مارکیٹ کے اعداد و شمار وصول کرتا ہے.
براہ راست ٹریڈنگ کی حکمت عملی کو روکنے پر، حتمی شکل دینے کا کام شروع ہو جائے گا.