首页 / 交易学院 / 小布知识库 / 指标喷发整体特征计算实战
指标喷发整体特征计算实战
📊

指标喷发整体特征计算实战

用MQL5将喷发点提炼为可量化交易信号

指标策略 难度 · 进阶 2026-07-12 5 分钟阅读
#指标喷发#MQL5开发#整体特征#时间序列

什么是指标喷发

指标喷发是时间序列分析中的一种新方向,其核心不在于研究指标线本身,而是关注指标线进入未来或过去发生的交叉喷发。通过喷发分析,交易者可以预测未来支撑阻力、趋势方向以及过去积累的变动强度。在作者前作中,喷发被定义为所考虑指标特定线交叉点上的一组点,而喷发点具有同类集群倾向,密集集群可吸引或排斥价格。

喷发标绘示例显示,左侧为DCMV指标喷发,右侧为iMA与iEnvelopes指标喷发。喷发图集直观呈现了价格与喷发点的空间关系,为后续整体特征计算提供了可视化基础。

✦ 概念区分
喷发不是传统指标信号,而是多组参数指标线交叉形成的点集,需通过整体特征归纳为量化数据。

选取指标与EA标绘喷发

为计算整体特征,我们选取移动平均线轨道线iEnvelopes与不同周期iMA本身。线数及平均周期、方差为随机选择,只要指标线在空间上有交叉即可标绘喷发。我们创建EA交易作为分析基础程序,利用iMA和iEnvelopes获取计算数据,采用负责任何两条线交叉点计算显示的CEmission类实例。

标绘喷发只需为每条线设两个点,取当前柱与前一柱指标值。前一柱价格静态,当前柱动态,新价格变动持续生成新点。喷发点通过图形对象Text描述,对象锚点对准符号中心,可大范围调整尺寸,为复杂喷发提供潜力。

input int   ma_period=140; // averaging period of the iEnvelopes indicator
double      ENV[]={0.01,0.0165,0.0273,0.0452,0.0747,01234,0.204,0.3373,0.5576,0.9217,1.5237};
int         MA[]={4,7,11,19,31,51,85};
⚠ 常见坑
ENV数组中的01234缺少小数点,应为0.1234,否则偏差值异常导致轨道线错误,实盘需修正。

喷发整体特征的需求与初步计算

将EA放到图表后,得到大量不同颜色点:浅绿为iMA与iEnvelopes上轨交叉,蓝色为下轨交叉,洋红为iMA自交叉。这种混乱图像无法直接自动化交易,我们需要信号、价位等量化特征。整体特征用于归纳喷发数据,也为新型指标市场调查提供机会:整体通道、线、水平、信号等。

首先确定最典型喷发值,计算每类点平均价格并绘制水平线。接着计算每类点平均时间值,在平均价格线标出,得到首批量化特征:喷发特征不静止,始终空间移动。我们还在标记旁显示点数作为权重,并采用百分比:以iMA与iEnvelopes交叉和为100%,洋红自交叉为参考值。

#define     NUMBER_TYPES_POINT   3
double      sum[NUMBER_TYPES_POINT],sumprev[NUMBER_TYPES_POINT];
datetime    sum_time[NUMBER_TYPES_POINT];
int         n[NUMBER_TYPES_POINT],W[NUMBER_TYPES_POINT];
color       colorLine[]={clrAqua,clrBlue,clrMagenta};
ArrayInitialize(n,0);
ArrayInitialize(sum,0.0);
ArrayInitialize(sum_time,0.0);
for(int obj=total-1;obj>=0;obj--)
{
  string obj_name=ObjectName(0,obj,0,OBJ_TEXT);
  datetime obj_time=(datetime)ObjectGetInteger(0,obj_name,OBJPROP_TIME);
  if(obj_time>T[0])
  {
    color obj_color=(color)ObjectGetInteger(0,obj_name,OBJPROP_COLOR);
    double obj_price=ObjectGetDouble(0,obj_name,OBJPROP_PRICE);
    for(int i=ArraySize(n)-1; i>=0; i--)
      if(obj_color==colorPoint[i])
      {
        n[i]++; sum[i]+=obj_price; sum_time[i]+=obj_time;
      }
  }
}
for(int i=ArraySize(n)-1; i>=0; i--)
  if(n[i]>0)
  {
    name="H.line."+(string)i;
    ObjectCreate(0,name,OBJ_HLINE,0,0,0,0);
    ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine[i]);
    ObjectSetDouble(0,name,OBJPROP_PRICE,sum[i]/n[i]);
  }

