最近在搞MT5多账户管理部署,踩了不少坑,总算理清了一套相对稳定的方案。这里分享下06月28日更新的版本,主要针对信号同步和订单冲突做了优化。
先说环境基础。MT5自带的多账户管理功能其实很鸡肋,建议直接用MQL5社区的开源CopyTrade脚本或者自己撸个EA。我这边用的是自写的多账户同步EA,基于FileMapping实现进程间通信,避免DLL依赖。
部署步骤分四块:
第一,主账户配置。在主账户的OnTick()里,把每个新订单的ticket、symbol、type、volume、openprice、sltp都写进共享缓存。注意用CriticalSection锁防止并发写冲突。代码片段:
int fileHandle = FileOpen("MastersOrders.bin", FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI, ",", 0);
if(fileHandle != INVALID_HANDLE) {
FileWriteInteger(fileHandle, orderTicket);
FileWriteDouble(fileHandle, orderOpenPrice);
FileWriteDouble(fileHandle, orderSL);
FileWriteDouble(fileHandle, orderTP);
FileClose(fileHandle);
}
第二,从账户监听。每个从账户运行一个独立EA,用FileOpen模式读取主账户文件,但注意要设置FILE_SHARE_WRITE权限,否则主账户会写失败。我习惯用定时器每秒轮询一次,避免高频IO压力。
第三,订单同步逻辑。这里容易出问题,比如主账户加仓时从账户可能还在平仓。我的方案是用OrderSelect按ticket匹配,如果主账户订单存在但从账户没有,就按比例计算手数开仓。比例因子用全局变量控制,比如主账户1手,从账户0.1手。
第四,容错机制。网络异常或账户掉线时,建议用FileSave保存未同步订单,恢复后重新扫描。我还在EA里加了心跳检测,如果主账户超过10秒没更新缓存,从账户自动暂停交易并报警。
最后提醒几个坑:不同经纪商的合约规格可能不同,比如原油1手在A平台是1000桶,B平台是500桶,必须手动校准。还有杠杆差异会导致保证金不足,建议从账户设置最大订单数量限制。
这套方案目前跑了两周,同步延迟在200ms以内,未出现重复开单。代码部分有兴趣的可以留言讨论,但注意别直接复制到实盘,先模拟盘跑一周验证。
先说环境基础。MT5自带的多账户管理功能其实很鸡肋,建议直接用MQL5社区的开源CopyTrade脚本或者自己撸个EA。我这边用的是自写的多账户同步EA,基于FileMapping实现进程间通信,避免DLL依赖。
部署步骤分四块:
第一,主账户配置。在主账户的OnTick()里,把每个新订单的ticket、symbol、type、volume、openprice、sltp都写进共享缓存。注意用CriticalSection锁防止并发写冲突。代码片段:
int fileHandle = FileOpen("MastersOrders.bin", FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI, ",", 0);
if(fileHandle != INVALID_HANDLE) {
FileWriteInteger(fileHandle, orderTicket);
FileWriteDouble(fileHandle, orderOpenPrice);
FileWriteDouble(fileHandle, orderSL);
FileWriteDouble(fileHandle, orderTP);
FileClose(fileHandle);
}
第二,从账户监听。每个从账户运行一个独立EA,用FileOpen模式读取主账户文件,但注意要设置FILE_SHARE_WRITE权限,否则主账户会写失败。我习惯用定时器每秒轮询一次,避免高频IO压力。
第三,订单同步逻辑。这里容易出问题,比如主账户加仓时从账户可能还在平仓。我的方案是用OrderSelect按ticket匹配,如果主账户订单存在但从账户没有,就按比例计算手数开仓。比例因子用全局变量控制,比如主账户1手,从账户0.1手。
第四,容错机制。网络异常或账户掉线时,建议用FileSave保存未同步订单,恢复后重新扫描。我还在EA里加了心跳检测,如果主账户超过10秒没更新缓存,从账户自动暂停交易并报警。
最后提醒几个坑:不同经纪商的合约规格可能不同,比如原油1手在A平台是1000桶,B平台是500桶,必须手动校准。还有杠杆差异会导致保证金不足,建议从账户设置最大订单数量限制。
这套方案目前跑了两周,同步延迟在200ms以内,未出现重复开单。代码部分有兴趣的可以留言讨论,但注意别直接复制到实盘,先模拟盘跑一周验证。
专注交易策略编程实现,分享MQL开发技巧与代码优化方案