介于上面给出的代码优化:
待改进点:
变量命名 - 使用VARx系列命名,可读性较差
魔法数字 - 大量硬编码数值缺乏解释
信号重叠 - 多个信号可能在同一位置重叠显示
{多空指数指标 - 专业优化版}
{版本:2.0 | 日期:2024-12-24 | 优化:可读性、可维护性、信号准确性}
{=== 参数定义区域 ===}
{周期参数}
SHORT_PERIOD := 13; {短期EMA周期}
LONG_PERIOD := 34; {通道计算周期}
SMOOTH_PERIOD := 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; {减仓信号位置}
{=== 核心指标计算 ===}
{价格中枢:典型价格}
TypicalPrice := (2 * CLOSE + HIGH + LOW) / 4;
{多空通道边界}
LowChannel := LLV(LOW, LONG_PERIOD); {34周期最低价通道}
HighChannel := HHV(HIGH, LONG_PERIOD); {34周期最高价通道}
{多空指数:价格在通道中的相对位置}
BBI_Raw := EMA((TypicalPrice - LowChannel) / (HighChannel - LowChannel + 0.000001) * 100, SHORT_PERIOD);
{趋势平滑:减少信号抖动}
BBI_Smooth := EMA(SLOW_WEIGHT * REF(BBI_Raw, 1) + FAST_WEIGHT * BBI_Raw, SMOOTH_PERIOD);
{=== 多空分界线 ===}
多空线: 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 BBI_Raw >= BUY_THRESHOLD AND BBI_Raw < SELL_THRESHOLD;
高位死叉 := 死叉条件 AND BBI_Raw > SELL_THRESHOLD;
中位死叉 := 死叉条件 AND BBI_Raw > MID_LEVEL AND BBI_Raw <= SELL_THRESHOLD;
{=== 信号优先级处理(避免重叠)===}
买入信号 := 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;
{=== 信号图标 - 智能去重 ===}
DRAWICON(低位金叉 AND COUNT(低位金叉, 3) = 1, BUY_SIGNAL_POS - 5, 1); {3周期内首次出现}
DRAWICON(中位金叉 AND COUNT(中位金叉, 3) = 1, ADD_SIGNAL_POS - 5, 1);
DRAWICON(高位死叉 AND COUNT(高位死叉, 3) = 1, SELL_SIGNAL_POS + 5, 2);
DRAWICON(中位死叉 AND COUNT(中位死叉, 3) = 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 BBI_Raw > OVERBOUGHT_LEVEL AND BBI_Raw < BBI_REF1 AND BBI_REF1 < BBI_REF2;
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 BBI_Raw > SELL_THRESHOLD AND 信号强度 > STRONG_SIGNAL_THRESHOLD;
DRAWTEXT(强买入, BUY_SIGNAL_POS, '强'), COLORRED;
DRAWTEXT(强卖出, SELL_SIGNAL_POS, '强'), COLORGREEN;
{=== 背离检测 ===}
{底背离:价格新低但指标未新低}
价格新低 := LOW < REF(LLV(LOW, 10), 1);
指标未新低 := BBI_Raw > REF(LLV(BBI_Raw, 10), 1);
底背离 := 价格新低 AND 指标未新低 AND BBI_Raw < BUY_THRESHOLD;
DRAWICON(底背离, BBI_Raw, 9);
{顶背离:价格新高但指标未新高}
价格新高 := HIGH > REF(HHV(HIGH, 10), 1);
指标未新高 := BBI_Raw < REF(HHV(BBI_Raw, 10), 1);
顶背离 := 价格新高 AND 指标未新高 AND BBI_Raw > SELL_THRESHOLD;
DRAWICON(顶背离, BBI_Raw, 10);
{=== 参数信息显示,短期周期/长期周期/买入阈值/卖出阈值 ===}
DRAWTEXT(ISLASTBAR, 95, '多空指数 v2.0......'), COLORWHITE;
DRAWTEXT(ISLASTBAR, 90, '短13/长34......'), COLORWHITE;
DRAWTEXT(ISLASTBAR, 85, '买30/卖70......'), COLORWHITE;
改进效果总结
可读性提升 - 变量名具有明确业务含义
可维护性增强 - 参数集中管理,修改方便
信号质量优化 - 避免重叠,提高信号准确性
扩展性更好 - 便于后续功能添加和参数优化
这样的改进使得代码既保持了原有功能,又大大提升了可读性和可维护性。