Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
207 changes: 190 additions & 17 deletions scripts/binance-orderbook-trade.user.js

Large diffs are not rendered by default.

35 changes: 35 additions & 0 deletions src/binance-orderbook-trade/core/auto-open-leverage.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,41 @@ export function resolveSymbolPositionStatus(payload, symbol) {
};
}

export function resolveSymbolPositionSideStatus(payload, symbol, side) {
if (payload?.success !== true) throw new Error('持仓接口返回失败');
if (!Array.isArray(payload.data)) throw new Error('持仓接口数据格式异常');
if (!symbol) throw new Error('持仓接口缺少交易对');
if (side !== 'LONG' && side !== 'SHORT') {
throw new Error(`目标持仓方向无效:${String(side)}`);
}

const positions = payload.data.filter((position) => position?.symbol === symbol);
let matchingPositionCount = 0;
let hasPosition = false;
for (const position of positions) {
const positionSide = position.positionSide;
if (!['BOTH', 'LONG', 'SHORT'].includes(positionSide)) {
throw new Error(`持仓方向无效:${String(positionSide)}`);
}
const amount = parsePositionAmount(position.positionAmount);
if (positionSide === side) {
matchingPositionCount += 1;
if (amount !== 0) hasPosition = true;
continue;
}
if (positionSide === 'BOTH') {
matchingPositionCount += 1;
if ((side === 'LONG' && amount > 0) || (side === 'SHORT' && amount < 0)) {
hasPosition = true;
}
}
}
return {
status: hasPosition ? 'has_position' : 'flat',
matchingPositionCount,
};
}

/**
* Tracks confirmed position epochs without treating a temporarily missing DOM root
* as a new flat transition.
Expand Down
24 changes: 21 additions & 3 deletions src/binance-orderbook-trade/core/continuous-ladder.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ export function recordContinuousLadderRound(progress, outcome) {
if (recordedRoundOutcomes.has(outcome)) {
throw new Error('连续阶梯本轮结果已记录');
}
if (!['completed', 'stopped', 'failed', 'interrupted'].includes(outcome.status)) {
if (!['completed', 'position_closed', 'stopped', 'failed', 'interrupted'].includes(outcome.status)) {
throw new Error('连续阶梯本轮结果无效');
}
const roundProgress = snapshotLadderProgress(outcome.progress);
Expand Down Expand Up @@ -168,6 +168,24 @@ export function formatContinuousLadderProgress(label, phase, progress, reason =
return parts.join(' · ');
}

export function formatContinuousLadderPositionClosedProgress(label, progress) {
if (typeof label !== 'string' || label.trim() === '') {
throw new Error('连续阶梯动作名称无效');
}
assertContinuousLadderProgress(progress);
const parts = [
`连续${label}`,
'已结束',
'当前方向已无持仓',
progress.startedRounds === 0
? '0 轮'
: `${progress.completedRounds}/${progress.startedRounds} 轮`,
`累计 ${progress.submittedOrders} 笔`,
];
if (progress.cancelledOrders > 0) parts.push(`撤 ${progress.cancelledOrders} 笔`);
return parts.join(' · ');
}

export function formatContinuousLadderWaitReason(phase, cooldownMs) {
if (!Number.isFinite(cooldownMs) || cooldownMs < 0) {
throw new Error('连续阶梯轮间等待时间无效');
Expand Down Expand Up @@ -205,7 +223,7 @@ async function waitUntilReadyOrStopped({
let reported = waitingAlreadyReported;
while (true) {
throwIfAborted(signal);
const state = assertReadinessState(readReadiness());
const state = assertReadinessState(await readReadiness());
if (state.status !== 'waiting') return state;
if (!reported) {
onWaitStateChange({ phase: 'waiting_ready', cooldownMs });
Expand Down Expand Up @@ -250,7 +268,7 @@ export async function waitForContinuousLadderNextRound({
onWaitStateChange({ phase: 'cooldown', cooldownMs });
await waitForPromiseOrAbort(delay(cooldownMs), signal);
throwIfAborted(signal);
const afterCooldown = assertReadinessState(readReadiness());
const afterCooldown = assertReadinessState(await readReadiness());
if (afterCooldown.status !== 'waiting') return afterCooldown;
onWaitStateChange({ phase: 'waiting_ready', cooldownMs });
waitingAlreadyReported = true;
Expand Down
5 changes: 5 additions & 0 deletions src/binance-orderbook-trade/core/ladder-progress.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,8 @@ export function formatCompletedLadderProgress(label, completedOrders, totalOrder
: '';
return `${label}已完成 · 已挂 ${completedOrders}/${totalOrders} 笔${cancelledText}`;
}

export function formatPositionClosedLadderProgress(label, progress) {
assertLadderLabel(label);
return appendLadderProgressCounts(`${label}已结束 · 当前方向已无持仓`, progress);
}
Loading
Loading