Les fonctions de support asynchrone à plusieurs fils peuvent transformer les opérations de toutes les fonctions prises en charge en exécution asynchrone simultanée.
Leexchange.Go()
fonction renvoie un objet concurrent immédiatement, et vous pouvez utiliser lewait()
méthode de cet objet concurrent pour obtenir le résultat de la requête concurrente.
objet
Métode d'échange (Go) L'échange.Méthode Go,... args)
Lemethod
paramètre est utilisé pour spécifier le nom de la fonction concurrente. Notez que le paramètre est une chaîne de noms de fonction, pas une référence de fonction.
méthode
vrai
chaîne
Paramètres àexécutant simultanément des fonctions, il peut y avoir plusieurs paramètresarg
. Le type et le nombre de paramètresarg
dépend des paramètres dufonction d'exécution simultanéeJe suis désolée.
arg
faux
chaîne, nombre, bool, objet, tableau, fonction, nul et tous les autres types pris en charge par le système
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()
exemple d'utilisation de la fonction, pour déterminerundefined
à utilisertypeof(xx) === "undefined"
, parce quenull == undefined
est valide en 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);
}
On appelle lewait()
la méthode sur un objet simultané qui a été libéré signalera une erreur:
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);
}
}
Accès simultané à plusieurs tickers de change:
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");
}
Les appels concomitantsexchange.IO("api", ...)
fonction:
Cette fonction crée uniquement des tâches d'exécution multi-threaded lors de l'exécution dans le commerce réel, le backtesting ne prend pas en charge l'exécution simultanée de tâches multi-threaded (le backtesting est disponible, mais toujours exécuté séquentiellement).
Après leexchange.Go()
fonction renvoie un objet, sonwait()
fonction est appelée à travers cet objet pour obtenir les données renvoyées par le fil.wait()
La fonction doit être appelée pour obtenir les données avant que le fil ne soit libéré automatiquement.wait()
Le résultat du thread doit être obtenu avant qu'il ne soit libéré automatiquement (indépendamment du succès ou de l'échec de l'appel d'interface pour l'accès simultané).wait()
fonction indépendamment du succès ou de l'échec de l'exécution, et la ressource du fil demandée par leexchange.Go()
La fonction doit être libérée automatiquement par le docker.
Lewait()
la méthode prend en charge un paramètre de temps d'arrêt:
Sans paramètre de temps d'arrêt, c'est à dire,wait()
, ou avec un paramètre de temps d'arrêt de 0, c'est-à-direwait(0)
Lewait()
blocs de fonction et attend que le thread concurrent ait terminé d'exécuter, renvoyant le résultat de l'exécution du thread concurrent.
Mettre le paramètre de temps d'arrêt -1, c'est à direwait(-1)
Lewait()
la fonction renvoie immédiatement, avec des valeurs de retour différentes pour différents langages de programmation, voir cette sous-section pour un exemple d'appel.
Définir le paramètre de temps d'arrêt spécifique,wait(300)
, et lewait()
La fonction attend au maximum 300 millisecondes avant de revenir.
Si le résultat de retour de la finalewait()
si la fonction n'est pas obtenue, les ressources de thread ne seront pas libérées automatiquement, ce qui entraînera l'accumulation des threads demandés, et plus de 2000 signalera une erreur:"too many routine wait, max is 2000"
- Je ne sais pas.
Fonctions prises en charge:GetTicker
, GetDepth
, GetTrades
, GetRecords
, GetAccount
, GetOrders
, GetOrder
, CancelOrder
, Buy
, Sell
, GetPositions
, IO
. Toutes ces fonctions sont exécutées sur la base de l'objet d'échange {@var/EXCHANGE exchange} en cours lorsqu'il est appelé simultanément.
La différence entre le langage Python et le langage JavaScript est que lewait()
fonction d'objets concurrents dans le langage Python renvoie deux paramètres. Le premier paramètre est le résultat renvoyé par un appel API asynchrone, et le deuxième paramètre indique si l'appel asynchrone est terminé.
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)
Je ne sais pas si je peux vous aider, mais je vais vous aider.
exchange.Encode Compte