Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 6

 
fxsaber:
La soluzione proposta non ha colpito nient'altro finora. Pertanto, non potrei suggerire di meglio.
Grazie per aver condiviso.
 
fxsaber:
Se si mette la soluzione davanti all'SB ora, diventa sincronizzata.
Posso fare un piccolo esempio? Quando si collegano le classi - la tua e quella di SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Inizia il rimprovero di compilazione
 
Artyom Trishkin:
Posso avere un piccolo esempio? Quando si collegano le classi - la tua e quella di SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Inizia a bestemmiare durante la compilazione

Entrare nel tema)

Preso da qui

 
Vitaly Muzichenko:

Entrare nel tema)

Preso da qui

Già fatto.

Ho appena scambiato le linee...
 
Artyom Trishkin:
Posso fare un piccolo esempio? Quando si collegano le classi - la tua e quella di SB:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Ottengo una parolaccia in fase di compilazione.
Colpa mia, troppo sicuro di me, non ho controllato.
Vitaly Muzichenko:

Mi sto addentrando nell'argomento).

Sì, ho dimenticato questa sfumatura. Tuttavia, questa restrizione non esiste più...

Se si riorganizzano gli inludi, non giurerà, ovviamente. Ma l'effetto sarà nullo - SB non sarà sincronizzato.

Purtroppo non vedo una bella soluzione. Finora

// Вместо #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:
Colpa mia, dichiarato con troppa sicurezza, non ho controllato.

Sì, l'avevo dimenticato. Tuttavia, questa restrizione non esiste più...

Se si riorganizzano gli inludi, ovviamente, non giura. Ma l'effetto sarà nullo - SB non sarà sincronizzato.

Purtroppo non vedo una bella soluzione. Finora, così

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

...
E se fosse necessario ereditare da Trade\Trade.mqh? Come?

Beh, cioè, per inserire la vostra classe, e Trade\Trade.mqh sarà già tirato su.
 
Artyom Trishkin:
E se fosse necessario ereditare da Trade\Trade.mqh? Come?

Beh, cioè, per collegare la tua classe, e Trade\Trade.mqh sarà tirato su.
L'eredità funzionerà come prima. Ma è meglio che tu chiarisca la tua domanda.
 
fxsaber:
L'ereditarietà funzionerà come prima. Ma è meglio che tu chiarisca la tua domanda.
Questo codice dovrebbe essere ereditato da CTrade.

Cioè, fate di CTrade una classe base nella prima riga del vostro codice:

class ORDERSEND  : public CTrade
Rispettivamente, non è più Trade\Trade.mqh che dovrebbe essere incluso nel tuo programma, ma piuttosto un inline, per esempio #include <aTradeSync.mqh> che contiene la tua classe e #include <Trade\Trade.mqh> scritto lì all'inizio.

Come dovrebbe essere in questo caso? Invece di #include <Trade\Trade.mqh>, dovresti inserire il codice suggerito?
 
Artyom Trishkin:
Eredita questo codice da CTrade.

Cioè, fate di CTrade una classe base nella prima riga del vostro codice:

class ORDERSEND  : public CTrade

Di conseguenza, non dovresti più collegare Trade\Trade.mqh al tuo programma, ma piuttosto un inluder, per esempio #include <aTradeSync.mqh> che contiene la tua classe e #include <Trade\Trade.mqh> scritto lì all'inizio.

Io non lo farei in questo modo, perché richiederebbe di cambiare gli EA scritti in precedenza. E OrderSend puro non sarà sincronizzato, solo SB-OrderSend. Non tutti usano solo SB. Alcuni usano anche MQL5 puro.

Pertanto, la soluzione seguente sembra ottimale per ora. Tutti gli EA funzioneranno senza modifiche.

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

Non lo farei in questo modo, perché richiederebbe di cambiare gli EA scritti in precedenza. E OrderSend puro non sarà sincronizzato, solo SB-OrderSend. Non tutti usano solo SB. Alcuni usano anche MQL5 puro.

Pertanto, la soluzione seguente sembra ottimale per ora. Tutti gli EA funzioneranno senza modifiche.

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