文章 "轻松快捷开发 MetaTrader 程序的函数库(第十部分):与 MQL4 的兼容性 - 开仓和激活挂单的事件" - 页 2 123456 新评论 fxsaber 2019.05.24 01:48 #11 fxsaber:ZY 我还希望能在虚拟环境中运行您的程序库。为此,我需要访问库中 MT4 风格的部分。我设法运行了它 #define TESTER_CUSTOM // 在用户测试器中运行智能交易系统 #include <fxsaber\Tester\Tester.mqh> //https://www.mql5.com/zh/code/24848 #include <IgorM\TradePanel_C#\TradePanel_C#.mqh> //https://www.mql5.com/zh/code/24829 #include "TestDoEasyPart10.mq5" //https://www.mql5.com/zh/articles/6767 也就是说,库的整个事件模型在虚拟环境中也能运行。 Artyom Trishkin 2019.05.24 03:14 #12 fxsaber:我已经发送了您的库的一个变体,它可以通过您的 MT4 风格逻辑在 MT5 中运行。问题是,跨平台库中 MQL4 风格部分的工作概率远远高于 MQL5 风格。因此,在使用跨平台库时,我更倾向于在 MT5 中使用其 MQL4 风格逻辑。这在 MT5 中更为可靠。我认为,在 MT5 中,您的 MQL5 风格逻辑需要很长时间才能检测到错误,而 MQL4 风格会有错误,但数量很少,而且不是关键错误。在这个库中,逻辑没有分为 MQL5 和 MQL4。它根据交易环境的实际状态和实际变化进行工作。不使用纯粹的 MQL5-OnTradeXXX 函数 - 一切都取自交易环境的状态。也就是说,这不是一个基于事件的模型。这就是为什么我说 - 逻辑是相同的,由于与环境工作所需的函数不同,实现方式略有不同。 在您的库中,一切都从属于将 MQL5 风格移植到 MQL4 风格,而在这里,在这个库中,情况恰恰相反--MQL5 风格(因为更灵活)被移植到 MQL4。因此,该库为 MQL4 提供了比标准 MQL4 更多的功能--例如,它为 MQL4 提供了类似的 PositionID,在这里,您可以在工作过程中(而不是在计算历史记录时)找出仓位是从哪个订单生成的。遗憾的是,MQL4 没有交易 - 没有此类数据。好吧,或者我没有考虑太多....。 基于以上所述,我再重复一遍 - 没有分为两种风格 - 两个平台都一样。因此,我不明白您想将已经转换过的内容再转换两次到 MQL4。 fxsaber 2019.05.24 03:25 #13 Artyom Trishkin:基于以上所述,我再重复一遍--不存在两种风格之分--两个平台都是一样的。因此,我不理解您想把已经转换过的东西再转换两次到 MQL4。误解只是术语上的。您的 MT4 库是一个包装器,是用 MQL4 编写的。这是 MT4 风格。这是我需要的部分。事实上,我已经完成了。 Artyom Trishkin 2019.05.24 04:16 #14 fxsaber:误解只是术语上的。您的 MT4 库是用 MQL4 编写的封装器。这是 MT4 风格。这是我需要的部分。事实上,我已经做到了。 很好 Alexey Viktorov 2019.05.27 08:03 #15 你好,Artem。我试图在 MQL4 中使用这个库。昨天,我将它连接到测试器中的 EA,甚至收到了开仓或平仓的信息。但今天我将测试器中的内容转移到了一个新的 EA 中,没有开仓 按钮,我试图获得开仓或平仓的信息,但没有收到。根据我的想法,我需要获得仓位、价格和时间的票据。即使在测试版中也无法实现。 #property strict #include <DoEasy\Engine.mqh> CEngine engine; /*******************Expert initialization function*******************/ int OnInit() { EventSetMillisecondTimer(100); return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { //-- 上次交易事件初始化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- 如果在测试仪中工作 if(MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); //PressButtonsControl(); } //--- 如果最后一次交易事件发生变化 if(engine.LastTradeEvent()!=last_event) { last_event=engine.LastTradeEvent(); Comment("last_event: ",EnumToString(last_event)); Print(__FUNCTION__, " last_event: ",EnumToString(last_event)); engine.ResetLastTradeEvent(); //Print("last_event: ",EnumToString(last_event)); } }/*******************************************************************/ /***************************Timer function***************************/ void OnTimer() { //-- 上次交易事件初始化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- 如果在测试仪中工作 if(MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); //PressButtonsControl(); } //--- 如果最后一次交易事件发生变化 if(engine.LastTradeEvent()!=last_event) { last_event=engine.LastTradeEvent(); Comment("last_event: ",EnumToString(last_event)); Print(__FUNCTION__, " last_event: ",EnumToString(last_event)); engine.ResetLastTradeEvent(); //Print("last_event: ",EnumToString(last_event)); } }/*******************************************************************/ void OnDeinit(const int reason) { EventKillTimer(); Comment(""); }/*******************************************************************/ 附加的文件: 00.mq4 5 kb Alexey Viktorov 2019.05.27 08:19 #16 最令人费解的是,我现在把按钮 探针放在图表.....。 没有任何信息通过。把它放回测试仪,一切正常。 ps; 我想明白了。必须使用自定义事件启用 OnChartEvent。 Artyom Trishkin 2019.05.27 08:25 #17 Alexey Viktorov: 最令人费解的是,我现在把带按钮 的探头放在图表.....。 没有任何信息传过来。我把它放回测试器,一切正常。 删除 EA 中对定时器的所有引用 - 库会为其创建自己的定时器并在其中工作。一切都是为了简单方便。 Alexey Viktorov 2019.05.27 09:00 #18 Artyom Trishkin: 删除 EA 中对定时器的所有引用--程序库将为其创建自己的定时器并在其中工作。这样做是为了简单方便。删除计时器,在此表单中插入 OnChartEvent。按钮控件可能不需要,而用户事件 我认为是在库的某个地方创建的。但我没有得到结果。 void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //if(MQLInfoInteger(MQL_TESTER)) // return; //if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam, "BUTT_")>0) // { // PressButtonEvents(sparam); // } if(id>=CHARTEVENT_CUSTOM) { ushort event=ushort(id-CHARTEVENT_CUSTOM); Print(DFUN,"id=",id,", event=",EnumToString((ENUM_TRADE_EVENT)event),", lparam=",lparam,", dparam=",DoubleToString(dparam,Digits()),", sparam=",sparam); } } Artyom Trishkin 2019.05.27 09:09 #19 Alexey Viktorov:我删除了计时器,并在此表单中插入了 OnChartEvent。按钮控件可能并不需要,而自定义事件 我认为是在库的某个地方创建的。但我没有得到结果。 我稍后会做一个示例。 Alexey Viktorov 2019.05.27 13:43 #20 Artem,请告诉我突出显示的代码部分起什么作用? #property strict #include <DoEasy\Engine.mqh> CEngine engine; /*******************Expert initialization function*******************/ int OnInit() { //EventSetMillisecondTimer(100); return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { //-- 上次交易事件初始化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- 如果在测试仪中工作 if(MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); } //--- 如果最后一次交易事件发生变化 if(engine.LastTradeEvent()!=last_event) { last_event=engine.LastTradeEvent(); Comment("last_event: ",EnumToString(last_event)); Print(__FUNCTION__, " last_event: ",EnumToString(last_event)); //engine.ResetLastTradeEvent(); //Print("last_event: ",EnumToString(last_event)); } }/*******************************************************************/ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id>=CHARTEVENT_CUSTOM) { ushort event=ushort(id-CHARTEVENT_CUSTOM); Print(DFUN,"id=",id,", event=",EnumToString((ENUM_TRADE_EVENT)event),", lparam=",lparam,", dparam=",DoubleToString(dparam,Digits()),", sparam=",sparam); } } /***************************Timer function***************************/ void OnTimer() { //-- 上次交易事件初始化 static ENUM_TRADE_EVENT last_event=WRONG_VALUE; //--- 如果在测试仪中工作 if(!MQLInfoInteger(MQL_TESTER)) { engine.OnTimer(); } }/*******************************************************************/ void OnDeinit(const int reason) { //EventKillTimer(); Comment(""); }/*******************************************************************/ 如果定时器没有启用,如何执行这段代码? 但如果删除这部分代码,事件信息就不会打印出来。但有了它,一切都能正常运行。 我想在事件消息中获得票据、价格以及仓位 和订单的其他属性。 123456 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
ZY 我还希望能在虚拟环境中运行您的程序库。为此,我需要访问库中 MT4 风格的部分。
我设法运行了它
也就是说,库的整个事件模型在虚拟环境中也能运行。
我已经发送了您的库的一个变体,它可以通过您的 MT4 风格逻辑在 MT5 中运行。
问题是,跨平台库中 MQL4 风格部分的工作概率远远高于 MQL5 风格。因此,在使用跨平台库时,我更倾向于在 MT5 中使用其 MQL4 风格逻辑。这在 MT5 中更为可靠。
我认为,在 MT5 中,您的 MQL5 风格逻辑需要很长时间才能检测到错误,而 MQL4 风格会有错误,但数量很少,而且不是关键错误。
在这个库中,逻辑没有分为 MQL5 和 MQL4。它根据交易环境的实际状态和实际变化进行工作。不使用纯粹的 MQL5-OnTradeXXX 函数 - 一切都取自交易环境的状态。也就是说,这不是一个基于事件的模型。这就是为什么我说 - 逻辑是相同的,由于与环境工作所需的函数不同,实现方式略有不同。
在您的库中,一切都从属于将 MQL5 风格移植到 MQL4 风格,而在这里,在这个库中,情况恰恰相反--MQL5 风格(因为更灵活)被移植到 MQL4。因此,该库为 MQL4 提供了比标准 MQL4 更多的功能--例如,它为 MQL4 提供了类似的 PositionID,在这里,您可以在工作过程中(而不是在计算历史记录时)找出仓位是从哪个订单生成的。遗憾的是,MQL4 没有交易 - 没有此类数据。好吧,或者我没有考虑太多....。
基于以上所述,我再重复一遍 - 没有分为两种风格 - 两个平台都一样。因此,我不明白您想将已经转换过的内容再转换两次到 MQL4。
基于以上所述,我再重复一遍--不存在两种风格之分--两个平台都是一样的。因此,我不理解您想把已经转换过的东西再转换两次到 MQL4。
误解只是术语上的。您的 MT4 库是一个包装器,是用 MQL4 编写的。这是 MT4 风格。这是我需要的部分。事实上,我已经完成了。
误解只是术语上的。您的 MT4 库是用 MQL4 编写的封装器。这是 MT4 风格。这是我需要的部分。事实上,我已经做到了。
你好,Artem。我试图在 MQL4 中使用这个库。
昨天,我将它连接到测试器中的 EA,甚至收到了开仓或平仓的信息。但今天我将测试器中的内容转移到了一个新的 EA 中,没有开仓 按钮,我试图获得开仓或平仓的信息,但没有收到。根据我的想法,我需要获得仓位、价格和时间的票据。即使在测试版中也无法实现。
最令人费解的是,我现在把按钮 探针放在图表.....。 没有任何信息通过。把它放回测试仪,一切正常。
ps; 我想明白了。必须使用自定义事件启用 OnChartEvent。
最令人费解的是,我现在把带按钮 的探头放在图表.....。 没有任何信息传过来。我把它放回测试器,一切正常。
删除 EA 中对定时器的所有引用--程序库将为其创建自己的定时器并在其中工作。这样做是为了简单方便。
删除计时器,在此表单中插入 OnChartEvent。按钮控件可能不需要,而用户事件 我认为是在库的某个地方创建的。但我没有得到结果。
我删除了计时器,并在此表单中插入了 OnChartEvent。按钮控件可能并不需要,而自定义事件 我认为是在库的某个地方创建的。但我没有得到结果。
Artem,请告诉我突出显示的代码部分起什么作用?
如果定时器没有启用,如何执行这段代码?
但如果删除这部分代码,事件信息就不会打印出来。但有了它,一切都能正常运行。
我想在事件消息中获得票据、价格以及仓位 和订单的其他属性。