iRSI() 不会在时间范围结束时打开订单

iRSI() does not open an order at the end of a time frame

首先,我在 EA 编码方面还很陌生,其次,我在 MT4 论坛本身和强大的 google.

上寻找了相关的 post

现在我写了一个简单的 EA 来在满足某些条件时打开订单,其中之一是 double RSI_1 = iRSI( NULL, PERIOD_H1, 14, PRICE_CLOSE, 0 ) > 70.

好吧,正如您在附件中看到的那样,订单不是在蜡烛的 close 价格开的,而是更高的,根据图片应该在右边的下一根蜡烛开盘。

我认为,根据文档,通过使用 price_closersi 会得到以所选时间范围内的 close 价格计算,但看起来并非如此。

我错过了什么?

我该如何解决?

问:我错过了什么?

MT4 终端,一种可编程的客户端交易访问设备(出于历史原因)使用寄存器的时间反转索引,存储各个时间单位的实际/历史值 { open, high, low, close, volume } (特定于每个 TimeFRAME 的持续时间)。

其他值从这些基值得到 "derived"/计算(通过 "pre-defined"(已实施)指标 { iRSI(), iMFI(), ... } 或通过您的 MQL4 代码编程)。

第一个常见问题是,时间流逝......(很明显......,但令人惊讶的是,PriceDOMAIN 中有一些人为的副作用,令人惊讶的是来自TimeDOMAIN,由历史简化引入,以尽可能快地实时处理定价数据,这会导致类似您的想法的麻烦。

一旦aNewBarEVENT出现,一个非常特殊的情况就会发生(总是)...

注册 open[0] == high[0] == low[0] == close[0] & volume[0] == 1

随着时间的推移,通过随后的 anFxMarketEVENT 到达您的 MT4 终端软件 volume[0] > 1 增长并注册 close[0] 获得越来越新的值(通常不是 open[0]

该机制因此 "complicates" 任何决策都绑定到 close[0] 的 "just-present" 值,作为 [=14= 的下一次到达](来自 Broker 的新 Ask/Bid 价格)将寄存器值移动到其他值,而不是之前(毫秒)秒可能使用的值。

这样你的代码可能已经开始 activity iRSI( ..., PRICE_CLOSE, ... ) 的那一刻(派生的)值确实 > 70,但是在剩余的时间里直到 anEndOfBAR随后的 close[0] 价格朝着这样的方向发展,iRSI() 在 "leaving" 柱上的最后一个值远低于 70 ...(正如您似乎试图在您的 (裁剪 w/o 比例 ) PrintScreen )

第二个 问题似乎与标记 "above" 蜡烛 close[aBarPTR] 水平的 PriceDOMAIN 距离有关。

多头交易以 Bid == close[0]Spread 给出的价格输入,但图表显示蜡烛价格作为基于 Bid 的价格,因此如果在 XTO 时视觉距离等于 Spread(其中 Spread 值可能是恒定或可变大小,具体取决于您的经纪人条款& 条件 ), 多头交易入场的头寸是公平和正确的。

第三个 在这种情况下可能但不一定有效的问题是称为 策略测试器 的 MT4 终端功能在回测期间处理多 TimeFRAME 计算时不太公平和方便。几年前,我们的团队干脆放弃使用内置函数,开始使用我们自己的寄存器处理,以维护我们真正可以依赖的我们自己的、独立的、多 TimeFRAME 值。

问:如何解决?

由于处理热点-[0]-bar 事件的性质,您的代码需要一些其他过滤器或附加指标,它们不会滞后(当交易决策被触发时,不要及时添加额外的延迟和偏差)并且不要颤抖(在同一柱内重复触发)。

MQL4 提供了一些工具,如果需要更多,可以求助于额外的外部设施(完全分布式多代理 grid/cloud/GPU-based 计算)。

那么,享受FX/MT4的大千世界吧。

所有这些可能性都触手可及。