图形分析绘制整体通道

仅有点百分比仍难直接分析。利用与主喷发点百分比成比例的不同厚度绘制整体曲线,当前部分沿当前与前一柱平均价格线绘制,形成指标喷发主导整体通道。洋红iMA自交叉点在此用作整合移动平均线参考。

进一步考虑平均时间坐标,添加PRICE_MEDIAN线根据更接近末柱的标记颜色改变。同时可计算整体线的二阶喷发(整体线彼此交叉产生新点),重复计算直至不可行,获得多层喷发整体特征。

if(n[ArrayMinimum(n)]>0)
{
  datetime d[2];
  for(int j=0;j<2;j++) d[j]=sum_time[j]/n[j];
  int i=ArrayMinimum(d);
  name="Price.line"+(string)T[1];
  ObjectCreate(0,name,OBJ_TREND,0,0,0);
  ObjectSetInteger(0,name,OBJPROP_WIDTH,8);
  ObjectSetDouble(0,name,OBJPROP_PRICE,0,HL(H[1],L[1]));
  ObjectSetInteger(0,name,OBJPROP_TIME,0,T[1]);
  ObjectSetDouble(0,name,OBJPROP_PRICE,1,HL(H[0],L[0]));
  ObjectSetInteger(0,name,OBJPROP_TIME,1,T[0]);
  ObjectSetInteger(0,name,OBJPROP_COLOR,colorLine1[i]);
}
pEmission=EnvMa.CalcPoint(sumprev[0],sum[0]/n[0],sumprev[2],sum[2]/n[2],T[0]);
if(pEmission.real)
{
  name="test/up"+(string)GTC;
  EnvMa.CreatePoint(name,pEmission,styleUpper2);
}
✦ 性能提醒
图形对象过多会导致策略测试器可视模式速度降至零,需转向时间序列数组方案。

喷发的时间序列与俭省计算

为摆脱大量图形对象,使用专用数组(缓冲区)积累喷发信息,即喷发时间序列。它与标准时间序列不同,数据非严格按时间排序,但时间是关键字段。新元素存于空单元格或原值单元格,通过CTimeEmission类实现写入与读取。

拥有时间序列后,可创建俭省算法计算整体特征,代码变短且速度提高,无需可视化即可测试优化机器人。CTimeEmission类使用ARRMAX与ARRDELTA管理数组大小,Write方法寻找空单元格写入点,Read方法返回整体特征。

struct pIntegral
{
  double y; datetime t; int n;
};
class CTimeEmission
{
private:
  pIntegral time_series_Emission[];
  int size_ts;
  datetime t[1];
public:
  void Write(PointEmission &point);
  pIntegral Read();
};

整体特征在交易中的使用

整体特征可作信号生成器:通道突破、彼此或与价格交叉、改变方向。例如价格向上穿蓝色曲线生成卖出信号,向下穿浅绿曲线生成买入信号。二阶喷发整体特征进一步丰富信号维度。

相比传统指标,喷发整体特征提供动态移动的水平与通道,且通过时间序列实现高速计算,适合自动化策略开发。但需注意洋红自交叉参考值如何融入分析,以及不同周期参数对喷发密度的影响。

⚠ 实操注意
上架或实盘前须在策略测试器无可视化模式验证计算逻辑,避免对象泄漏导致内存占用过高。

总结与对比

指标喷发整体特征计算为市场分析提供新工具。对比传统指标:传统指标给出固定线,喷发给出交叉点集;传统信号静态,喷发整体特征动态移动;传统计算轻量,喷发初版图形密集,优化后用时间序列俭省。本文方法已打开自动化交易策略开发大门,交易者可在其基础上研发通道突破或交叉信号EA。

常见问题

使用iMA和iEnvelopes函数获取句柄,取当前柱与前一柱指标值,通过CEmission类的CalcPoint方法计算两线交叉点,并用CreatePoint以OBJ_TEXT对象绘制。
图形对象过多会使策略测试器可视模式速度降至零,改用CTimeEmission类将数据存入专用数组,可无可视化计算并提高回测速度。
将整体特征绘成通道曲线,价格上穿蓝色曲线做空、下穿浅绿曲线做多,或利用整体线交叉、方向改变作为信号,具体在EA中判断价格与曲线坐标关系。
缺少小数点写成01234会被当作整数1234,导致iEnvelopes偏差极大,轨道线错误,应改为0.1234以保证计算正确。