Características del lenguaje mql5, sutilezas y técnicas - página 6

 
fxsaber:
La solución propuesta no ha dado nada más hasta ahora. Por lo tanto, no podría sugerirlo mejor.
Gracias por compartirlo.
 
fxsaber:
Si ahora se pone la solución delante de la CCI, se sincroniza.
¿Puedo poner un pequeño ejemplo? Cuando se conectan las clases - la suya y la de SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Comienza la regañina de la compilación
 
Artyom Trishkin:
¿Me das un pequeño ejemplo? Cuando se conectan las clases - la suya y la de SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Comienza a maldecir al compilar

Entrando en el tema)

Tomado de aquí

 
Vitaly Muzichenko:

Entrando en el tema)

Tomado de aquí

Ya está hecho.

Acabo de cambiar las líneas...
 
Artyom Trishkin:
¿Puedo poner un pequeño ejemplo? Al enchufar las clases - las tuyas y las de SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Me sale una palabrota en tiempo de compilación.
Culpa mía, exceso de confianza, no lo comprobé.
Vitaly Muzichenko:

Me estoy metiendo en el tema).

Sí, me olvidé de ese matiz. Sin embargo, esta restricción ya no existe allí...

Si reordena las inlusiones, no jurará, por supuesto. Pero el efecto será nulo: la SB no se sincronizará.

Por desgracia, no veo una solución bonita. Hasta ahora

// Вместо #include <Trade\Trade.mqh> использовать этот код
// Это сделает СБ синхронизированным и не потребует каких-либо изменений в экспертах.

#ifdef OrderSend
  #undef OrderSend

  #define CTrade CTradeBase
    #include <Trade\Trade.mqh>
  #undef CTrade
  
  class CTrade : public CTradeBase
  {
    virtual bool OrderSend(const MqlTradeRequest &request,MqlTradeResult &result)
      {
       bool res;
       string action="";
       string fmt   ="";
    //--- action
       if(m_async_mode)
          res=::OrderSendAsync(request,result);
       else
          res=ORDERSEND::OrderSendSync(request,result); // единственное отличие от стандарта
    //--- check
       if(res)
         {
          if(m_log_level>LOG_LEVEL_ERRORS)
             PrintFormat(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
         }
       else
         {
          if(m_log_level>LOG_LEVEL_NO)
             PrintFormat(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
         }
    //--- return the result
       return(res);
      }
  };
  
  // Эта строчка позволяет сделать все OrderSend корректными.
  #define OrderSend ORDERSEND::OrderSendSync  
#else
  
#include <Trade\Trade.mqh>
#endif
 
fxsaber:
Culpa mía, por exceso de confianza, no lo comprobé.

Sí, lo había olvidado. Sin embargo, esta restricción ya no existe allí...

Si reordena las inlusiones, por supuesto, no jurará. Pero el efecto será nulo: la SB no se sincronizará.

Por desgracia, no veo una solución bonita. Hasta ahora

// Вместо #include <Trade\Trade.mqh> использовать этот код
// Это сделает СБ синхронизированным и не потребует каких-либо изменений в экспертах.

...
¿Y si se requiere heredar de Trade\Trade.mqh ? ¿Cómo?

Bueno, es decir, para conectar su clase, y Trade\Trade.mqh ya se tire hacia arriba.
 
Artyom Trishkin:
¿Y si se requiere heredar de Trade\Trade.mqh ? ¿Cómo?

Bueno, es decir, para conectar su clase, y Trade\Trade.mqh se sacará.
La herencia funcionará como antes. Pero será mejor que aclare su pregunta.
 
fxsaber:
La herencia funcionará como antes. Pero será mejor que aclare su pregunta.
Estecódigo debe ser heredado de CTrade.

Es decir, hacer de CTrade una clase base en la primera línea de su código:

class ORDERSEND  : public CTrade
Respectivamente, ya no es Trade\Trade.mqh lo que debe incluirse en su programa, sino un inline, por ejemplo #include <aTradeSync.mqh> que contiene su clase y #include <Trade\Trade.mqh> escrito allí al principio.

¿Cómo debería ser en este caso? En lugar de #include <Trade\Trade.mqh>, ¿debe insertar el código sugerido?
 
Artyom Trishkin:
Hereda este código de CTrade.

Es decir, hacer de CTrade una clase base en la primera línea de su código:

class ORDERSEND  : public CTrade

En consecuencia, ya no debe conectar Trade\Trade.mqh a su programa, sino un inluder, por ejemplo #include <aTradeSync.mqh> que contiene su clase y #include <Trade\Trade.mqh> escrito allí al principio.

Yo no lo haría de esta manera, ya que requeriría cambiar los EAs previamente escritos. Y el OrderSend puro no se sincronizará, sólo el SB-OrderSend. No todo el mundo utiliza sólo el SB. Algunas personas incluso utilizan MQL5 puro.

Por lo tanto, la siguiente solución parece óptima por ahora. Todos los EAs funcionarán sin cambios.

#include <OrderSendSync.mqh> // Если хочется, чтобы OrderSend был синхронизированным.
#include <TradeSync.mqh>     // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
Archivos adjuntos:
 
fxsaber:

No lo haría de esta manera, ya que requeriría cambiar los EAs previamente escritos. Y el OrderSend puro no se sincronizará, sólo el SB-OrderSend. No todo el mundo utiliza sólo el SB. Algunas personas incluso utilizan MQL5 puro.

Por lo tanto, la siguiente solución parece óptima por ahora. Todos los EAs funcionarán sin cambios.

#include <OrderSendSync.mqh> // Если хочется, чтобы OrderSend был синхронизированным.
#include <TradeSync.mqh>     // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
Ya veo, gracias.
Razón de la queja: