文章 "开发先进的 ICT 交易系统:在指标中实现订单区块"

 

新文章 开发先进的 ICT 交易系统:在指标中实现订单区块已发布:

在本文中,我们将学习如何创建一个指标来检测、绘制订单区块并提醒订单块的缓解。我们还将详细研究如何在图表上识别这些区块,设置准确的提醒,并使用矩形可视化它们的位置,以更好地了解价格行为。该指标将成为遵循聪明钱概念和内圈交易者(ICT,Inner Circle Trader)方法的交易者的关键工具。

订单区块是图表上可能等待成交的挂单的区域。

这通常发生在大型市场参与者(如金融机构)想要进入重要头寸,但缺乏足够的流动性来一次执行整个订单而不影响市场时。根据供需的基本规律,执行部分订单会推高价格(在买入的情况下),积极寻找能够提供完成交易所需流动性的卖家。

由于机构参与者无法在不引起重大价格变动的情况下一次性执行全部订单,因此他们将订单分成更小的部分。这使他们能够在完全进入头寸之前完成交易,而价格不会大幅波动。

根据这一概念,我们可以将价格图上的这些区域识别为供需严重失衡的区域(无论是买入还是卖出)。下面,我们将探索三种识别这些区域的方法以及如何在代码中实现它们。


作者:Niquel Mendoza

 

再见,门多萨

感谢您的努力。

我的问题是;因为我们使用的是OnCalculate 函数

int OnCalculate(const int rates_total、

const int prev_calculated、

const datetime &time[],// Open 时间序列

const double &open[],// 开仓价格时间序列

const double &high[],// 高价 时间序列

const double &low[],// 低价时间序列

const double &close[],// 收盘价时间序列

const long &tick_volume[],// 成交量的时间序列

const long &volume[],// 条 价格的时间序列

const int &spread[])//


为什么要创建新数组并重新排列它们?

 
Ahmed Fouad Abdellatief OnCalculate 函数:

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[])//


为什么要创建新数组并重新排列它们?

你好,艾哈迈德,非常感谢你的评论。您说得没错。没有必要创建新数组,因为 OnCalculate 函数已经为我们提供了可以使用的所有数据。我当时是出于习惯才这么做的,但最好还是直接使用已有的数据。 顺便说一下,如果您想要最新的代码,我把它放在这里给您。 在这段新代码中,使用的是默认的数组,检测顺序块的逻辑是一样的。
附加的文件:
 
Niquel Mendoza #:
datetime  mitigados_alcsitas(double price, const double &lowArray[], const  datetime &Time[], datetime start, datetime end)
 {
  int startIndex = iBarShift(_Symbol, PERIOD_CURRENT, start);
  int endIndex = iBarShift(_Symbol, PERIOD_CURRENT, end);

  NormalizeDouble(price, _Digits);
  for(int i = startIndex - 2 ; i >= endIndex + 1 ; i--)
   {
    if(price > lowArray[i])
     {
      return Time[i]; //si encuentra que si hubo retorna el tiempo de la vela donde hubo la mitigacion
      Print("el orderblock tuvo mitigaciones", TimeToString(end));
     }
   }

  return 0; //En caso no se haya encontrado niguna mitigacion retorna 0
 }

以此类推,四个功能相邻。

 
trader6_1 #:

以此类推,四个功能相邻。

嗨,你说得太对了。我误以为 NormalizeDouble 是通过引用工作的。实际上,它返回的是一个四舍五入的值,要让变量接受这个值,必须明确地将其赋值给变量。很抱歉,我想我是在编写代码时学到的,所以才会这样。真的很抱歉。我在这里使用 NormalizeDouble 更多是为了以防万一,尽管我不认为它对检查看涨订单块是否得到缓解有什么重大影响(根据我的测试)。感谢您指出这一点。我们可以选择直接指定 "price = NormalizeDouble(price,_Digits)",或者删除这一行,因为正常化似乎不会对审查产生重大影响。

 
非常感谢,感谢您的分享。请继续下一部分。
 
Niquel Mendoza #:
你好,艾哈迈德,非常感谢你的评论。您说得没错。没有必要创建新数组,因为 OnCalculate 函数已经为我们提供了可以使用的所有数据。我当时是出于习惯才这么做的,但最好还是直接使用已有的数据。 顺便说一下,如果您想要最新的代码,我可以把它放在这里。 在这段新代码中,使用的是默认的数组,检测顺序块的逻辑是一样的。
Niquel Mendoza#:
你好,Ahmed,非常感谢你的评论。您说得没错。没有必要创建新数组,因为 OnCalculate 函数已经为我们提供了所有可用数据。我当时是出于习惯才这么做的,但最好还是直接使用已有的数据。 顺便说一下,如果您想要最新的代码,我可以把它放在这里。 在这段新代码中,使用的是默认的数组,检测顺序块的逻辑是一样的。

创建单独数组的另一个原因是,如果您决定将该逻辑纳入 EA,则没有 OnCalculate 函数。 此外,如果您想制作多货币或多时间框架版本,则需要多个数组或多 Demen 数组,而 90% 的工作已经完成。

我的问题是,为什么大多数开发人员都将数据转化为时间序列? 我将一个 MQ4 EA 转换为 MQ5,但没有意识到时间序列是可用的,因此我将所有数组保留为零基数组,而不是时间序列。我发现这让生活变得简单多了,因为数据和支持数组之间是 1 对 1 的对应关系,不再需要为时间序列重新设置、调整大小和重新设置,只需调整大小,最重要的是只需一个条形编号系统。 对于那些坚持使用时间序列的 Metaquotes 函数,我在调用时进行了反向指数化。


