মাল্টি-থ্রেইড অ্যাসিনক্রোনস সাপোর্ট ফাংশনগুলি সমস্ত সমর্থিত ফাংশনগুলির ক্রিয়াকলাপকে অ্যাসিনক্রোনস সমান্তরাল এক্সিকিউশনে পরিণত করতে পারে।
দ্যexchange.Go()
ফাংশন অবিলম্বে একটি সমান্তরাল বস্তু ফেরত, এবং আপনি ব্যবহার করতে পারেনwait()
একই সাথে অনুরোধের ফলাফল পেতে যে সমান্তরাল বস্তুর পদ্ধতি.
বস্তু
exchange.Go পদ্ধতি) বিনিময়.Go ((পদ্ধতি,... args)
দ্যmethod
প্যারামিটারটি সমান্তরাল ফাংশনের নাম নির্দিষ্ট করতে ব্যবহৃত হয়। লক্ষ্য করুন যে প্যারামিটারটি একটি ফাংশন নাম স্ট্রিং, একটি ফাংশন রেফারেন্স নয়।
পদ্ধতি
সত্য
স্ট্রিং
প্যারামিটারএকযোগে ফাংশন সম্পাদন, একের বেশি প্যারামিটার থাকতে পারেarg
. প্যারামিটারের ধরন এবং সংখ্যাarg
প্যারামিটার উপর নির্ভর করেসমান্তরাল সম্পাদন ফাংশন.
আরজি
মিথ্যা
string, number, bool, object, array, function, null, এবং সিস্টেম দ্বারা সমর্থিত অন্যান্য সকল টাইপ
function main(){
// The following four operations are concurrently executed asynchronously by multiple threads and do not take time and return immediately
var a = exchange.Go("GetTicker")
var b = exchange.Go("GetDepth")
var c = exchange.Go("Buy", 1000, 0.1)
var d = exchange.Go("GetRecords", PERIOD_H1)
// Call the wait method to wait for the return of the ticker results asynchronously
var ticker = a.wait()
// Returns the depth, or null if it fails
var depth = b.wait()
// return order number, limited to 1 second timeout, if timeout, returns undefined, the object can continue to call wait if the last wait timeout
var orderId = c.wait(1000)
if(typeof(orderId) == "undefined") {
// Timeout, reacquire
orderId = c.wait()
}
var records = d.wait()
}
def main():
a = exchange.Go("GetTicker")
b = exchange.Go("GetDepth")
c = exchange.Go("Buy", 1000, 0.1)
d = exchange.Go("GetRecords", PERIOD_H1)
ticker, ok = a.wait()
depth, ok = b.wait()
orderId, ok = c.wait(1000)
if ok == False:
orderId, ok = c.wait()
records, ok = d.wait()
void main() {
auto a = exchange.Go("GetTicker");
auto b = exchange.Go("GetDepth");
auto c = exchange.Go("Buy", 1000, 0.1);
auto d = exchange.Go("GetRecords", PERIOD_H1);
Ticker ticker;
Depth depth;
Records records;
TId orderId;
a.wait(ticker);
b.wait(depth);
if(!c.wait(orderId, 300)) {
c.wait(orderId);
}
d.wait(records);
}
Exchange.Go()
ফাংশন ব্যবহারের উদাহরণ, নির্ধারণ করতেundefined
ব্যবহার করাtypeof(xx) === "undefined"
কারণnull == undefined
জাভাস্ক্রিপ্টে বৈধ।
function main() {
var d = exchange.Go("GetRecords", PERIOD_H1)
// Waiting for K-line results
var records = d.wait()
// Here waits an asynchronous operation that has been waited and finished, it will return null, and log the error message
var ret = d.wait()
}
def main():
d = exchange.Go("GetRecords", PERIOD_H1)
records, ok = d.wait()
ret, ok = d.wait()
void main() {
auto d = exchange.Go("GetRecords", PERIOD_H1);
Records records;
d.wait(records);
Records ret;
d.wait(ret);
}
কলিংwait()
একটি সমান্তরাল বস্তুর উপর পদ্ধতি যা মুক্তি দেওয়া হয়েছে একটি ত্রুটি রিপোর্ট করবেঃ
function main() {
while(true) {
var beginTS = new Date().getTime()
var arrRoutine = []
var arrTicker = []
var arrName = []
for(var i = 0; i < exchanges.length; i++) {
arrRoutine.push(exchanges[i].Go("GetTicker"))
arrName.push(exchanges[i].GetName())
}
for(var i = 0; i < arrRoutine.length; i++) {
arrTicker.push(arrRoutine[i].wait())
}
var endTS = new Date().getTime()
var tbl = {
type: "table",
title: "ticker",
cols: ["index", "name", "latest-deal-price"],
rows: []
}
for(var i = 0; i < arrTicker.length; i++) {
tbl.rows.push([i, arrName[i], arrTicker[i].Last])
}
LogStatus(_D(), "Total time taken to obtain tickers from multiple exchanges concurrently:", endTS - beginTS, "millisecond", "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(500)
}
}
import time
import json
def main():
while True:
beginTS = time.time()
arrRoutine = []
arrTicker = []
arrName = []
for i in range(len(exchanges)):
arrRoutine.append(exchanges[i].Go("GetTicker"))
arrName.append(exchanges[i].GetName())
for i in range(len(exchanges)):
ticker, ok = arrRoutine[i].wait()
arrTicker.append(ticker)
endTS = time.time()
tbl = {
"type": "table",
"title": "ticker",
"cols": ["index", "name", "latest-deal-price"],
"rows": []
}
for i in range(len(arrTicker)):
tbl["rows"].append([i, arrName[i], arrTicker[i]["Last"]])
LogStatus(_D(), "Total time taken to obtain tickers from multiple exchanges concurrently:", endTS - beginTS, "second", "\n", "`" + json.dumps(tbl) + "`")
Sleep(500)
void main() {
while(true) {
int length = exchanges.size();
auto beginTS = UnixNano() / 1000000;
Ticker arrTicker[length] = {};
string arrName[length] = {};
// Note that to add several exchange objects, several exchanges[n].Go functions have to be executed here, this example is to add four exchange objects, the details can be modified
auto r0 = exchanges[0].Go("GetTicker");
auto r1 = exchanges[1].Go("GetTicker");
auto r2 = exchanges[2].Go("GetTicker");
auto r3 = exchanges[3].Go("GetTicker");
GoObj *arrRoutine[length] = {&r0, &r1, &r2, &r3};
for(int i = 0; i < length; i++) {
arrName[i] = exchanges[i].GetName();
}
for(int i = 0; i < length; i++) {
Ticker ticker;
arrRoutine[i]->wait(ticker);
arrTicker[i] = ticker;
}
auto endTS = UnixNano() / 1000000;
json tbl = R"({
"type": "table",
"title": "ticker",
"cols": ["index", "name", "latest-deal-price"],
"rows": []
})"_json;
for(int i = 0; i < length; i++) {
json arr = R"(["", "", ""])"_json;
arr[0] = format("%d", i);
arr[1] = arrName[i];
arr[2] = format("%f", arrTicker[i].Last);
tbl["rows"].push_back(arr);
}
LogStatus(_D(), "Total time taken to obtain tickers from multiple exchanges concurrently:", format("%d", endTS - beginTS), "millisecond", "\n", "`" + tbl.dump() + "`");
Sleep(500);
}
}
একাধিক এক্সচেঞ্জ টিকার একযোগে অ্যাক্সেসঃ
function main() {
/*
Testing with OKX futures order interface
POST /api/v5/trade/order
*/
var beginTS = new Date().getTime()
var param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
var ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
var ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
var ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
var id1 = ret1.wait()
var id2 = ret2.wait()
var id3 = ret3.wait()
var endTS = new Date().getTime()
Log("id1:", id1)
Log("id2:", id2)
Log("id3:", id3)
Log("Concurrent order placement time consumption:", endTS - beginTS, "millisecond")
}
import time
import json
def main():
beginTS = time.time()
param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
id1, ok1 = ret1.wait()
id2, ok2 = ret2.wait()
id3, ok3 = ret3.wait()
endTS = time.time()
Log("id1:", id1)
Log("id2:", id2)
Log("id3:", id3)
Log("Concurrent order placement time consumption:", endTS - beginTS, "second")
void main() {
auto beginTS = UnixNano() / 1000000;
json param = R"({"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"})"_json;
auto ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
auto ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
auto ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
json id1 = R"({})"_json;
json id2 = R"({})"_json;
json id3 = R"({})"_json;
ret1.wait(id1);
ret2.wait(id2);
ret3.wait(id3);
auto endTS = UnixNano() / 1000000;
Log("id1:", id1);
Log("id2:", id2);
Log("id3:", id3);
Log("Concurrent order placement time consumption:", endTS - beginTS, "millisecond");
}
একযোগে আহ্বানexchange.IO("api", ...)
ফাংশনঃ
এই ফাংশনটি কেবলমাত্র বাস্তব ট্রেডিংয়ে চলার সময় মাল্টি-থ্রেডড এক্সিকিউশন টাস্ক তৈরি করে, ব্যাকটেস্টিং মাল্টি-থ্রেডড সমান্তরাল টাস্ক এক্সিকিউশন সমর্থন করে না (ব্যাকটেস্টিং উপলব্ধ, তবে এখনও ক্রমিকভাবে কার্যকর হয়) ।
এর পরexchange.Go()
ফাংশন একটি বস্তু ফেরত, তারwait()
ফাংশনটি থ্রেড দ্বারা ফেরত দেওয়া তথ্য পেতে সেই বস্তুর মাধ্যমে কল করা হয়।wait()
ফাংশন স্বয়ংক্রিয়ভাবে থ্রেড মুক্তি হবে আগে তথ্য পেতে কল করা আবশ্যক।wait()
একটি থ্রেডের ফলাফল স্বয়ংক্রিয়ভাবে মুক্তি পাওয়ার আগে পাওয়া উচিত (একযোগে অ্যাক্সেসের জন্য ইন্টারফেস কলের সাফল্য বা ব্যর্থতার নির্বিশেষে) । সহজ কথায়, অনুরোধ করা থ্রেডটি অবশ্যইwait()
ফাংশন নির্বিশেষে নির্বাহ সফল বা ব্যর্থ হয় কিনা, এবং থ্রেড অনুরোধ রিসোর্সexchange.Go()
ফাংশন ডকার দ্বারা স্বয়ংক্রিয়ভাবে মুক্তি দেওয়া আবশ্যক।
দ্যwait()
পদ্ধতিটি একটি টাইমআউট প্যারামিটার সমর্থন করেঃ
টাইমআউট প্যারামিটার ছাড়া, অর্থাৎ,wait()
অথবা টাইমআউট প্যারামিটার ০, অর্থাৎ,wait(0)
.wait()
ফাংশন ব্লক এবং অপেক্ষা করে যতক্ষণ না সমান্তরাল থ্রেডটি চালানো শেষ হয়, সমান্তরাল থ্রেডের এক্সিকিউশনের ফলাফল ফেরত দেয়।
টাইমআউট প্যারামিটার সেট করুন -1, অর্থাৎwait(-1)
.wait()
ফাংশন অবিলম্বে ফেরত দেয়, বিভিন্ন প্রোগ্রামিং ভাষার জন্য বিভিন্ন রিটার্ন মান সহ, একটি উদাহরণ কলের জন্য এই উপবিভাগটি দেখুন।
নির্দিষ্ট টাইমআউট প্যারামিটার সেট করুন,wait(300)
, এবংwait()
ফাংশনটি ফিরে আসার আগে সর্বোচ্চ ৩০০ মিলিসেকেন্ড অপেক্ষা করবে।
যদি ফাইনাল ফলাফল ফিরেwait()
ফাংশনটি পাওয়া যায়নি, থ্রেড রিসোর্সগুলি স্বয়ংক্রিয়ভাবে মুক্তি পাবে না, যা অনুরোধ করা থ্রেডগুলির জমে উঠতে পারে এবং 2000 এর বেশি ত্রুটি রিপোর্ট করবেঃ"too many routine wait, max is 2000"
.
সমর্থিত ফাংশনঃGetTicker
, GetDepth
, GetTrades
, GetRecords
, GetAccount
, GetOrders
, GetOrder
, CancelOrder
, Buy
, Sell
, GetPositions
, IO
. এই সমস্ত ফাংশন বর্তমান {@var/EXCHANGE exchange} এক্সচেঞ্জ অবজেক্টের উপর ভিত্তি করে একই সাথে কল করা হয়।
পাইথন ভাষা এবং জাভাস্ক্রিপ্ট ভাষার মধ্যে পার্থক্য হল যেwait()
পাইথন ভাষায় সমান্তরাল বস্তুর ফাংশন দুটি পরামিতি ফেরত দেয়। প্রথম প্যারামিটারটি একটি অ্যাসিনক্রোন এপিআই কল দ্বারা ফেরত দেওয়া ফলাফল, এবং দ্বিতীয় প্যারামিটারটি নির্দেশ করে যে অ্যাসিনক্রোন কলটি সম্পন্ন হয়েছে কিনা।
def main():
d = exchange.Go("GetRecords", PERIOD_D1)
# ok will return True definitely, unless the strategy is stopped
ret, ok = d.wait()
# If the wait times out, or if it waits for an instance that has already ended, ok returns False
ret, ok = d.wait(100)
{@fun/Global/Mail_Go Mail_Go}, {@fun/Global/HttpQuery_Go HttpQuery_Go}, {@fun/Global/EventLoop ইভেন্টলুপ}
exchange.Encode অ্যাকাউন্ট