文章 "学习如何基于 ADX 设计交易系统" - 页 2

 
嗨,我刚开始学习 adx 和 dmi 有几个月了,我希望有一个这方面的 ea,因为这是滞后指标,也许时间框架 M15 更合适,你能做一个吗? 我在哪里可以联系到你的条款和条件?
 

你好,穆罕默德、

而不是

   double ADXArray0[];
   double ADXArray1[];
...
   double ADXValue=NormalizeDouble(ADXArray0[0],2);
   double ADXValueLast=NormalizeDouble(ADXArray1[1],2);

还不够吗?

      double ADXArray[];
...
      double ADXValue=NormalizeDouble(ADXArray[0],2);
      double ADXValueLast=NormalizeDouble(ADXArray[1],2);

谢谢、

胡安-路易斯

Learn how to design a trading system by ADX
Learn how to design a trading system by ADX
  • www.mql5.com
In this article, we will continue our series about designing a trading system using the most popular indicators and we will talk about the average directional index (ADX) indicator. We will learn this indicator in detail to understand it well and we will learn how we to use it through a simple strategy. By learning something deeply we can get more insights and we can use it better.
 
Juan Luis De Frutos Blanco #:

你好,穆罕默德、

而不是

还不够吗?

谢谢

胡安-路易斯

你好,胡安、

您说的对,也可以像您提到的那样。


谢谢、

 
好文章:我目前正在构建的 EA 的支柱之一。
感谢穆罕默德。🏅🏅🏅

 
我的想法是,当 ADX 线超过 25 且 dmi 加线上穿 dmi 减线时,蜡烛的颜色会变成绿色,表明趋势看涨,反之亦然。
 
1
 

这篇文章非常出色!不过,我发现了其中一个错误,而且我还发现了一个提供提示的机会。 该错误与 CopyBuffers 以及对相同句柄使用相同缓冲区索引 有关。 在 MQL5 中,指标句柄 只能在调用 CopyBuffer() 函数时使用相应的唯一缓冲区索引访问特定缓冲区


因此,当您输入

CopyBuffer(ADXDef,0,0,3,ADXArray0);
CopyBuffer(ADXDef,0,0,2,ADXArray1);
CopyBuffer(ADXDef,1,0,3,PDIArray);
CopyBuffer(ADXDef,2,0,3,NDIArray);


应该是

CopyBuffer(ADXDef,0,0,3,ADXArray0);
CopyBuffer(ADXDef,1,0,2,ADXArray1);
CopyBuffer(ADXDef,2,0,3,PDIArray);
CopyBuffer(ADXDef,3,0,3,NDIArray);


有关指标句柄和缓冲区的要点是
  • 唯一索引:每个指标句柄管理一组内部缓冲区,每个缓冲区由唯一索引(从 0 开始)标识。
  • 一个句柄,一个索引 使用 CopyBuffer(handle, buffer_index, ...)时 ,您 需要 指定要从与 句柄关联的哪个 缓冲区 复制数据。
  • 多次调用:如果一个指标有多个数据缓冲区(例如,一个通道的高低波段),则必须多次调用 CopyBuffer(),使用相同的句柄,但使用不同的缓冲区索引(例如,索引 0 表示高波段,索引 1 表示低波段)
同一个 句柄中,不能对相同 的缓冲区索引调用两次不同的 CopyBuffer,但却指向不同的数据,因为索引是该句柄中数据序列的唯一标识符。


我猜这是个错别字,但觉得还是应该指出来,以防其他人混淆。 在完整代码中这是正确的,只是在示例中没有。


现在是小提示...

这不是什么大问题,但绝对能让你在写作时少敲几下键盘:


 Comment("Simple ADX System - Signal is ",signal,"\n""ADX Value is ", ADXValue,
   "\n""ADX Value Last is ", ADXValueLast, "\n""+DI Value is ", PDIValue,
   "\n""-DI Value is ", NDIValue);


为了简化,你可以这样做:


 Comment("Simple ADX System - Signal is ",signal,"\nADX Value is ", ADXValue,
   "\nADX Value Last is ", ADXValueLast, "\n+DI Value is ", PDIValue,
   "\n-DI Value is ", NDIValue);


除此之外,我觉得这篇文章信息量很大,内容也很详细。


 

我唯一要补充的是在 OnInit() 和 DeOnit() 中的错误处理,并将变量名从 ADXDef 改为 h_ADXDef(或 handle_ADXDef),这样在阅读代码时会更清楚,也能更好地识别变量的具体用途。

在 OnInit() 中:


  if(h_ADXDef == INVALID_HANDLE)
   {
      Print("Error creating indicator handles: ", GetLastError());
      return(INIT_FAILED);
   }


以及 DeOninit() 中:


if(h_ADXDef != INVALID_HANDLE) IndicatorRelease(h_ADXDef);