Các chức năng hỗ trợ không đồng bộ đa luồng có thể biến các hoạt động của tất cả các chức năng được hỗ trợ thành thực thi đồng bộ không đồng bộ.
Cácexchange.Go()
hàm trả về một đối tượng đồng thời ngay lập tức, và bạn có thể sử dụngwait()
phương pháp của đối tượng đồng thời đó để có được kết quả của yêu cầu đồng thời.
đối tượng
trao đổi.Go ( phương pháp) trao đổi.Go ((phương pháp,... args)
Cácmethod
tham số được sử dụng để chỉ định tên của hàm đồng thời. Lưu ý rằng tham số là một chuỗi tên hàm, không phải là tham chiếu hàm.
phương pháp
đúng
chuỗi
Các thông số đếnđồng thời thực hiện các chức năng, có thể có nhiều hơn một tham sốarg
. Loại và số tham sốarg
phụ thuộc vào các thông số củachức năng thực thi đồng thời.
arg
sai
chuỗi, số, bool, đối tượng, mảng, hàm, null, và tất cả các loại khác được hỗ trợ bởi hệ thống
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()
ví dụ sử dụng hàm, để xác địnhundefined
sử dụngtypeof(xx) === "undefined"
, bởi vìnull == undefined
là hợp lệ trong JavaScript.
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);
}
Gọi chowait()
phương pháp trên một đối tượng đồng thời đã được phát hành sẽ báo cáo một lỗi:
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);
}
}
Truy cập đồng thời đến nhiều ticker trao đổi:
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");
}
Các cuộc gọi đồng thờiexchange.IO("api", ...)
chức năng:
Chức năng này chỉ tạo ra các nhiệm vụ thực thi đa luồng khi chạy trong giao dịch thực tế, backtesting không hỗ trợ thực thi nhiệm vụ đồng thời đa luồng (backtesting có sẵn, nhưng vẫn được thực hiện theo trình tự).
Sau khiexchange.Go()
hàm trả về một đối tượng,wait()
hàm được gọi thông qua đối tượng đó để có được dữ liệu được trả về bởi các chuỗi.wait()
hàm phải được gọi để có được dữ liệu trước khi các chủ đề sẽ được phát hành tự động.wait()
Phương pháp này được sử dụng để xác định các hàm trong một trình duyệt, nhưng nếu không có chức năng được chỉ định, thì thread sẽ không tự động được phát hành ngay cả khi xảy ra thời gian hết. Kết quả của thread phải được lấy trước khi nó được phát hành tự động (bất kể thành công hoặc thất bại của cuộc gọi giao diện cho truy cập đồng thời).wait()
chức năng bất kể việc thực thi thành công hay thất bại, và các tài nguyên của các chuỗi được yêu cầu bởi cácexchange.Go()
chức năng phải được giải phóng tự động bởi docker.
Cácwait()
phương pháp hỗ trợ một tham số timeout:
Không có một tham số thời gian, đó là,wait()
, hoặc với tham số timeout là 0, tức là,wait(0)
.wait()
các khối chức năng và chờ cho đến khi chuỗi đồng thời kết thúc chạy, trả về kết quả của việc thực hiện chuỗi đồng thời.
Đặt tham số timeout -1, tức làwait(-1)
.wait()
hàm trả về ngay lập tức, với các giá trị trả về khác nhau cho các ngôn ngữ lập trình khác nhau, xem phần phụ này cho một ví dụ gọi.
Đặt tham số thời gian dừng cụ thể,wait(300)
, vàwait()
Chức năng sẽ chờ tối đa 300 mili giây trước khi quay lại.
Nếu kết quả trả về cuối cùngwait()
chức năng không đạt được, các tài nguyên chủ đề sẽ không được giải phóng tự động, điều này sẽ dẫn đến sự tích lũy các chủ đề được yêu cầu và hơn 2000 sẽ báo cáo lỗi:"too many routine wait, max is 2000"
.
Các chức năng được hỗ trợ:GetTicker
, GetDepth
, GetTrades
, GetRecords
, GetAccount
, GetOrders
, GetOrder
, CancelOrder
, Buy
, Sell
, GetPositions
, IO
. Tất cả các chức năng này được thực hiện dựa trên đối tượng trao đổi {@var/EXCHANGE exchange} hiện tại khi được gọi đồng thời.
Sự khác biệt giữa ngôn ngữ Python và ngôn ngữ JavaScript làwait()
function of concurrent objects trong ngôn ngữ Python trả về hai tham số. tham số đầu tiên là kết quả được trả về bởi một cuộc gọi API không đồng bộ, và tham số thứ hai chỉ ra liệu cuộc gọi không đồng bộ đã hoàn thành hay không.
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 EventLoop}
exchange.Encode Tài khoản