更新 MakerEngine、OffsetMakerEngine 和 TrendEngine,重构订单同步逻辑,优化撤单和止损判断,新增订单计划生成和安全撤单功能,提升代码可读性和维护性。

This commit is contained in:
discountry
2025-09-24 04:33:08 +08:00
parent 6f05ee0da3
commit 7eddc3b88c
9 changed files with 272 additions and 199 deletions
+47
View File
@@ -0,0 +1,47 @@
import type { AsterOrder } from "../../exchanges/types";
export interface OrderTarget {
side: "BUY" | "SELL";
price: number;
amount: number;
reduceOnly: boolean;
}
export function makeOrderPlan(
openOrders: AsterOrder[],
targets: OrderTarget[],
tolerance: number
): { toCancel: AsterOrder[]; toPlace: OrderTarget[] } {
const unmatched = new Set(targets.map((_, idx) => idx));
const toCancel: AsterOrder[] = [];
for (const order of openOrders) {
const price = Number(order.price);
if (!Number.isFinite(price)) {
toCancel.push(order);
continue;
}
const reduceOnly = order.reduceOnly === true;
const matchedIndex = targets.findIndex((target, index) => {
return (
unmatched.has(index) &&
target.side === order.side &&
target.reduceOnly === reduceOnly &&
Math.abs(price - target.price) <= tolerance
);
});
if (matchedIndex >= 0) {
unmatched.delete(matchedIndex);
} else {
toCancel.push(order);
}
}
const toPlace = [...unmatched]
.map((idx) => targets[idx])
.filter((t): t is OrderTarget => t !== undefined && t.amount > 1e-5);
return { toCancel, toPlace };
}
+22
View File
@@ -0,0 +1,22 @@
import type { ExchangeAdapter } from "../../exchanges/adapter";
import type { AsterOrder } from "../../exchanges/types";
import { isUnknownOrderError } from "../../utils/errors";
export async function safeCancelOrder(
exchange: ExchangeAdapter,
symbol: string,
order: AsterOrder,
onResolved: (orderId: number) => void,
onUnknown: () => void,
onError: (err: unknown) => void
): Promise<void> {
try {
await exchange.cancelOrder({ symbol, orderId: order.orderId });
onResolved(order.orderId);
} catch (error) {
if (isUnknownOrderError(error)) onUnknown();
else onError(error);
}
}