首先,让我们从 < code >-snippet mis-concept 说起
如提供的 < code >-snippet 中所见,存在一个主要错误/错误概念。虽然 MQL4 代码的语法在编译器阶段是可行的(它被处理成可操作的 .ex4 运行时代码),但结果基本上是错误的。
MQL4 有很多枚举常量,过去在 MetaLang.exe 编译阶段使用上下文检查为零。(是的,不得不说“曾经有”,因为 MetaQuotes, Inc.,最近进入“隐藏”语言修改已经改变了很多系统行为,即使是在 MQL4 的语法中,在一个相当Orwel式的“新”-MQL4,所以在流沙的情况下更要注意细节......)
如前所述,与您尝试使用的 ENUM_CONST 类似MODE_PENDING
,在该语言中具有公平的含义,但这并不能保证仅在编译时替换int
. 因此,可以MODE_HIGH
在任何地方声明 a ( btw == 2 ),其中MODE_SMMA
( btw == 2 ) 将具有适当的使用上下文。这些只是编译器解析阶段的符号替换。
其次,让我们专注于你的目标
正如所见,您想以某种方式对一组关于挂单的总量和各自大小的知识进行操作,这些知识在市场激活它们之前等待“在桌面上”。这是一项复杂而重要的任务。由于外汇没有“中央”市场,以收集全球总和的总和。
谈到其中的“音量”,又会引发另一个混乱。Volume
,正如在 MQL4 中实现的那样,是一个离散整数值,与相应柱内的累积价格变化量相关。因此,在 aNewBarEVENT 上,Volume[0] == 1
(第一个价格报价刚刚到达并带来了 aNewBarEVENT 本身的指示),并且该值在整个实时柱 ( [0] ) 持续时间内逐步增加。有人可能还注意到,对于没有出现“来自市场”的报价的柱形图,MT4 不会在图表中显示任何柱形图(一根缺失的蜡烛)。
因此,在使用Volume一词时始终要小心,以确保获得完整的使用上下文。
从您的帖子中可以看出,您的意图是获得OrderBook LEVEL-2 aka Depth-Of-Market。
虽然这是可能的,但这将需要更多的努力来组装,而不仅仅是 MQL4 代码中的单行代码。
第三,我们去完成工作
可能是,您的代理已准备好 API 服务,供您收集和处理 L2 DoM。
如果不,
还有其他来源可以构建和维护 L2 DoM,但与您的交易执行地点的相关性有待验证,因为一旦与您的模型进行交易,有些可能会通过做市商角色使您的策略瘫痪。
您的经纪人-“本地”L2 DoM rulez。总是。不值得损失来测试相反。
如果准备好完成这项任务,请准备好在超低延迟架构上运行,因为 L2 DoM 演化动态中的亚毫秒级节奏并不少见。
一旦“上路”,您很快就会注意到,MQL4 的计时器分辨率高于1 毫秒。
因此,您的查询+收集+清理+处理+发布+使用您自己的本地 L2 DoM 映射的计算策略从一开始就存在问题(不谈论由于端到端传输延迟而导致的映射的主要偏差)。
(还请记住,MQL4 只有几个线程,完全不受您的控制。因此,必须设计仔细的多处理设计,以便在非阻塞的近实时模式下运行。拥有像这样的集成系统,您的项目实现目标确实非常令人兴奋,相信我 :o)
)
尽管如此,还是值得做正确的工作。