[英]Javascript code portion not running in the right order
我用Javascript創建了一個交易機器人(我以前沒有使用這種語言的經驗)。 尾隨止損功能的運行方式為:
我遇到的問題是代碼未按正確的順序運行。 如果您查看圖片,我不明白為什么如果active為false,藍色框仍然執行。 而且由於該程序有時會以錯誤的順序運行,因此websocket會停止或采取不應有的行動。
這是我的追蹤止損websocket代碼:
function binanceTrailingSLOrder(symbol, orderId, quantity, oldPrice, percentage, active) {
const clean_trade = client.ws.trades([symbol], trade => { //run websocket
var livePrice = parseFloat(binance_symbols[symbol]["close"]); //set new price to live price
if (active == true) {
binanceCheckOrderStatus(symbol, orderId).then(r => {
switch (r.status) {
case "PENDING":
if (livePrice >= (oldPrice * ((100 + percentage) / 100)) && active == true) {
active = false;
binanceCancelOrder(symbol, orderId).then((r4) => { //Cancel previous SL
var newSL = livePrice * ((100 - percentage) / 100);
binanceStopOrder(symbol, 'SELL', r4.origQty, newSL, newSL).then((r5) => { //Set new SL
orderId = r5.orderId; quantity = r5.origQty; oldPrice = r5.price;
active = true;
}).catch((err) => {
console.log(err);
});
});
}
break;
default:
break;
}
});
}
});
}
檢查訂單狀態功能:
//Get specific order status
function binanceCheckOrderStatus(symbol, orderId) {
if(!orderId){
console.log("order Id not found");
return false;
} else {
var client = loadBinanceKeys2();
return client.getOrder({
symbol: symbol,
orderId: orderId,
recvWindow: 1000000
}).then((order) => {
return order;
}).catch((err) => {
console.log(err);
});
}
}
Java本質上是異步的。 函數binanceCheckOrderStatus()
返回一個binanceCheckOrderStatus()
。 執行引擎將調用此函數,然后繼續進行下一行。 binanceCheckOrderStatus
.then(r =>
之后的代碼塊僅在binanceCheckOrderStatus
的getOrder()
完成后才執行。現在在這段時間內,活動對象可能在其他.then()
請求中變為false,這可能會使新開發人員感到困惑由於您在代碼中使用了大量的.then()
,因此您必須了解.then()
部分僅在.then()
完成執行之前的函數之后才執行,因此花費較少時間執行的函數.then()
部分先於其他部分。因此,簡而言之,除非您知道每個函數將花費多少時間,否則您將無法控制順序,這可能無法確認。要解決此問題,您必須使用async / 等待 ,或者,你需要改變你的邏輯,所以它不太依賴於深層次的承諾。
我不太確定您要在這里實現什么,但是這里是有關如何解決訂購問題的想法。 這只是參考代碼,我沒有測試過。 只是關於如何保持線程以確保代碼使用async / await按順序運行的想法。
async function binanceTrailingSLOrder(symbol, orderId, quantity, oldPrice, percentage, active) {
const clean_trade = client.ws.trades([symbol], async trade => { //run websocket
var livePrice = parseFloat(binance_symbols[symbol]["close"]); //set new price to live price
if (active == true) {
try {
const order = await binanceCheckOrderStatus(symbol, orderId);
if (!order) {
throw new Error('order not found')
}
switch (order.status) {
case "PENDING":
if (livePrice >= (oldPrice * ((100 + percentage) / 100)) && active == true) {
active = false;
const r4 = await binanceCancelOrder(symbol, orderId);
if (r4) {
var newSL = livePrice * ((100 - percentage) / 100);
var r5 = binanceStopOrder(symbol, 'SELL', r4.origQty, newSL, newSL);
if (r5) {
orderId = r5.orderId; quantity = r5.origQty; oldPrice = r5.price;
active = true;
}
}
}
break;
default:
break;
}
}
catch(error) {
console.log('error found: ', error);
}
}
});
}
async function binanceCheckOrderStatus(symbol, orderId) {
if(!orderId){
console.log("order Id not found");
return false;
} else {
var client = loadBinanceKeys2();
return new Promise((resolve, reject) => {
client.getOrder({
symbol: symbol,
orderId: orderId,
recvWindow: 1000000
}).then((order) => {
resolve(order);
}).catch((err) => {
reject(err);
});
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.