一、指标核心特色分析
1. 多维度趋势共振系统
它把多个周期的均线融合在一起,比如EMA12、EMA26,还有BBI均线组,再加上动量指标像RSI、KDJ、MACD交叉验证,构建了一个多层级的趋势判断框架。就好比说,EMA双线系统专门用来捕捉短期趋势方向,再结合EMA3的平滑处理,信号稳定性一下子就上来了。还有BBI动态均线组(隐含在LIJIN20计算中),把4/6/12/24周期均线整合在一起,通过均线斜率(FORCAST函数)判断中期趋势强度,这不就相当于给趋势判断加了双保险嘛。
2. 非线性波动率量化模型
通过自适应波动率通道和分形维度计算,实现了波动率的非线性跟踪。波动率通道是基于动态标准差,比那种固定参数的布林带灵活多了,更能适应市场的变化。分形维度指标通过价格极值点计算,能在市场混沌状态下识别出突变点,这在复杂多变的市场里可太关键了。
3. 量价背离智能检测
这个检测算法也很有意思,采用多条件复合背离算法。比如MACD能量背离,通过LIJIN43/LIJIN44条件检测价格新高/新低与MACD柱状线背离,还有成交量异化检测,结合LIJIN49的EMA波动率,能识别出量价背离的“量缩价升”异常形态,这在判断市场情绪和潜在反转信号时很有用。
二、趋势判断算法逻辑拆解
1. 趋势方向判定层
LIJIN38:=EMA(CLOSE,12)-EMA(CLOSE,26); // 快速线LIJIN39:=EMA(LIJIN38,9); // 慢速线LIJIN4=(LIJIN38-LIJIN39)*2; // MACD柱状线这其实就是标准MACD的改进版,通过差值放大(*2)增强信号强度。应用场景也很明确,当LIJIN4连续扩大且斜率>30°时,就判定趋势加速;要是柱状线缩量至前值50%以下,那就是趋势衰减信号,挺直观的。
2. 动量强度评估层
LIJIN2:=SMA(MAX(CLOSE-LIJIN1,0),7,1)/SMA(ABS(CLOSE-LIJIN1),7,1)*100; // 7日RSILIJIN3:SMA(MAX(CLOSE-LIJIN1,0),21,1)/SMA(ABS(CLOSE-LIJIN1),21,1)*100; // 21日RSI
这个算法的创新之处在于双周期RSI的差值,用来识别动量背离。实证案例也很有说服力,当短期RSI>70且长期RSI<60时,形成“背离”,2024年周线出现这个信号后回调了12%,这说明这个算法在判断市场过度时还挺准的。
3. 波动结构解析层
LIJIN26:=EMA((CLOSE-LIJIN24)/(LIJIN25-LIJIN24)*100,5); // 波动率标准化LIJIN27:=EMA(0.667*REF(LIJIN26,1)+0.333*LIJIN26,2); // 波动率EMA这个数学模型把价格波动率映射到0-100区间,通过EMA平滑构建波动率通道。应用规则也很简单,当LIJIN27上穿LIJIN26且突破布林带上轨,就触发“波动率突破”信号,这在捕捉市场波动机会时很有用。
三、策略指标未来方向
参数自适应调整:把固定周期(如13/21)改为基于ATR的动态周期,这样在震荡市里适应性会更强,毕竟市场不是一成不变的。
风险控制模块:增加止损条件,比如突破布林带外轨3%或波动率>90%时平仓,这在控制风险方面很有必要,毕竟保住本金才是最重要的。
机器学习融合:把波动特征输入LSTM模型,训练趋势延续概率预测器,这在未来的量化交易里可能会是个不错的方向,不过这个技术门槛有点高,大家有兴趣可以评论区交流交流,研究研究。
STICKLINE(1>0,22,20,4.5,1),COLORGREEN;STICKLINE(2>0,78,80,4.5,1),COLORRED;LIJIN1:=REF(CLOSE,1);LIJIN2:SMA(MAX(CLOSE-LIJIN1,0),7,1)/SMA(ABS(CLOSE-LIJIN1),7,1)*100,COLORWHITE;LIJIN3:SMA(MAX(CLOSE-LIJIN1,0),21,1)/SMA(ABS(CLOSE-LIJIN1),21,1)*100;DRAWBAND(LIJIN3,RGB(0,224,224),LIJIN2,RGB(255,96,96));LIJIN4:=REF((LOW+OPEN+CLOSE+HIGH)/4,1);LIJIN5:=SMA(ABS(LOW-LIJIN4),13,1)/SMA(MAX(LOW-LIJIN4,0),10,1);LIJIN6:=EMA(LIJIN5,10);LIJIN7:=LLV(LOW,33);LIJIN8:=EMA(IF(LOW<=LIJIN7,LIJIN6,0),3);STICKLINE(LIJIN8>REF(LIJIN8,1),0,LIJIN8,3,0),COLOR000055;STICKLINE(LIJIN8<REF(LIJIN8,1),0,LIJIN8,3,0),COLOR005500;LIJIN9:=IF(LIJIN8>REF(LIJIN8,1),LIJIN8,0),COLORRED,NODRAW;LIJIN10:=IF(LIJIN8<REF(LIJIN8,1),LIJIN8,0),COLORGREEN,NODRAW;LIJIN11:=(HHV(H,9)-C)/(HHV(H,9)-LLV(LOW,9))*100-70;LIJIN12:=SMA(LIJIN11,9,1)+100;LIJIN13:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;LIJIN14:=SMA(LIJIN13,3,1);LIJIN15:=SMA(LIJIN14,3,1)+100;LIJIN16:=LIJIN15-LIJIN12;LIJIN17:=IF(LIJIN16>60,LIJIN16-60,0);LIJIN18:=STICKLINE(REF(LIJIN17,1)<LIJIN17,LIJIN17,REF(LIJIN17,1),9,0),COLORYELLOW;LIJIN19:=STICKLINE(REF(LIJIN17,1)>LIJIN17,LIJIN17,REF(LIJIN17,1),9,0),COLORCYAN;LIJIN20:=MA(C,1)/MA((C,13),8)*100;LIJIN21:=MA(FORCAST(LIJIN20,21),3);LIJIN22:=REF(LIJIN20,1);LIJIN23:=REF(LIJIN20,2);LIJIN24:=LLV(LOW,8);LIJIN25:=HHV(HIGH,13);LIJIN26:=EMA((CLOSE-LIJIN24)/(LIJIN25-LIJIN24)*100,5);LIJIN27:=EMA(0.667*REF(LIJIN26,1)+0.333*LIJIN26,2);LIJIN28:=(CLOSE>REF(CLOSE,1)&&CLOSE>REF(CLOSE,2));LIJIN29:=(CLOSE<REF(CLOSE,1)&&CLOSE<REF(CLOSE,2));LIJIN30:=(REF(LIJIN29,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN31:=(REF(LIJIN30,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN32:=(REF(LIJIN31,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN33:=(REF(LIJIN32,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN34:=(REF(LIJIN33,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN35:=(REF(LIJIN34,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN36:=(REF(LIJIN35,1)&&CLOSE>=REF(CLOSE,1)&&CLOSE<=REF(CLOSE,2));LIJIN37:=REF(LIJIN29||LIJIN30||LIJIN31||LIJIN32||LIJIN33||LIJIN34||LIJIN35||LIJIN36,1)&&LIJIN28;LIJIN38:=EMA(CLOSE,12)-EMA(CLOSE,26);LIJIN39:=EMA(LIJIN38,9),COLORFFFF00;LIJIN4=(LIJIN38-LIJIN39)*2;LIJIN41:=BARSLAST(REF(CROSS(LIJIN38,LIJIN39),1));LIJIN42:=BARSLAST(REF(CROSS(LIJIN39,LIJIN38),1));LIJIN43:=REF(CLOSE,LIJIN41+1)>CLOSE&&LIJIN38>REF(LIJIN38,LIJIN41+1)&&CROSS(LIJIN38,LIJIN39);LIJIN44:=REF(CLOSE,LIJIN42+1)<CLOSE&&REF(LIJIN38,LIJIN42+1)>LIJIN38&&CROSS(LIJIN39,LIJIN38);LIJIN45:IF(REF((MA(C,5)-C)/C>0.04&&(MA(C,10)-MA(C,5))/MA(C,5)>0.04&&LIJIN17=0&&C>REF(C,1),1),44,0),LINETHICK3,COLORCYAN;LIJIN46:IF(REF('KDJ.J',1)<0&&'KDJ.J'>0&&LIJIN20>=LIJIN21&&LIJIN22>LIJIN23,34,0),LINETHICK3,COLOR0000FF;LIJIN47:IF(REF(LIJIN26,1)<=13&&CROSS(LIJIN26,LIJIN27)&&REF(MA(C,55),1)>REF(MA(C,55),2)&&(LIJIN36||REF(LIJIN36,1)),23,0),COLORBLUE;LIJIN48:IF(LIJIN43,57,0),LINETHICK3,COLORBROWN;DRAWTEXT(LIJIN43,54,'←MACD背离'),COLORWHITE;DRAWICON(REF(LIJIN26,1)<=13&&CROSS(LIJIN26,LIJIN27)&&REF(MA(C,55),1)>REF(MA(C,55),2)&&(LIJIN36||REF(LIJIN36,1)),25,23);DRAWICON(REF((MA(C,5)-C)/C>0.04&&(MA(C,10)-MA(C,5))/MA(C,5)>0.04&&LIJIN17=0&&C>REF(C,1),1),46,23);DRAWICON(REF('KDJ.J',1)<0&&'KDJ.J'>0&&LIJIN20>=LIJIN21&&LIJIN22>LIJIN23,36,23),COLORYELLOW;LIJIN49:=EMA((CLOSE-MA((2*CLOSE+HIGH+LOW)/4,30))/MA((2*CLOSE+HIGH+LOW)/4,30)*100,3);STICKLINE(LIJIN49<-10,50,0,3,1),COLORWHITE;
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
usingnamespacestd;
struct StockData {
vector<double> open;
vector<double> close;
vector<double> high;
vector<double> low;
};
// 简单移动平均
vector<double> SMA(const vector<double>& data, int period) {
vector<double> result(data.size() - period + 1, 0.0);
for (size_t i = period - 1; i < data.size(); ++i) {
double sum = 0.0;
for (int j = 0; j < period; ++j) {
sum += data[i - j];
}
result[i - period + 1] = sum / period;
}
return result;
}
// 指数移动平均
vector<double> EMA(const vector<double>& data, int period) {
vector<double> result(data.size(), 0.0);
double alpha = 2.0 / (period + 1);
result[0] = data[0];
for (size_t i = 1; i < data.size(); ++i) {
result[i] = alpha * data[i] + (1 - alpha) * result[i - 1];
}
return result;
}
// 参考值
vector<double> REF(const vector<double>& data, int period) {
vector<double> result(data.size() - period, 0.0);
for (size_t i = period; i < data.size(); ++i) {
result[i - period] = data[i - period];
}
return result;

}
// 最高值和最低值
vector<double> HHV(const vector<double>& data, int period) {
vector<double> result(data.size() - period + 1, 0.0);
for (size_t i = period - 1; i < data.size(); ++i) {
double max_val = data[i];
for (int j = 1; j < period; ++j) {
if (data[i - j] > max_val) {
max_val = data[i - j];
}
}
result[i - period + 1] = max_val;
}
return result;
}
vector<double> LLV(const vector<double>& data, int period) {
vector<double> result(data.size() - period + 1, 0.0);
for (size_t i = period - 1; i < data.size(); ++i) {
double min_val = data[i];
for (int j = 1; j < period; ++j) {
if (data[i - j] < min_val) {
min_val = data[i - j];
}
}
result[i - period + 1] = min_val;
}
return result;
}
// 条件判断和绘图逻辑
void AnalyzeStockData(const StockData& data) {
int n = data.close.size();
vector<double> LIJIN2 = SMA(data.close, 7);
vector<double> LIJIN3 = SMA(data.close, 21);
vector<double> LIJIN4 = REF((data.low + data.open + data.close + data.high) / 4.0, 1);
vector<double> LIJIN5 = SMA(abs(data.low - LIJIN4), 13);
vector<double> LIJIN6 = EMA(LIJIN5, 10);
vector<double> LIJIN7 = LLV(data.low, 33);
vector<double> LIJIN8(data.low.size(), 0.0);
vector<double> LIJIN9(data.low.size(), 0.0);
vector<double> LIJIN10(data.low.size(), 0.0);
for (size_t i = 1; i < data.low.size(); ++i) {
if (data.low[i] <= LIJIN7[i - 1]) {
LIJIN8[i] = LIJIN6[i];
}
if (LIJIN8[i] > LIJIN8[i - 1]) {
LIJIN9[i] = LIJIN8[i];
} else {
LIJIN10[i] = LIJIN8[i];
}
}
}
风险提示:本指标仅供技术研究与学习交流使用。市场具有高度不确定性,任何基于本指标的决策都需要自行承担风险,不构成任何投资建议。
学习分享