致作者 谢谢!
MT4 用户会安装 MT5,至少是为了 "向导"--巧妙的营销?只是部分原因。
现在,这篇文章满足了程序员的好奇心--它是如何实现的?但不能满足用户。
市场营销需要另一篇更高层次的文章,逐步描述如何按键才能让向导在 MT4 中运行。
然后,用户就会开始与其他同类人分享他们在这项业务中的经验。或者说我对市场营销一无所知。
为了进行比较,我建议试用 Tick Data Suite(兼容 MT4 940 - 1052 版)。
在 MT5 测试仪中选择 "按真实点数 "模式。在 MT5 测试仪中选择 "按真实点数 "模式,保存后通过 TDS 输入 MT4 测试仪。
这样,两个测试器中的报价将 100% 一致,这样您不仅可以按交易进行精确比较,还可以按速度进行比较。
然后我们就可以比较两个方向的 EA 转换/创建情况。
在 kodobase 中发布 EA 是通过 SB 实现 MT4 -> MT5 转换的结果。
此类作者似乎可以利用这篇文章进行自我检查。如果转换是正确的,那么通过 MT5Bridge 进行反向转换的结果应该与 MT4 原始结果完全相同。
在 kodobase 中发布 EA 是通过 SB 实现 MT4 -> MT5 转换的结果。
这类作者似乎可以利用这篇文章进行自我检查。如果转换是正确的,那么通过 MT5Bridge 进行反向转换的结果应与 MT4 原始结果完全相同。
fxsaber, 2017.05.08 15:12
通过MT5Bridge 将您的代码 转换为 MT4。MT4build1072
EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:07.645 (total time 0:00:08.362)
EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.744 (total time 0:00:04.493)
转换后的结果完全相同!速度下降了一半。
我的 MT5 EA(已生成,但使用自己实现的CExpertSignal 而不是标准指标)在 MT4 上编译和测试时没有问题,谢谢!
但现在我将 Expert Advisor 发送到真实平台,结果发现它根本无法交易。没有错误,什么也没显示。它就是不交易。我花了很长时间研究代码,终于找到了原因--Trade.mqh 中的 bool CTrade::FillingCheck(const string symbol) 函数。
该检查针对市场订单触发。
// 根据符号获取可能的填充策略类型 uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); // 再次检查执行模式 if(exec == SYMBOL_TRADE_EXECUTION_MARKET) { // 适用于 MARKET 执行模式 // 分析顺序 if(m_request.action != TRADE_ACTION_PENDING) { // 在即时执行命令的情况下 // 如果支持所需的填充策略,则将其添加到请求中 if(m_type_filling == ORDER_FILLING_FOK && (filling & SYMBOL_FILLING_FOK) != 0) { m_request.type_filling = m_type_filling; return(true); } if(m_type_filling == ORDER_FILLING_IOC && (filling & SYMBOL_FILLING_IOC) != 0) { m_request.type_filling = m_type_filling; return(true); } // 填料策略错误,设置错误代码 m_result.retcode = TRADE_RETCODE_INVALID_FILL; return(false); } return(true); }
在我的情况下,m_type_filling 和 filling 都等于零,因此函数返回 false。
,根据代码逻辑,filling 不应等于零,但根据帮助 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE),MT4 不支持。这就是为什么在测试版中,检查由于某种原因通过了,也许在某些经纪商的真实交易中也是如此。但这对我不起作用,到目前为止,我只是修改了函数,跳过了所有代码,并从函数中返回 true。
该检查适用于市场订单。
在我的情况下,m_type_filling 和 filling 都等于零,因此函数返回 false。
,根据代码逻辑,filling 不应等于零,但根据帮助,MT4 不支持 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)。这就是为什么在测试版中,检查由于某种原因通过了,也许在某些经纪商的真实交易中也是如此。但这对我不起作用,目前我只是修改了函数,跳过了所有代码,并从函数中返回 true。
感谢您的留言。我没有遇到过这种情况。这个方法保持不变。显然,有必要根据订单 和/或工具的类型,将所有填充变量设置为特定常量(可能无法通过 API 以任何方式调出,测试人员使用了一些默认值)。如果有人知道 MT4 如何在内部选择填充,请与我们分享。
如果有人知道 MT4 内部如何选择填充 - 请分享。
fxsaber, 2017.02.25 16:12
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);
return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
(((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
(ENUM_ORDER_TYPE_FILLING)Type);
}
谢谢,能否对这段代码稍作修改,以获得 MT4 的 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)类似函数。函数不应返回ENUM_ORDER_TYPE_FILLING,而应返回 (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC)。
ORDER_FILLING_FOK = 0,ORDER_FILLING_IOC = 1,而 SYMBOL_FILLING_FOK = 1,SYMBOL_FILLING_IOC = 2,因此只需将结果递增 1 即可。
//funtion 返回 MT4 的符号填充模式,又称 SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)。 //参数类型 - 订单填写类型 uint GetSymbolFilling( const string Symb, const uint Type = ORDER_FILLING_FOK ) { const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE); const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE); return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ? (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ? ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) : (ENUM_ORDER_TYPE_FILLING)Type) + 1; }
然后调用函数 bool CTrade::FillingCheck(const string symbol) 中的代码。
uint filling = GetSymbolFilling(symbol, m_type_filling); //而不是 //uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
但实际上,这只是代码调整后的效果。最好不要这样做,而要找到正确的解决方案。
Stanislav Korotky 先生,您好!希望您一切都好。
我发现您的文章非常有趣,我试着按照您的指导让现成的 MT5 EA 兼容 MT4。
但我出现了以下错误,能否请您指导我如何解决这个错误?
按照您的指导,我做了以下工作我只是复制了 MQL5 源文件和MQL5 程序,然后将其粘贴到 Expert 文件夹的主目录中。
但我还是遇到了很多错误。
您能告诉我如何才能让 MQL5 生成的 EA 在 MT4 中运行吗?
下面是所附的错误图片。
新文章 来自 MQL5 向导的预制专家交易系统运作于 MetaTrader 4 平台中已发布:
本文为 MetaTrader 4 提供了简单的 MetaTrader 5 交易环境模拟器。模拟器实现了标准函数库的交易类的移植和调整。结果就是, MetaTrader 5 向导中生成的专家交易系统在 MetaTrader 4 中无需修改即可进行编译并执行。
在 EURUSD M15 图表上, 专家交易系统看来交易良好, 包括设定止损位和止盈位的方式。
图表窗口, 展示来自 MetaTrader 5 向导的专家交易系统在 MetaTrader 4 里的操作
作者:Stanislav Korotky