Javascript 代码部分 运行 的顺序不正确
Javascript code portion not running in the right order
我在 Javascript 上创建了一个交易机器人(我之前没有使用过这种语言)。尾随止损函数运行s的方式为:
- Websocket 接收当前市场价格
- "active"是布尔变量,如果为真,运行代码
- 如果价格上涨 %,取消旧的止损并增加新的止损。
我遇到的问题是代码 运行 的顺序不正确。
看图的话,不明白为什么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);
});
}
}
Javascript 本质上是 异步 。函数 binanceCheckOrderStatus()
returns 一个承诺。执行引擎将调用此函数,然后转到下一行。 .then(r =>
之后的代码块仅在 binanceCheckOrderStatus
的 getOrder()
完成后执行。现在在这个时间段内,其他 .then()
请求中的 active 可能已变为 false。新开发人员可能会感到困惑。由于您在代码中使用了很多 .then()
,因此您必须了解 .then()
部分仅在 .then()
完成执行之前的函数之后执行。所以花费更少时间的函数将在其他部分之前执行它的 .then()
部分。所以简而言之,除非您知道每个功能将花费多少时间,否则您无法控制这种情况下的顺序,这可能无法确认。为了克服这个问题,你必须使用async/await。或者,您需要更改您的逻辑,以减少对深层承诺的依赖。
我不太确定您在这里要实现的目标,但这里是关于如何解决排序问题的想法。这只是一个参考代码,我没有测试过。关于如何保持线程以确保代码按使用 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);
});
});
}
}
我在 Javascript 上创建了一个交易机器人(我之前没有使用过这种语言)。尾随止损函数运行s的方式为:
- Websocket 接收当前市场价格
- "active"是布尔变量,如果为真,运行代码
- 如果价格上涨 %,取消旧的止损并增加新的止损。
我遇到的问题是代码 运行 的顺序不正确。 看图的话,不明白为什么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);
});
}
}
Javascript 本质上是 异步 。函数 binanceCheckOrderStatus()
returns 一个承诺。执行引擎将调用此函数,然后转到下一行。 .then(r =>
之后的代码块仅在 binanceCheckOrderStatus
的 getOrder()
完成后执行。现在在这个时间段内,其他 .then()
请求中的 active 可能已变为 false。新开发人员可能会感到困惑。由于您在代码中使用了很多 .then()
,因此您必须了解 .then()
部分仅在 .then()
完成执行之前的函数之后执行。所以花费更少时间的函数将在其他部分之前执行它的 .then()
部分。所以简而言之,除非您知道每个功能将花费多少时间,否则您无法控制这种情况下的顺序,这可能无法确认。为了克服这个问题,你必须使用async/await。或者,您需要更改您的逻辑,以减少对深层承诺的依赖。
我不太确定您在这里要实现的目标,但这里是关于如何解决排序问题的想法。这只是一个参考代码,我没有测试过。关于如何保持线程以确保代码按使用 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);
});
});
}
}