MQL4 如何在价格触及对象时获取?

MQL4 how to get if a price hits an object?

价格触及对象如何获取?比方说,该对象是手动绘制的干草叉或趋势线。我想,它应该这样开始:

if(Bid==?)

猜得不错

让我们一步一步地讲故事。

价格:。 . .哪一个?

{ Ask, Bid } - 虽然大多数技术分析都是从基于 Bid 的角度得出的,一个一定经历过某些 XTO-events 与 Ask 价格水平有关。

为了简单起见,让我们将 Bid 作为唯一可用的价格,同时可以扩展框架以在幕后拥有完整的 PriceDOMAIN 对偶性。

时间范围:。 . .哪一个?

听起来很奇怪?嗯,这并不奇怪,MetaTrader Terminal 4 图形 而不是 允许任意放置 GUI-objects。虽然这不需要从一开始就意识到,但如果试图将 GUI-object 放置到精确的 TimeDOMAIN 坐标上,就会失败。 PriceDOMAIN 坐标不受如此限制,但如果 GUI-object 定义点之一落入远期或近期,但相应的 Market-session 行政关闭( a FRI/MON-gap, midnight-gap, DE.30/DAX post-Market/pre-Market-gap 等 ) 在 real-time 到达 "future" 时间点之前。如果不完全 jumped-off-the 屏幕,此类对象会变形。

除此之外,TimeFrames 的概念引入了另一个问题——我们要 assemble 的条件 if(Bid....) 是否成立并产生D1H4H1M5M1 中的结果是否完全相同?虽然这似乎是在 PriceDOMAIN 中简单地决定的(实际上并没有,另一个糟糕的惊喜正在等待)但可以肯定的是,TimeDOMAIN 坐标当 条件星座被满足并且会有所不同,具体取决于 TimeFrame,GUI-object 被放置在该 TimeFrame 上并受到算法的挑战。

简单地说,虽然 GUI-objects 被涂成“连续”,但它们不是。它们在MQL4生态系统中的内部表示是离散的,因此人们宁愿忘记所有线性和二次对象的代数。

最好将 GUI-object 想象成一组有序的 [x-TimeDOMAIN, y-PriceDOMAIN] 坐标——是的,一组有序的点 ,其中x(令人惊讶与否)在视觉上最具误导性 - 条形表示的中间不是时间 real-flow 的 "middle",但行政市场 wall-clock - Bar.

开始的时间

如何处理所有这些故障并猜测值?

为了至少从 MQL4 方面获得一些帮助,这里有一些实用函数:

int     ObjectGetShiftByValue( string   anObjectNAME,      // ...
                               double   aTargetPriceLEVEL  // a price to reach
                               )

加上

double  ObjectGetValueByShift( string   anObjectNAME,      // guess what
                               int      aShiftInTimeDOMAIN // bar index 
                               )

这对方便的函数会省去很多麻烦,但仍然需要仔细处理 weekend/market-gaps( bars-space 即 "now" 可见,但在不久的将来 "disappear" 并且敢于拥有 GUI-objects 和定义点 "forgotten" 就在那里......)。


最后但并非最不重要的... == 的危险...不仅在 if(Bid...)
(奥威尔语"We are all equal, but some of us are more equal... ")

我猜每个花时间构建自定义指标的人都遇到过 IEEE-float 数值 (im)精度 的阴暗面。平滑和深度卷积计算迟早会引入这种现象,first-aid ( double-precision float ) 并不能消除这些 non-integer 值的表示必须遭受的数值精度的主要损失。

这就是说,人们应该有意识地使用不精确的数字并替换二进制严格相等测试(==),这些测试无法在嘈杂的 un-precise 数字,而是使用这个故障:

#define EQUALITY_TOLERANCE  0.000005
  if (  EQUALITY_TOLERANCE > MathAbs( Bid - aTargetPRICE ) )
  {  // EQUAL

   }
  else
  {

   }

当然,同样的逻辑适用于 PriceDOMAIN cross-testing 和其他派生的 { >= | > | < | <= | != } 条件。