欢迎光临散文网 会员登陆 & 注册

量化交易软件:指标喷发整体特征的计算

2023-07-28 16:04 作者:bili_45793681098  | 我要投稿

简介

指标喷发代表着时间序列研究领域的一种非常有前景的新方向。其特点在于:分析重点并不在于指标本身,而是其进入未来或过去的喷发。以此为基础,赫兹量化可以针对市场环境做出切实的预测:

  • 未来的支撑位和阻力位;

  • 趋势方向(价格变动);

  • 过去积累的变动强度。

我的前一篇文章《用 MQL5 绘制指标的喷发》讲述的是喷发绘制算法并指定其关键功能。我提醒一下大家:

喷发是所考虑的指标特定线交叉点上的一组点。

反过来,喷发点也有一些特性:

  • 同一类型的喷发点有集群倾向。

  • 密集的集群可吸引价格,或反过来排斥价格。

喷发图集:


图 1. 指标喷发标绘示例左:DCMV 指标的喷发。右:iMAiEnvelopes 指标的喷发。

在阐释喷发整体特性计算的过程中,赫兹量化会如下处理移动平均线轨道线和带有输入参数的移动平均线本身:

//--- external variable for storing averaging period of the iEnvelopes indicator input int   ma_period=140; // averaging period of the iEnvelopes indicator //--- array for storing deviations 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}; //--- array for storing iMA indicator periods int         MA[]={4,7,11,19,31,51,85};

这样一来,赫兹量化会查找选定指标特有线的交叉点。线数及其特征(平均周期与方差)为随机选择。实际上,喷发可利用这些指标的任何一组参数来标绘(只要它们在空间上有交叉)。

现在,指标已选取,赫兹量化继续创建一个 EA 交易,将来用其充当喷发分析的一个基础程序。我们需要从 iMAiEnvelopes 技术指标中获取计算得出的数据。我提议使用《在 EA 交易中使用技术指标的指南》一文中讲到的一种方法。

要标绘需要找到交点的线,赫兹量化只需为每条线设置两个点。由此,只取得两个柱的指标值(比如当前和前一个柱)就足够了。前一柱上的价格是静态,而当前柱上的价格为动态,因此每一新的价格变动均会持续生成新点。代码如下:

//+------------------------------------------------------------------+ //|                                      emission_of_MA_envelope.mq5 | //|                                           Copyright 2013, DC2008 | //|                           https://www.mql5.com/ru/users/DC2008 | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, DC2008" #property link      "https://www.mql5.com/ru/users/DC2008" #property version   "1.00" //--- #include <GetIndicatorBuffers.mqh> #include <Emission.mqh> //--- external variable for storing averaging period of the iEnvelopes indicator input int   ma_period=140;      // averaging period of the iEnvelopes indicator //--- array for storing deviations 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}; //--- array for storing the iMA indicator periods int         MA[]={4,7,11,19,31,51,85}; //--- array for storing pointers to the iMA and iEnvelopes indicators int         handle_MA[]; int         handle_Envelopes[]; //--- market data datetime    T[],prevTimeBar=0; double      H[],L[]; #define     HL(a, b) (a+b)/2 //--- class instances CEmission      EnvMa(0,300); PointEmission  pEmission; //--- drawing styles for points of emission #define     COLOR_UPPER  C'51,255,255' #define     COLOR_LOWER  C'0,51,255' #define     COLOR_MA     C'255,51,255' color       colorPoint[]={COLOR_UPPER,COLOR_LOWER,COLOR_MA}; CodeColor   styleUpper={158,COLOR_UPPER,SMALL}; CodeColor   styleLower={158,COLOR_LOWER,SMALL}; CodeColor   styleMA={158,COLOR_MA,SMALL}; //+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()  {   ArraySetAsSeries(T,true);   ArraySetAsSeries(H,true);   ArraySetAsSeries(L,true); //---   int size=ArraySize(MA);   ArrayResize(handle_MA,size); //--- create a pointer to the object - the iMA indicator   for(int i=0; i<size; i++)     {      handle_MA[i]=iMA(NULL,0,MA[i],0,MODE_SMA,PRICE_MEDIAN);      //--- if an error occurs when creating the object, print the message      if(handle_MA[i]<0)        {         Print("The iMA object[",MA[i],"] has not been created: Error = ",GetLastError());         //--- forced program termination         return(-1);        }     } //---   size=ArraySize(ENV);   ArrayResize(handle_Envelopes,size); //--- create a pointer to the object - the iEnvelopes indicator   for(int i=0; i<size; i++)     {      handle_Envelopes[i]=iEnvelopes(NULL,0,ma_period,0,MODE_SMA,PRICE_MEDIAN,ENV[i]);      //--- if an error occurs when creating the object, print the message      if(handle_Envelopes[i]<0)        {         Print("The iEnvelopes object[",ENV[i],"] has not been created: Error = ",GetLastError());         //--- forced program termination         return(-1);        }     } //---   return(0);  } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)  { //---  } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()  { //--- market data   CopyTime(NULL,0,0,2,T);   CopyHigh(NULL,0,0,2,H);   CopyLow(NULL,0,0,2,L); //--- fill the declared arrays with current values from all indicator buffers   string name;   uint GTC=GetTickCount(); //---- indicator buffers   double   ibMA[],ibMA1[];      // arrays for the iMA indicator   double   ibEnvelopesUpper[];  // array for the iEnvelopes indicator (UPPER_LINE)   double   ibEnvelopesLower[];  // array for the iEnvelopes indicator (LOWER_LINE)   for(int i=ArraySize(handle_MA)-1; i>=0; i--)     {      if(!CopyBufferAsSeries(handle_MA[i],0,0,2,true,ibMA))         return;      //---      for(int j=ArraySize(handle_Envelopes)-1; j>=0; j--)        {         if(!GetEnvelopesBuffers(handle_Envelopes[j],0,2,ibEnvelopesUpper,ibEnvelopesLower,true))            return;         //--- find the intersection point of the iEnvelopes(UPPER_LINE) and iMA indicators         pEmission=EnvMa.CalcPoint(ibEnvelopesUpper[1],ibEnvelopesUpper[0],ibMA[1],ibMA[0],T[0]);         if(pEmission.real) // if the intersection point is found, draw it in the chart           {            name="iEnvelopes(UPPER_LINE)"+(string)j+"=iMA"+(string)i+(string)GTC;            EnvMa.CreatePoint(name,pEmission,styleUpper);           }         //--- find the intersection point of the iEnvelopes(LOWER_LINE) and iMA indicators         pEmission=EnvMa.CalcPoint(ibEnvelopesLower[1],ibEnvelopesLower[0],ibMA[1],ibMA[0],T[0]);         if(pEmission.real) // if the intersection point is found, draw it in the chart           {            name="iEnvelopes(LOWER_LINE)"+(string)j+"=iMA"+(string)i+(string)GTC;            EnvMa.CreatePoint(name,pEmission,styleLower);           }        }      //---      for(int j=ArraySize(handle_MA)-1; j>=0; j--)        {         if(i!=j)           {            if(!CopyBufferAsSeries(handle_MA[j],0,0,2,true,ibMA1))               return;            //--- find the intersection point of the iMA and iMA indicators            pEmission=EnvMa.CalcPoint(ibMA1[1],ibMA1[0],ibMA[1],ibMA[0],T[0]);            if(pEmission.real) // if the intersection point is found, draw it in the chart              {               name="iMA"+(string)j+"=iMA"+(string)i+(string)GTC;               EnvMa.CreatePoint(name,pEmission,styleMA);              }           }        }     } //--- deletion of the graphical objects of emission not to stuff the chart   if(T[0]>prevTimeBar) // delete once per bar     {      int  total=ObjectsTotal(0,0,-1);      prevTimeBar=T[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])            ObjectDelete(0,obj_name);        }      Comment("Emission © DC2008       Objects = ",total);     } //---  }

我不会详细讲解此 EA 交易的每一个细节。这里要注意的主要就是标绘喷发,赫兹量化采用负责任何两条线交叉点的计算和显示的 CEmission 类实例。


量化交易软件:指标喷发整体特征的计算的评论 (共 条)

分享到微博请遵守国家法律