🌐
在 MetaTrader 5 中实施多货币交易模式
多货币同步CopyRates
传统 OnTick 模式的缺陷
最朴素的多货币做法是:在 OnTick/OnCalculate 里依次请求各品种分析。它有两个结构性缺陷,越小的周期越明显。
- 睡眠问题:系统依赖当前图表品种的价格变动触发。慢速市场(如夜间)tick 稀少,整个多货币系统跟着“睡”,其他活跃品种也无法计算。
- 历史不同步:MT5 中每个品种第 N 根柱的开盘时间可能不同,按柱序号对齐会错位。
同步数据缓冲
为每个品种预分配同步缓冲区,统一用 CopyRates 按时间区间拉取,再以时间轴为基准对齐,而不是按柱序号。
// 为每个品种预分配同步缓冲区
class CSynchronizedBufferRSI
{
double m_buf[];
int m_handle;
void Sync(void) { CopyRates(_Symbol, PERIOD_M15, 0, 100, m_rates); }
};
用图表事件驱动刷新
放弃“等当前图表 tick”的思路,改用定时器或自定义图表事件统一触发全市场重算,避免慢速品种拖累。
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_TICK || id == CHARTEVENT_CUSTOM+1)
RecalcAll(); // 统一重算所有品种
}
历史同步的关键
⚠ 别用柱序号对齐
不同品种第 N 根柱的开盘时间不同。构建/重算多货币指标时,必须按时间索引 CopyRates 并做时间对齐,否则信号会系统性错位。
性能与节流
- 用定时器或自定义事件节流,避免每个 tick 全市场重算。
- 缓存同步缓冲,只在相关品种更新时局部刷新。
- 大周期品种可降低重算频率。
小结
完备的多货币模式 = 同步缓冲 + 事件驱动 + 时间对齐。它让多币种 EA 不再受当前图表品种的节奏绑架,也便于在策略测试器中正确回测。
常见问题
当前图表品种夜间波动稀少,tick 很少,其他活跃品种也无法触发计算。
用 CopyRates 按时间区间拉取,再以时间轴为基准对齐,不要按柱序号。
用自定义事件/定时器节流重算,并缓存同步缓冲,避免每 tick 全市场拷贝。