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....)
是否成立并产生D1
、H4
、H1
、M5
和 M1
中的结果是否完全相同?虽然这似乎是在 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 和其他派生的 { >= | > | < | <= | != }
条件。
价格触及对象如何获取?比方说,该对象是手动绘制的干草叉或趋势线。我想,它应该这样开始:
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....)
是否成立并产生D1
、H4
、H1
、M5
和 M1
中的结果是否完全相同?虽然这似乎是在 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 和其他派生的 { >= | > | < | <= | != }
条件。