文章 "ZigZag(之字折线)的力量(第一部分)。 开发指标基类"

 

新文章 ZigZag(之字折线)的力量(第一部分)。 开发指标基类已发布:

许多研究人员对于判定价格行为没有给予足够的重视。 与此同时,还使用各种复杂方法,而这些方法通常只是“黑盒子”,例如机器学习或神经网络。 在这种情况下显现出的最严重问题就是提交何种数据来训练特定模型。

一般来说,ZigZag 类型的指标是基于柱线的最高点和最低点建立的,没有考虑点差因素。 本文介绍了一个修订版本,其中针对更低的 ZigZag 极值点构造线段时考虑了点差。 假设成交将在交易系统的价格通道内执行。 这很重要,因为经常会发生买入价格(ask)明显高于卖出价格(bid)。 例如,这可能发生在夜间。 因此,仅基于卖出价格构建指标是错误的。 毕竟,如果不可能以这些价格买入,那么基于柱线低点构建指标的更低极值点是没有意义的。 当然,在交易条件中可以考虑点差,但所有内容在图表上一目了然时,当然更好。 这可简化交易策略的开发,因为最初的一切似乎都很合理。

此外,您可能还希望查看更新后的所有 ZigZag 极值点。 在这种情况下,全貌变得更加完整。 现在我们来研究指标代码。 我们只讨论基本功能和函数。

图例 6. 接收三个指定线段内数据

作者:Anatoli Kazharski

 
但是,让我们不要用各种 zigagulas 来玷污包括计量经济学 在内的神圣(MO):)。这并不严肃。这里的抽象程度完全不同。
 

作者以前的可视化作品广为人知,也很有趣。

在构建指标时考虑价差的想法是完全正确的,因为这是一个重要的价格参数,但由于某些原因,经典指标并没有考虑到这一点。

至于 ZigZag 指标,即使在您的版本中,从图片(可视化)上也可以清楚地看到,趋势(如果我理解正确的话--绿线)有时会有临界滞后。

原因在于,如果我们将趋势作为交易标准(否则为什么要使用 ZigZag 指标),我们不仅要考虑价差,还要考虑动态因素,首先是后向发射的振幅(在构建趋势时要考虑)。然而,这是传统分析在确定一般趋势时所犯的错误。

看看您的 Expert Advisor 的测试结果很有意思(我们可能会在文章的续篇中看到)。

文章很有用,可视化一如既往地清晰。感谢作者的工作。

 

ZigZag 可以让你找到任何复杂程度的抽象。

下一篇文章将举例说明如何使用。

 

这篇文章需要替换文件档案。有一些重要更正。

附加的文件:
Files.zip  19 kb
 
恐怕这是不正确的
low_ask_buffer[i]  =low[i]+(spread[i]*_Point);


在真实的刻度上运行它,进行比较。

 

fxsaber:
Боюсь, это неверно

low_ask_buffer[i]  =low[i]+(spread[i]*_Point);

在真正的虱子上运行它,进行比较。

我同意。最小点差恰好是买入价达到最低水平时,这不是事实。

而历史数据(以条为单位)包含的正是最小点差。

因此,我们需要获取真实价位 -CopyTicks(),并确定最低买入价与最低卖出价(低价卖出)之间的最小差价(ask-bid)。

这是您想说的吗?

 
Anatoli Kazharski:

同意。最低点差恰好是买入价达到最低水平时,这并不是事实。

而历史数据(柱状)恰恰包含了最小价差。

因此,我们需要获取真实点差 -CopyTicks(),并确定最低买入价与最低卖出价之间的最小差价(ask-bid)

这是你想说的吗?

可能 CopyTicks 对于这样的事情来说有点昂贵。追逐真实的刻度线并通过刻度线建立 ZigZag 更简单。坦率地说,我不明白您为什么决定陷入 ZZ.... 的指标执行中。反正写 TS 时也不需要可视化。

我曾经直接在智能交易系统中发布过完全相同的 ZZ。它运行得很快,可能不需要其他东西。

 

如果您想获得真正的 Low Ask,请将此代码添加到指标中。

外部参数用于启用该模式:

input bool  RealTicksMode  =false;   // 实点模式

从真实跳动数据中获取最低卖出价的方法:

//+------------------------------------------------------------------+
//| 从跳动数据中返回最低卖出价
//+------------------------------------------------------------------+
double GetLowAsk(const int i,const datetime &time[])
  {
//--- 如果禁用了真实刻度模式,则退出
   if(!RealTicksMode)
      return(0.0);
//--- 排除最后(当前)条形图
   if(i>=g_rates_total)
      return(0.0);
//---
   MqlTick  ticks[];
   double   low_ask  =0.0;
   datetime end_time =time[i]+PeriodSeconds();
//--- 获取指定范围内的刻度线
   int copied_total=CopyTicksRange(_Symbol,ticks,COPY_TICKS_ALL,(ulong)time[i]*1000,(ulong)end_time*1000);
   if(copied_total>0)
     {
      low_ask=ticks[0].ask;
      for(int k=1; k<copied_total; k++)
        {
         if(ticks[k].ask<low_ask)
            low_ask=ticks[k].ask;
        }
     }
//---
   return(low_ask);
  }

//---

如果无法获取最低卖出价,则使用最小点差。

//+------------------------------------------------------------------+
//| 填充指标缓冲区 "最高出价 "和 "最低要价"。
//+------------------------------------------------------------------+
void FillAskBidBuffers(const int i,const datetime &time[],const double &high[],const double &low[],const int &spread[])
  {
//--- 如果未到达开始日期,则退出
   if(time[i]<first_date)
      return;
//--- 从跳动数据中获取最小卖出价
   double low_ask=GetLowAsk(i,time);
//--- 保存数值
   high_bid_buffer[i] =high[i];
   low_ask_buffer[i]  =(low_ask>0)? low_ask : low[i]+(spread[i]*_Point);
  }
 

结果


 
fxsaber:

老实说,我不明白你为什么决定抓住 ZZ..... 的指标设计不放。

供学习和研究之用。