- 显示:
- 1273
- 等级:
- 已发布:
- 2017.06.05 13:42
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
如果您在 MetaTrader 中改变了时段或者图表交易品种的名称,所有图表上的指标都将卸载并且会再次载入到其中。和 MT4 不同, 在 MT5 中,载入/卸载的顺序没有确定,这是因为它的内部结构。
这种功能有些时候会引起问题,而并不会被马上发现。这些问题相关的是,新载入指标实例的 OnInit 可能在该实例卸载时的 OnDeinit 之前执行。
发现这种问题的情形,通常是想在旧指标的 OnDeinit 中传输一些信息到新指标实例的 OnInit 中,换句话说,新指标实例应当知道存在旧的指标,并且在旧的实例卸载之前不能载入。
这个库可以使这种同步应用到任何指标中。
这里是一个简单指标的例子
#property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_color1 clrRed #property indicator_type1 DRAW_LINE input int Input = 0; double Buffer[]; int OnInit() { SetIndexBuffer(0, Buffer); Print("Init"); return(INIT_SUCCEEDED); } void OnDeinit( const int Reason ) { Print("DeInit"); } void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam ) { } void OnTimer() { } int OnCalculate( const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { ArrayCopy(Buffer, open, prev_calculated, prev_calculated); return(rates_total); }
如果您载入这个指标,并且开始在图表中切换时段或者交易品种,"Init"和"Deinit"中的线会被打断,
如果我们在指标代码的开头加入了下面这行,
#include <Init_Sync.mqh> // 同步指标的 Init/Deinit
就可以观察到正常的变化。
为了在想要的指标中应用这种属性,要把上面的结构加到它的代码中。
注意
// 这个库使得指标的 Init/Deinit 同步. // 指标中必须包含 int OnInit(), OnDeinit, OnTimer 和 OnChartEvent. // 如果没有使用呢?保留空白。 #include <TypeToBytes.mqh> // https://www.mql5.com/en/code/16280 #include <crc64.mqh> // https://www.mql5.com/en/blogs/post/683577
在指定的链接中可以找到库中另外所需的 mqh 文件。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/18138
![Color_Spread](https://c.mql5.com/i/code/indicator.png)
本指标使用彩色线显示当前的点差。
![Exp_XFatlXSatlCloud](https://c.mql5.com/i/code/expert.png)
Exp_XFatlXSatlCloud 交易系统是基于 XFatlXSatlCloud 指标显示的趋势改变的。