您好,我刚刚下载了您的源代码第 1 版,编译后应用于 H4 欧元兑美元图表,结果什么也没出现。 我进入属性面板,什么也没改动,然后关闭,结果出现了 png。 只有绿色条形图,没有红色条形图,而且一旦开始,就不会终止。 有什么建议吗?我从上面的讨论中下载了第 2 部分,它有大致相同的问题,但也有三个较新的问题。 开始停止绿色红色的问题很明显。 此外,似乎还有不同的标准,因为波段数并不完全一致。 此外,我试着将绿色改为 clrLime,它发生了变化,但肯定不是 Lime。

另外,您是如何制作动画的? 您使用的是策略测试器吗? 我这样问是因为在可视模式下测试 EA 或测试指标时,我无法让策略测试器在屏幕上正确显示。
附加的文件:
EURUSDH4_1.png  72 kb
EURUSDH4.png  63 kb
 

你好,尼克尔、

我在此附上稍作修改的第 2 部分。

我在 STDLIB.EX5 中添加了 ErrorDescription(errornumber),以扩展您的各种错误信息。 由于某些原因,我无法将导入直接放到指标中,因此我的变通方法是将其包含在一个包含文件 BlockOrder Common.mqh 中,在该文件中它确实对我有效。 您能否通过谷歌翻译运行指标,将文本转换成英文?

我还在程序中添加了版本号 2.01。通过定义,我为 RectangleCreate 添加了版本号作为前缀,这样就可以同时运行版本 1 和版本 2,尽管我没有更改版本 1。

作为一项建议,您可以计算交易量的移动平均值,并将其显示在屏幕下方。 我想这需要进行一些小数点调整。


我期待着您的下一次更新


科达角

附加的文件:
 
CapeCoddah #:

创建单独的数组还有另一个原因。 如果您决定将逻辑纳入 EA,则没有 OnCalculate 函数。 此外,如果您想制作多货币或多时间框架版本,则需要多个数组或多 Demen 数组,而 90% 的工作已经完成。

我的问题是,为什么大多数开发人员都将数据转化为时间序列? 我将一个 MQ4 EA 转换为 MQ5,但没有意识到时间序列是可用的,因此我将所有数组保留为零基数组,而不是时间序列。我发现这让生活变得简单多了,因为数据和支持数组之间是 1 对 1 的对应关系,不再需要为时间序列重新设置、调整大小和重新设置,只需调整大小,最重要的是只需一个条形编号系统。 对于那些坚持使用时间序列的 Metaquotes 函数,我在调用时进行了反向指数化。

你好 ,CapeCoddah,就我而言,我通常使用时间序列形式的数组来处理价格数据或指标,这主要是出于方便和习惯。不过,我知道这并不总是使用数组的最佳理由。对于指标而言,使用基于零的数组往往更实用,因为它们简化了索引管理,减少了不断重新初始化或调整大小的需要。在我的例子中,在对订单区块指标进行编程时,我选择使用时间序列,因为我从一开始就是这样构建订单区块检索的。

 
CapeCoddah #:

您好,我刚刚下载了您的源代码第 1 版,编译后应用于 H4 欧元兑美元图表,结果什么也没出现。 我进入属性面板,什么也没改动,然后关闭,结果出现了 png。 只有绿色条形图,没有红色条形图,而且一旦开始,就不会终止。 有什么建议吗?我从上面的讨论中下载了第 2 部分,它有大致相同的问题,但也有三个较新的问题。 开始停止绿色红色的问题很明显。 此外,似乎还有不同的标准,因为波段数并不完全一致。 此外,我试着将绿色改为 clrLime,它发生了变化,但肯定不是 Lime。

另外,您是如何制作动画的? 您使用的是策略测试器吗? 我这样问是因为在可视模式下测试 EA 或测试指标时,我无法让策略测试器在屏幕上正确显示。

关于第一个问题,我认为可能是因为指标没有正确加载数据。这通常发生在更换图表或打开新图表时。不过,如果是已经在使用的图表,则值得进一步调查为什么无法获得订单块。在这种情况下,最好在代码中加入调试(打印)信息,以找出问题所在。

关于第二个问题,即只绘制了看涨订单区块,可能是因为 H4 时间框架中的欧元兑美元目前处于 600-700 烛台高点。在这种情况下,有可能所有看跌订单区块都已得到缓解,这就是为什么图表上没有画出这些订单区块的原因。

关于标准变化,我减少了代码中的一些布尔变量。不过,如果有必要,重新引入这些条件也不成问题。

关于颜色,我在评论中发布的最新版本对订单块矩形的颜色采用了透明处理。也许这就是颜色与之前版本不一致的原因。最后,关于动画,我不太明白您指的是什么。您能否详细解释一下动画在这里的含义?

 
Niquel Mendoza #:

你好 ,CapeCoddah,就我而言,我通常使用时间序列形式的数组来处理价格数据或指标,这主要是出于方便和习惯。不过,我也认识到这并不总是使用数组的最佳理由。对于指标而言,使用基于零的数组往往更实用,因为它们简化了索引管理,减少了不断重新初始化或调整大小的需要。在我的例子中,在对订单区块指标进行编程时,我选择使用时间序列,因为我从一开始就是这样构建订单 区块 检索的。

我刚刚查看了您的代码。 当我在 MQ4 中调整数组大小时,我发现必须将数组的时间序列设置为 false,然后调整大小并将时间序列重置为 true。 由于我在 MQ5 中没有使用它,我不知道这样做是否仍然合适。