MT5
MT5工具使用
MT5资源、编程参考
MT5编程
0到底代表最左柱还是最右柱?
编程中非常重要的一个问题:在 EA, Indicator, Script 中,0到底代表最左侧蜡烛还是最右侧蜡烛?
EA 和 Script 编程
为计算方便起见,为保存 Indicator 数据和 MqlRates 数据定义的 XxxBuffer[] 和 rates[],在定义后进行
- ArraySetAsSeries(XxxBuffer, true);
- ArraySetAsSeries(rates, true);
的设置,使 XxxBuffer 和 rates 成为时间序列,0代表最右侧蜡烛(the current bar)。
Indicator 编程
根据计算方便程度而定:
1, 当从左到右计算比较方便的时候
默认情况下,预定义函数 OnCalculate 参数中的 close[0] 是图表最左侧蜡烛,close[rates_total-1] 是图表最右侧蜡烛。因此,如果从左到右计算比较方便的时候,为保存其他 Indicator 数据而定义的 XxxBuffer,不进行 ArraySetAsSeries(XxxBuffer, true) 的设置(不设置XxxBuffer为时间序列)。那么在 BarsCalculated(XxxHandle) ⇒ CopyBuffer(XxxHandle, n, 0, count, XxxBuffer) 之后,XxxBuffer 中的序列,跟 OnCalculate 参数中的 close[] 同样也是0代表最左侧,rates_total-1 代表最右侧。
2, 当从右到左计算比较方便的时候
在预定义函数 OnCalculate 的开头部分,先把 time[], close[] 等设置为时间序列(最右侧最新bar为0),在编程中使用到的保存其他 Indicator 数据的 XxxBuffer,也设置为时间序列:
- ArraySetAsSeries(time, true);
- ArraySetAsSeries(close, true);
- ArraySetAsSeries(XxxBuffer, true);
注意:如果在 Indicator 的编程中用到其他 Indicator,需要在 indicator_buffers N 里计入该 Indicator 的输出值,并且设置 SetIndexBuffer(n, XxxBuffer, INDICATOR_CALCULATIONS) ,否则通过 CopyBuffer(XxxHandle, 0, 0, n, XxxBuffer) 复制输出值的时候 XxxBuffer 的要素个数将与 close[] 的要素个数不匹配。