Características da linguagem mql5, subtilezas e técnicas - página 6

 
fxsaber:
A solução proposta não atingiu mais nada até agora. Portanto, eu não poderia sugerir melhor.
Obrigado por partilhar.
 
fxsaber:
Se você colocar a solução na frente da SB agora, ela se torna sincronizada.
Posso dar-lhe um pequeno exemplo? Ao ligar as aulas - a sua e a da SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Começa a repreensão da compilação
 
Artyom Trishkin:
Posso ter um pequeno exemplo? Ao ligar as aulas - a sua e a da SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Começa a praguejar ao compilar

Entrando no tema)

Tirada daqui

 
Vitaly Muzichenko:

Entrando no tema)

Tirada daqui

Já está feito.

Apenas troquei as linhas...
 
Artyom Trishkin:
Posso dar-lhe um pequeno exemplo? Ao ligar as aulas - a sua e a SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Eu recebo um palavrão em tempo de compilação.
O meu erro, demasiado confiante, não o verificou.
Vitaly Muzichenko:

Estou a entrar no assunto.)

Sim, eu esqueci-me dessa nuance. No entanto, esta restrição já não existe lá...

Se reordenar os lúdios, não vai jurar, claro. Mas o efeito será nulo - a SB não será sincronizada.

Infelizmente, eu não vejo uma solução bonita. Até agora.

// Вместо #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:
O meu erro, muito confiante, não verificou.

Sim, eu esqueci-me disso. No entanto, esta restrição já não existe lá...

Se reordenar os nichos, é claro, não vai jurar. Mas o efeito será nulo - a SB não será sincronizada.

Infelizmente, eu não vejo uma solução bonita. Até agora, até agora.

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

...
E se for necessário herdar do Trade\Trade.mqh? Como?

Bem, isto é, para ligar a sua classe, e o Trade.mqh já vai puxar para cima.
 
Artyom Trishkin:
E se for necessário herdar do Trade\Trade.mqh? Como?

Bem, isto é, para ligar a sua classe, e o Trade.mqh será puxado para cima.
A herança vai funcionar como antes. Mas é melhor esclarecer a sua pergunta.
 
fxsaber:
A herança vai funcionar como antes. Mas é melhor esclarecer a sua pergunta.
Este código deve ser herdado do CTrade.

Ou seja, faça da CTrade uma classe base na primeira linha do seu código:

class ORDERSEND  : public CTrade
Respectivamente, não é mais Trade\Trade.mqh que deve ser incluído em seu programa, mas sim um inline, por exemplo #include <aTradeSync.mqh> que contém sua classe e #include <Trade\Trade.mqh> escrito lá no início.

Como deve ser neste caso? Em vez de #incluir <Comércio\Comércio.mqh>, deve inserir o código sugerido?
 
Artyom Trishkin:
Herdar este código da CTrade.

Ou seja, faça da CTrade uma classe base na primeira linha do seu código:

class ORDERSEND  : public CTrade

Assim, você não deve mais conectar Trade\Trade.mqh ao seu programa, mas sim um inluder, por exemplo, #include <aTradeSync.mqh> que contém sua classe e #include <Trade\Trade.mqh> escrito logo no início.

Eu não o faria desta forma, pois isso exigiria a mudança de EAs previamente escritos. E o OrderSend puro não será sincronizado, apenas o SB-OrderSend. Nem todos usam apenas SB. Algumas pessoas até usam MQL5 puro.

Portanto, a solução abaixo parece ser a ideal por enquanto. Todos os EAs funcionarão sem alterações.

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

Não o faria desta forma, uma vez que exigiria a alteração de EAs previamente escritos. E o OrderSend puro não será sincronizado, apenas o SB-OrderSend. Nem todos usam apenas SB. Algumas pessoas até usam MQL5 puro.

Portanto, a solução abaixo parece ser a ideal por enquanto. Todos os EAs funcionarão sem alterações.

#include <OrderSendSync.mqh> // Если хочется, чтобы OrderSend был синхронизированным.
#include <TradeSync.mqh>     // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
Estou a ver, obrigado.
Razão: