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

量化交易软件:交易货币篮子时可用的形态第二部分

2023-07-21 16:58 作者:bili_45793681098  | 我要投稿

简介

在赫兹量化前面的文章中,谈到了当交易货币篮子时,会有形态出现,赫兹量化精力集中在组合的震荡指标上。我们使用组合的WPR指标作为例子,结果我们取得了一些形态,分析了它们的优点和缺点,并且对在真实交易中使用它们的实用性得出了结论。

但是,这还不够。基于震荡指标的组合指标不能满足所有交易者对货币篮子进行技术分析的需要,交易者的工具箱应该要加强,加上组合的跟随趋势的指标以及它们自己的形态。只有在研究它们之后,我们才能确定技术工具是否已经完备。

让赫兹量化开发一个测试指标来解决这个问题。我们已经进行过这个任务,所以我们可以使用前面文章中的代码来做最小的修改。但是,我们首先应该探讨组合跟随趋势指标的一些特点,我们将使用前面文章中读者已经熟悉的术语。


组合跟随趋势指标的特点

组合跟随趋势指标不能基于任何趋势跟随的父指标,因为有某些限制。

限制 #1. 组合指标应该放到单独的窗口中,在价格图表窗口中显示此指标没有意义。因为平均的原则就是用于构建组合指标,而不清楚它们在这种情况下应该如何显示。另外,使用的测量单位和在图表上使用的是不同的。所以,不管是移动平均,还是布林带,再或者是其它的图表指标都无法用作父指标。

限制 #2. 组合的指标只能显示一个货币的状态;所以,您需要两个组合指标来显示一个货币对的当前状态。它们中的每一个都位于独立窗口中,赫兹量化需要两个额外的窗口。这样分开的原因是缩放尺度的差别。基于震荡指标的组合指标永远在预先定义的限制之内变化,然而,对于跟随趋势指标就不是这样,它们没有已知的最大值或者最小值。这就意味着之前描述过的方法,包括把移动平均应用到两个组合指标的读数上是没有意义的。这样的联合计算在组合跟随趋势指标的时候是不适合的。

父指标列表的限制使我们在最大程度上使用组合的跟随趋势指标,例如,根据预先的检验,在赫兹量化菜单中的跟随趋势指标列表中,只有 ADX 和 StdDev 符合我们的需要,

但是这不是我们放弃任务的理由,赫兹量化将使用提供的工具并开始使用我们已经知道的组合指标 — 篮子货币指数。


使用移动平均的篮子货币指数

让我们开发 testIndexMA.mq5 测试指标,和在这里描述的指标类似,并且加上了移动平均:

//+------------------------------------------------------------------+ //|                                                 testDistance.mq5 | //|                                   2016 MetaQuotes Software Corp. | //|                                              http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link      "http://www.mql5.com" #property version   "1.00" #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots   2 input color   clr= clrGreen; input color   clrMA = clrMagenta; input int maperiod  = 10; //MA 周期数 double ind[],ma[]; //+------------------------------------------------------------------+ //| 自定义指标初始化函数                                                 | //+------------------------------------------------------------------+ //int h,h1; int OnInit()  { //--- 指标缓冲区映射   ArraySetAsSeries(ind,true);   SetIndexBuffer(0,ind);             IndicatorSetString(INDICATOR_SHORTNAME,"testdistance");   IndicatorSetInteger(INDICATOR_DIGITS,2);   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clr);   PlotIndexSetString(0,PLOT_LABEL,"_tstdistance_");       ArraySetAsSeries(ma,true);     SetIndexBuffer(1,ma);   PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE           );   PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_SOLID            );   PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 1            );   PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrMA            );   PlotIndexSetString (1, PLOT_LABEL, "_tstdistance_MA" );         //---   return(INIT_SUCCEEDED);  }   string pair[]={"EURUSD","GBPUSD","AUDUSD","NZDUSD","USDCAD","USDCHF","USDJPY"}; bool bDirect[]={false,false,false,false,true,true,true}; int iCount=7;   double GetValue(int shift)  {   double res=1.0,t;   double dBuf[1];   for(int i=0; i<iCount; i++)     {      t=CopyClose(pair[i],PERIOD_CURRENT,shift,1,dBuf);      if(!bDirect[i]) dBuf[0]=1/dBuf[0];      res*=dBuf[0];     }//end for (int i = 0; i < iCount; i++)   return (NormalizeDouble(MathPow (res, 1/(double)iCount), _Digits) );    }   //+------------------------------------------------------------------+ //| 自定义指标迭代函数                                                  | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total,                const int prev_calculated,                const datetime &time[],                const double &open[],                const double &high[],                const double &low[],                const double &close[],                const long &tick_volume[],                const long &volume[],                const int &spread[])  {   if(prev_calculated==0 || rates_total>prev_calculated+1)     {      int rt=rates_total;      for(int i=1; i<rt; i++)        {         ind[i]= GetValue(i);        }         rt -= maperiod;           for (int i = 1; i< rt; i++)           {            ma[i] = GetMA(ind, i, maperiod, _Digits);           }             }   else     {         ind[0]= GetValue(0);          ma[0] = GetMA(ind, 0, maperiod, _Digits);     } //--- 返回 prev_calculated 的值用于下一次调用   return(rates_total);  } void OnDeinit(const int reason)  {   string text;   switch(reason)     {      case REASON_PROGRAM:         text="指标通过调用 ExpertRemove() 函数终止运行";break;      case REASON_INITFAILED:         text="这个数值表示 OnInit() 处理函数 "+__FILE__+" 返回了非零数值";break;      case REASON_CLOSE:         text="终端已经被关闭"; break;      case REASON_ACCOUNT:         text="账户已经改变";break;      case REASON_CHARTCHANGE:         text="交易品种或者时段已经改变";break;      case REASON_CHARTCLOSE:         text="图表被关闭";break;      case REASON_PARAMETERS:         text="输入参数已经改变";break;      case REASON_RECOMPILE:         text="程序 "+__FILE__+" 被重新编译";break;      case REASON_REMOVE:         text="程序 "+__FILE__+" 被从图表上删除";break;      case REASON_TEMPLATE:         text="图表上应用了新的模板";break;      default:text="其它原因";     }   PrintFormat("%s",text);  } //+------------------------------------------------------------------+ double GetMA(const double& arr[], int index , int period, int digit) {   double m = 0;   for (int j = 0; j < period; j++)  m += arr[index + j];   m /= period;   return (NormalizeDouble(m,digit));        }

使用这组输入数据,指标画出了带有移动平均的美元指数。把第49行和第50行这样修改:

string pair[]={"EURUSD", "EURJPY", "EURCHF", "EURGBP", "EURNZD", "EURCAD", "EURAUD"};    bool bDirect[]={true,true,true,true,true,true,true};

再次编译文件 testIndexMA2.mq5. 结果我们会得到类似的指标,显示了欧元指数。把它放到 EURUSD H1:

编辑切换为居中


赫兹量化对指标的绝对值并不感兴趣。让我们对移动平均指标的交叉点来计数,计算潜在的入场点。就像在前面的文章中所说的,这些点应该在烛形关闭的时候固定,赫兹量化正是这样做的。使用垂直线标记侦测到的进场点: 蓝色表示买入而红色表示卖出,结果明显是正面的,但是,利润相对较小并且不稳定,所以应该增加获利的能力。首先,不要忘记货币对的第二个货币,并把美元指数指标加到一个独立的窗口中:


编辑切换为居中

用垂直线标记移动平均和美元指数图的交叉。让我们分析结果,


量化交易软件:交易货币篮子时可用的形态第二部分的评论 (共 条)

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