[英]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.