Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte X): Compatibilidad con MQL4" - página 2

 
fxsaber:

También quiero ser capaz de ejecutar su biblioteca en Virtual. Para ello necesito tener acceso a la parte de la librería estilo MT4.

He conseguido ejecutarla

#define  TESTER_CUSTOM // Ejecutar el Asesor Experto en el Comprobador de Usuarios
#include <fxsaber\Tester\Tester.mqh> // https://www.mql5.com/es/code/24848

#include <IgorM\TradePanel_C#\TradePanel_C#.mqh> // https://www.mql5.com/es/code/24829

#include "TestDoEasyPart10.mq5" // https://www.mql5.com/es/articles/6767

Es decir, todo el modelo de eventos de la librería funciona también en entorno virtual.

 
fxsaber:

He enviado una variante de su biblioteca, que funciona en MT5 a través de su MT4-estilo-lógica.

La cuestión es que las bibliotecas multiplataforma tienen una probabilidad mucho mayor de funcionar en la parte de la biblioteca de estilo MQL4 que en la de estilo MQL5. Por lo tanto, cuando se utilizan bibliotecas multiplataforma, prefiero utilizar su lógica de estilo MQL4 en MT5. Es mucho más fiable en MT5.


Creo que en MT5 su lógica MQL5-style tardará mucho tiempo en detectar bugs, mientras que MQL4-style tendrá bugs, pero sólo un número mínimo y no críticos.

En esta librería no hay división de la lógica en MQL5 y MQL4. Trabaja con el estado real y los cambios reales en el estado del entorno comercial. No se utilizan funciones puramente MQL5-OnTradeXXX - todo se toma del estado del entorno comercial. Es decir, no es un modelo basado en eventos. Por eso digo - la lógica es la misma, las implementaciones son ligeramente diferentes debido a la diferencia en las funciones necesarias para trabajar con el entorno.

En su biblioteca, todo está subordinado a portar MQL5-estilo a MQL4-estilo, mientras que aquí - en esta biblioteca - es más bien lo contrario - MQL5-estilo (como más flexible) es portado a MQL4. Por lo tanto, la biblioteca proporciona un poco más para MQL4 que las características estándar de MQL4 - por ejemplo, tiene un PositionID similar para MQL4, aquí se puede averiguar durante el trabajo (no al calcular la historia) de qué orden se generó la posición. Desafortunadamente, no hay ofertas para MQL4 - no hay tales datos. Bueno, o no pensé mucho en ello....

Basado en todo lo anterior, repito - no hay división en dos estilos - es el mismo para ambas plataformas. Por lo tanto, no entiendo su deseo de convertir dos veces a MQL4 lo que ya se ha convertido.

 
Artyom Trishkin:

Basándome en todo lo anterior, repito - no hay división en dos estilos - es el mismo para ambas plataformas. Por lo tanto, no entiendo su deseo de convertir dos veces a MQL4 lo que ya se ha convertido.

El malentendido es sólo en la terminología. Su biblioteca para MT4 es una envoltura, que está escrito en MQL4. Este es el estilo MT4. Esta es la parte que necesitaba. En realidad, lo he hecho.

 
fxsaber:

El malentendido es sólo en la terminología. Su biblioteca MT4 es una envoltura escrita en MQL4. Esto es MT4-estilo. Esta es la parte que necesitaba. En realidad, lo he hecho.

Bueno
 

Hola Artem. Estoy teniendo problemas para trabajar con esta libreria. Estoy intentando usarla en MQL4.

Ayer la conecté a mi EA en el tester e incluso recibí mensajes de apertura o cierre de posiciones. Pero hoy he transferido lo que tenía para el tester a un nuevo EA, sin botones para abrir posiciones y estoy intentando recibir un mensaje sobre apertura o cierre de posiciones, pero no lo consigo. Y según mis planes debería obtener un ticket de posición, precio y tiempo. No pude conseguir esto ni siquiera en el tester.

#property strict

#include <DoEasy\Engine.mqh>
CEngine        engine;

/*******************Expert initialization function*******************/
int OnInit()
{
   EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- Inicialización del último evento comercial
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Si trabaja en el probador
   if(MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
      //PressButtonsControl();
     }
//--- Si el último evento comercial ha cambiado
   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("último_evento: ",EnumToString(último_evento));
     }

}/*******************************************************************/

/***************************Timer function***************************/
void OnTimer()
{
//--- Inicialización del último evento comercial
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Si trabaja en el probador
   if(MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
      //PressButtonsControl();
     }
//--- Si el último evento comercial ha cambiado
   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("último_evento: ",EnumToString(último_evento));
     }
}/*******************************************************************/

void OnDeinit(const int reason)
{
 EventKillTimer();
 Comment("");
}/*******************************************************************/
Archivos adjuntos:
00.mq4  5 kb
 

Y lo más desconcertante es que ahora he puesto mi sonda con botones en la gráfica..... No sale ningún mensaje. Póngalo de nuevo en el probador, todo funciona.


ps; Lo he descubierto. Es necesario habilitar OnChartEvent con evento personalizado.

 
Alexey Viktorov:
Y lo más desconcertante es que ahora he puesto mi sonda con botones en la gráfica..... No sale ningún mensaje. Lo vuelvo a poner en el tester y todo funciona.
Quite todas las referencias al temporizador del EA - la librería crea su propio temporizador para él y funciona en él. Todo se hace por simplicidad y comodidad.
 
Artyom Trishkin:
Eliminar todas las referencias al temporizador de la EA - la biblioteca crea su propio temporizador para él y trabaja en él. Todo se hace por simplicidad y conveniencia.

Eliminado el temporizador, inserta OnChartEvent en este formulario. Botón de control es probablemente no es necesario, y el evento de usuario creo que se crea en algún lugar en la selva de la biblioteca. Pero no he conseguido el resultado.

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   //if(MQLInfoInteger(MQL_TESTER))
   // volver;
   //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:

He quitado el temporizador e insertado OnChartEvent en este formulario. El control del botón probablemente no es necesario, y el evento personalizado creo que se crea en algún lugar en la selva de la biblioteca. Pero no obtuve el resultado.

Haré un ejemplo más tarde.
 

Artem, por favor, dime qué función desempeña la sección de código resaltada

#property strict

#include <DoEasy\Engine.mqh>
CEngine        engine;

/*******************Expert initialization function*******************/
int OnInit()
{
   //EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- Inicialización del último evento comercial
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Si trabaja en el probador
   if(MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
     }
//--- Si el último evento comercial ha cambiado
   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("último_evento: ",EnumToString(último_evento));
     }

}/*******************************************************************/

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()
{
//--- Inicialización del último evento comercial
   static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Si trabaja en el probador
   if(!MQLInfoInteger(MQL_TESTER))
     {
      engine.OnTimer();
     }
}/*******************************************************************/

void OnDeinit(const int reason)
{
 //EventKillTimer();
 Comment("");
}/*******************************************************************/

¿Cómo puede ejecutarse este código si el temporizador no está activado?

Pero si se elimina esta sección de código, los mensajes de eventos no se imprimen. Pero todo funciona con ella.

Y me gustaría obtener un ticket, precios y posiblemente algunas otras propiedades de posiciones y órdenes junto con el mensaje de evento.