文章 "轻松快捷开发 MetaTrader 程序的函数库(第十部分):与 MQL4 的兼容性 - 开仓和激活挂单的事件" - 页 2

 
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

也就是说,库的整个事件模型在虚拟环境中也能运行。

 
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。

 
Artyom Trishkin:

基于以上所述,我再重复一遍--不存在两种风格之分--两个平台都是一样的。因此,我不理解您想把已经转换过的东西再转换两次到 MQL4。

误解只是术语上的。您的 MT4 库是一个包装器,是用 MQL4 编写的。这是 MT4 风格。这是我需要的部分。事实上,我已经完成了。

 
fxsaber:

误解只是术语上的。您的 MT4 库是用 MQL4 编写的封装器。这是 MT4 风格。这是我需要的部分。事实上,我已经做到了。

很好
 

你好,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
 

最令人费解的是,我现在把按钮 探针放在图表.....。 没有任何信息通过。把它放回测试仪,一切正常。


ps; 我想明白了。必须使用自定义事件启用 OnChartEvent。

 
Alexey Viktorov:
最令人费解的是,我现在把带按钮 的探头放在图表.....。 没有任何信息传过来。我把它放回测试器,一切正常。
删除 EA 中对定时器的所有引用 - 库会为其创建自己的定时器并在其中工作。一切都是为了简单方便。
 
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);
     } 
  }
 
Alexey Viktorov:

我删除了计时器,并在此表单中插入了 OnChartEvent。按钮控件可能并不需要,而自定义事件 我认为是在库的某个地方创建的。但我没有得到结果。

我稍后会做一个示例。
 

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("");
}/*******************************************************************/

如果定时器没有启用,如何执行这段代码?

但如果删除这部分代码,事件信息就不会打印出来。但有了它,一切都能正常运行。

我想在事件消息中获得票据、价格以及仓位 和订单的其他属性