feat: 添加布林带宽度计算功能及相关配置项,优化趋势引擎以支持布林带宽度过滤

This commit is contained in:
discountry
2025-09-27 22:29:56 +08:00
parent 151130dfc4
commit d392f54f21
6 changed files with 88 additions and 4 deletions
+31
View File
@@ -52,6 +52,37 @@ export function calcTrailingActivationPrice(entryPrice: number, qty: number, sid
return entryPrice - profit / Math.abs(qty);
}
export function computeBollingerBandwidth(
values: AsterKline[],
length: number,
stdMultiplier: number
): number | null {
const period = Number.isInteger(length) ? Number(length) : 0;
const multiplier = Number.isFinite(stdMultiplier) ? stdMultiplier : 0;
if (!Array.isArray(values) || period <= 0 || values.length < period || multiplier <= 0) {
return null;
}
const window = values.slice(-period);
const closes = window.map((kline) => Number(kline.close));
if (closes.some((close) => !Number.isFinite(close))) {
return null;
}
const mean = closes.reduce((sum, price) => sum + price, 0) / period;
if (!Number.isFinite(mean) || mean <= 0) {
return null;
}
const variance = closes.reduce((sum, price) => {
const diff = price - mean;
return sum + diff * diff;
}, 0) / period;
const std = Math.sqrt(Math.max(variance, 0));
const width = std * multiplier * 2;
if (!Number.isFinite(width)) {
return null;
}
return width / mean;
}
/**
* Return true if the intended order price is within the allowed deviation from mark price.
* - For BUY: orderPrice must be <= markPrice * (1 + maxPct)