这是一个功能丰富、结构清晰的高质量技术指标公式。代码经过了精心设计和多次优化,具有很高的实用价值。
主要优点
- 结构设计优秀
模块化设计:代码按功能模块清晰划分,便于维护和理解
参数集中管理:所有魔法数字都有明确的参数定义,便于调整优化
详细注释:每个模块都有中文注释说明,可读性极佳 - 功能全面丰富
核心指标:多空指数计算科学合理
交易信号:买入/卖出/加仓/减仓信号层次分明
风险控制:时间过滤、信号去重等风险控制机制完善
辅助分析:背离检测、趋势判断等高级功能 - 风险控制机制完善
时间过滤:避免开盘收盘时段的噪声交易
信号去重:防止连续出现重复信号
安全处理:对除零等异常情况有专门处理
============================
{=== 多空指数指标 - 终极优化版 ===}
{版本:2.4 | 日期:2024-12-27 | 优化:完整修复+时间过滤+保留所有特性}
{=== 参数定义区域 ===}
{周期参数}
SHORT_PERIOD := 10; {13短期EMA周期}
LONG_PERIOD := 26; {34通道计算周期}
SMOOTH_PERIOD := 2; {2平滑周期}
{权重参数}
FAST_WEIGHT := 0.333; {快速权重}
SLOW_WEIGHT := 0.667; {慢速权重}
{信号阈值参数}
OVERSOLD_LEVEL := 20; {超卖线}
OVERBOUGHT_LEVEL := 80; {超买线}
MID_LEVEL := 50; {多空分界线}
WEAK_LEVEL := -20; {弱势阈值}
STRONG_LEVEL := 20; {强势阈值}
{交易信号阈值}
BUY_THRESHOLD := 30; {买入阈值}
SELL_THRESHOLD := 70; {卖出阈值}
STRONG_SIGNAL_THRESHOLD := 5; {强信号阈值}
{信号显示位置}
BUY_SIGNAL_POS := 20; {买入信号位置}
ADD_SIGNAL_POS := 15; {加仓信号位置}
SELL_SIGNAL_POS := 80; {卖出信号位置}
REDUCE_SIGNAL_POS := 85; {减仓信号位置}
{=== 时间过滤参数 ===}
ENABLE_TIME_FILTER := 1; {启用时间过滤:1=启用,0=禁用}
OPEN_DELAY_MINUTES := 10; {开盘延迟分钟数 - 修改为10分钟}
CLOSE_AHEAD_MINUTES := 15;{收盘提前分钟数 - 修改为15分钟}
{=== 新增参数 ===}
DIVERGENCE_PERIOD := 10; {背离检测周期}
MIN_PRICE_RANGE := 0.01; {最小价格波动阈值}
TREND_FILTER_ADX := 25; {ADX趋势过滤阈值}
SIGNAL_FILTER_BARS := 3; {信号去重周期数}
{=== 核心指标计算 ===}
{价格中枢:典型价格}
TypicalPrice := (2 * CLOSE + HIGH + LOW) / 4;
{多空通道边界}
LowChannel := LLV(LOW, LONG_PERIOD);
HighChannel := HHV(HIGH, LONG_PERIOD);
{=== 关键修复:更安全的除零处理 ===}
ChannelRange := HighChannel - LowChannel;
SafeRange := IF(ChannelRange > MIN_PRICE_RANGE, ChannelRange,
IF(REF(ChannelRange, 1) > MIN_PRICE_RANGE, REF(ChannelRange, 1),
REF(ChannelRange, 2))); {连续三根K线检查}
{多空指数:价格在通道中的相对位置}
BBI_Raw := EMA((TypicalPrice - LowChannel) / SafeRange * 100, SHORT_PERIOD);
{趋势平滑:减少信号抖动}
BBI_Smooth := EMA(SLOW_WEIGHT * REF(BBI_Raw, 1) + FAST_WEIGHT * BBI_Raw, SMOOTH_PERIOD);
{=== 时间过滤模块 ===}
{现货交易时间:9:00-21:00,全年无休}
TimeValue := TIME;
HourPart := INTPART(TimeValue/10000);
MinutePart := INTPART(MOD(TimeValue, 10000)/100);
CurrentMinute := HourPart*100 + MinutePart;
{24小时制分钟表示法}
TotalMinutes := HourPart*60 + MinutePart;
{交易时间判断:9:00-21:00}
IsTradingTime := TotalMinutes >= 9*60 AND TotalMinutes <= 21*60;
{开盘延迟过滤:避免开盘波动(9:00之后10分钟)}
AvoidOpening := TotalMinutes >= (9*60 + OPEN_DELAY_MINUTES); {9:10之后}
{收盘提前过滤:避免收盘前波动(21:00之前15分钟)}
AvoidClosing := TotalMinutes <= (21*60 - CLOSE_AHEAD_MINUTES); {20:45之前}
{综合时间过滤条件}
TimeFilterOK := IF(ENABLE_TIME_FILTER = 1,
IsTradingTime AND AvoidOpening AND AvoidClosing,
1); {1=始终通过}
{=== 多空分界线 ===}
多空线: BBI_Raw, COLORGRAY, LINETHICK1;
趋势线: BBI_Smooth, COLORBLUE, LINETHICK1;
{=== 多空区域 ===}
STICKLINE(BBI_Raw > BBI_Smooth, BBI_Raw, BBI_Smooth, 2, 0), COLORRED;
STICKLINE(BBI_Raw < BBI_Smooth, BBI_Raw, BBI_Smooth, 2, 0), COLORGREEN;
{=== 信号条件定义 ===}
金叉条件 := CROSS(BBI_Raw, BBI_Smooth);
死叉条件 := CROSS(BBI_Smooth, BBI_Raw);
{基础信号条件(加入时间过滤)}
低位金叉 := 金叉条件 AND BBI_Raw < BUY_THRESHOLD AND TimeFilterOK;
中位金叉 := 金叉条件 AND BBI_Raw >= BUY_THRESHOLD AND BBI_Raw < SELL_THRESHOLD AND TimeFilterOK;
高位死叉 := 死叉条件 AND BBI_Raw > SELL_THRESHOLD AND TimeFilterOK;
中位死叉 := 死叉条件 AND BBI_Raw > MID_LEVEL AND BBI_Raw <= SELL_THRESHOLD AND TimeFilterOK;
{=== 保留:信号优先级处理(避免重叠)===}
买入信号 := IF(低位金叉, BUY_SIGNAL_POS, 0);
加仓信号 := IF(中位金叉 AND NOT(低位金叉), ADD_SIGNAL_POS, 0); {排除已触发买入信号的情况}
卖出信号 := IF(高位死叉, SELL_SIGNAL_POS, 0);
减仓信号 := IF(中位死叉 AND NOT(高位死叉), REDUCE_SIGNAL_POS, 0); {排除已触发卖出信号的情况}
{=== 交易信号显示 ===}
买入信号, STICK, COLORRED, LINETHICK3;
加仓信号, STICK, COLORMAGENTA, LINETHICK2;
卖出信号, STICK, COLORGREEN, LINETHICK3;
减仓信号, STICK, COLORBLUE, LINETHICK2;
{=== 保留:信号图标 - 智能去重 ===}
{使用 SIGNAL_FILTER_BARS 参数控制去重周期}
DRAWICON(低位金叉 AND COUNT(低位金叉, SIGNAL_FILTER_BARS) = 1, BUY_SIGNAL_POS - 5, 1);
DRAWICON(中位金叉 AND COUNT(中位金叉, SIGNAL_FILTER_BARS) = 1, ADD_SIGNAL_POS - 5, 1);
DRAWICON(高位死叉 AND COUNT(高位死叉, SIGNAL_FILTER_BARS) = 1, SELL_SIGNAL_POS + 5, 2);
DRAWICON(中位死叉 AND COUNT(中位死叉, SIGNAL_FILTER_BARS) = 1, REDUCE_SIGNAL_POS + 5, 2);
{=== 多空强度指标 ===}
多空强度: IF(BBI_Smooth <> 0, (BBI_Raw - BBI_Smooth) / BBI_Smooth * 100, 0), COLORYELLOW, LINETHICK1;
{=== 关键位置线 ===}
强势线: STRONG_LEVEL, COLORRED, LINETHICK1;
弱势线: WEAK_LEVEL, COLORGREEN, LINETHICK1;
零轴: 0, COLORWHITE, LINETHICK1;
超买线: OVERBOUGHT_LEVEL, COLORRED, LINETHICK1;
超卖线: OVERSOLD_LEVEL, Color6B8E23, LINETHICK1;
中线: MID_LEVEL, ColorA8A8A8, LINETHICK1;
{=== 多空状态判断 ===}
多头力量: IF(BBI_Raw > BBI_Smooth, BBI_Raw - BBI_Smooth, 0), COLORRED;
空头力量: IF(BBI_Raw < BBI_Smooth, BBI_Smooth - BBI_Raw, 0), COLORGREEN;
{=== 多空能量柱 ===}
STICKLINE(多头力量 > 0, 0, 多头力量, 2, 0), COLORRED;
STICKLINE(空头力量 > 0, 0, -空头力量, 2, 0), COLORGREEN;
{=== 预警信号 ===}
BBI_REF1 := REF(BBI_Raw, 1);
BBI_REF2 := REF(BBI_Raw, 2);
强力买入 := 金叉条件 AND BBI_Raw < OVERSOLD_LEVEL AND BBI_Raw > BBI_REF1 AND BBI_REF1 > BBI_REF2 AND TimeFilterOK;
强力卖出 := 死叉条件 AND BBI_Raw > OVERBOUGHT_LEVEL AND BBI_Raw < BBI_REF1 AND BBI_REF1 < BBI_REF2 AND TimeFilterOK;
DRAWICON(强力买入, BBI_Raw, 23);
DRAWICON(强力卖出, BBI_Raw, 15);
{=== 关键位置标记 ===}
DRAWTEXT(ISLASTBAR, OVERBOUGHT_LEVEL, '超买'), COLORRED;
DRAWTEXT(ISLASTBAR, OVERSOLD_LEVEL, '超卖'), Color6B8E23;
DRAWTEXT(ISLASTBAR, MID_LEVEL, '中线'), COLORWHITE;
{=== 多空状态显示 ===}
多头条件 := BBI_Raw > BBI_Smooth AND BBI_Raw > MID_LEVEL;
空头条件 := BBI_Raw < BBI_Smooth AND BBI_Raw < MID_LEVEL;
DRAWTEXT(多头条件, 多空线, '↑多'), COLORYELLOW;
DRAWTEXT(空头条件, 多空线, '↓空'), COLORGREEN;
{=== 信号强度指示 ===}
信号强度 := ABS(BBI_Raw - BBI_Smooth);
强买入 := 金叉条件 AND BBI_Raw < BUY_THRESHOLD AND 信号强度 > STRONG_SIGNAL_THRESHOLD AND TimeFilterOK;
强卖出 := 死叉条件 AND BBI_Raw > SELL_THRESHOLD AND 信号强度 > STRONG_SIGNAL_THRESHOLD AND TimeFilterOK;
DRAWTEXT(强买入, BUY_SIGNAL_POS, '强'), COLORRED;
DRAWTEXT(强卖出, SELL_SIGNAL_POS, '强'), COLORGREEN;
{=== 背离检测 ===}
{底背离:价格新低但指标未新低}
价格新低 := LOW < REF(LLV(LOW, DIVERGENCE_PERIOD), 1);
指标未新低 := BBI_Raw > REF(LLV(BBI_Raw, DIVERGENCE_PERIOD), 1);
底背离 := 价格新低 AND 指标未新低 AND BBI_Raw < BUY_THRESHOLD AND TimeFilterOK;
DRAWICON(底背离, BBI_Raw, 9);
{顶背离:价格新高但指标未新高}
价格新高 := HIGH > REF(HHV(HIGH, DIVERGENCE_PERIOD), 1);
指标未新高 := BBI_Raw < REF(HHV(BBI_Raw, DIVERGENCE_PERIOD), 1);
顶背离 := 价格新高 AND 指标未新高 AND BBI_Raw > SELL_THRESHOLD AND TimeFilterOK;
DRAWICON(顶背离, BBI_Raw, 10);
{=== 可选:趋势过滤器 ===}
{计算ADX趋势强度}
TR := MAX(MAX(HIGH-LOW, ABS(HIGH-REF(CLOSE,1))), ABS(LOW-REF(CLOSE,1)));
ATR := EMA(TR, 14);
PlusDM := IF(HIGH-REF(HIGH,1) > REF(LOW,1)-LOW, MAX(HIGH-REF(HIGH,1), 0), 0);
MinusDM := IF(REF(LOW,1)-LOW > HIGH-REF(HIGH,1), MAX(REF(LOW,1)-LOW, 0), 0);
PlusDI := 100 * EMA(PlusDM, 14) / ATR;
MinusDI := 100 * EMA(MinusDM, 14) / ATR;
DX := 100 * ABS(PlusDI - MinusDI) / (PlusDI + MinusDI + 0.000001);
ADX_VALUE := EMA(DX, 14);
{趋势状态显示}
DRAWTEXT(ADX_VALUE > TREND_FILTER_ADX, 100, '趋'), COLORRED;
DRAWTEXT(ADX_VALUE <= TREND_FILTER_ADX, 100, '震'), COLORGREEN;
{根据ENABLE_TIME_FILTER的值显示不同文本}
DRAWTEXT(ISLASTBAR AND ENABLE_TIME_FILTER = 1, 95, '时间过滤:开'), COLORWHITE;
DRAWTEXT(ISLASTBAR AND ENABLE_TIME_FILTER = 0, 95, '时间过滤:关'), COLORWHITE;
{==============================================================================}
{版本2.4 优化总结:设计版权:Hupixia}
{1. 安全性增强:使用IF条件处理除零问题,而非固定加极小值}
{2. 时间过滤:完整时间过滤模块,可开关控制,避免开盘收盘噪声}
{3. 保留信号优先级:通过IF+NOT避免买入/加仓、卖出/减仓信号重叠}
{4. 保留智能去重:COUNT(..., N)=1 实现N周期内首次信号}
{5. 参数化控制:背离周期、去重周期、时间参数均可外部调整}
{6. 可选趋势过滤:加入ADX判断市场状态(可注释关闭)}
{7. 兼容性保证:避免使用系统保留字,完全符合通达信语法}
{8. 状态显示:直观显示时间过滤和趋势状态}
使用建议
- 适用场景
中短线交易:适合日线、60分钟级别交易
趋势跟踪:适合趋势明显的市场环境
组合使用:建议与其他指标配合使用 - 参数调优建议
激进型:调低买入阈值至25,调高卖出阈值至75
保守型:调高买入阈值至35,调低卖出阈值至65
震荡市:启用时间过滤,增大信号去重周期 - 风险提示
指标具有滞后性,需结合实时行情判断
在极端行情中可能出现信号失效
建议设置止损止盈机制
一、参数调整方案
-
超短线交易(持仓数分钟-数小时)
SHORT_PERIOD := 8-10; {更快反应价格变化}
LONG_PERIOD := 20-26; {缩小通道宽度,捕捉小波段}
SMOOTH_PERIOD := 1-2; {减少延迟} -
常规短线交易(持仓数小时-1天)
SHORT_PERIOD := 10-12; {平衡敏感度与稳定性}
LONG_PERIOD := 26-30; {适中通道宽度}
SMOOTH_PERIOD := 2; {适度平滑噪音} -
激进短线策略
SHORT_PERIOD := 5-8; {极速响应}
LONG_PERIOD := 20; {窄通道,频繁交易}
SMOOTH_PERIOD := 1; {最小延迟}
二、注意事项
避免过度优化:在最近1-2个月数据表现良好的参数即可
市场状态适配:
趋势明显时:可适当放大周期
震荡市:缩小周期,快进快出
结合其他指标:建议搭配成交量、RSI(周期7-9)过滤信号
三、推荐起始参数
// 通用短线起始设置
SHORT_PERIOD := 10;
LONG_PERIOD := 26;
SMOOTH_PERIOD := 2;
总结
这是一个专业级的多空指数指标,代码质量优秀,功能全面。经过适当的参数调优和风险控制,可以作为有效的交易辅助工具。建议在实际使用前进行充分的回测验证。
感觉很专业的样子,试试应用着看看。