Особенности языка mql5, тонкости и приёмы работы - страница 6

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasiliy Pushkaryov
6826
Vasiliy Pushkaryov  
fxsaber:
Предложенное решение пока больше ни на что не нарывалось. Поэтому лучше предложить не смог.
Спасибо, что поделились.
Artyom Trishkin
Модератор
125690
Artyom Trishkin  
fxsaber:
Если сейчас вставить решение перед СБ, то она станет синхронизированной.
Можно небольшой пример? При подключении классов - вашего и СБ:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Начинается ругань при компиляции
Vitaly Muzichenko
12499
Vitaly Muzichenko  
Artyom Trishkin:
Можно небольшой пример? При подключении классов - вашего и СБ:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Начинается ругань при компиляции

Влезу в тему)

 

Взято отсюда 

Artyom Trishkin
Модератор
125690
Artyom Trishkin  
Vitaly Muzichenko:

Влезу в тему)

 

Взято отсюда 

Уже.

Просто местами строки поменял...
fxsaber
14683
fxsaber  
Artyom Trishkin:
Можно небольшой пример? При подключении классов - вашего и СБ:
#include <Ваш_класс.mqh>
#include <Trade\Trade.mqh>
Начинается ругань при компиляции
Виноват, излишне самоуверенно заявил, не проверил.
Vitaly Muzichenko:

Влезу в тему)

Да, запамятовал про этот нюанс. Правда, там этого ограничения уже нет...

Если переставить местами инклудники, то ругаться, конечно, не будет. Но эффект станет нулевым - СБ не будет синхронизирован.

К сожалению, красивого решения не вижу. Пока так

// Вместо #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
Artyom Trishkin
Модератор
125690
Artyom Trishkin  
fxsaber:
Виноват, излишне самоуверенно заявил, не проверил.

Да, запамятовал про этот нюанс. Правда, там этого ограничения уже нет...

Если переставить местами инклудники, то ругаться, конечно, не будет. Но эффект станет нулевым - СБ не будет синхронизирован.

К сожалению, красивого решения не вижу. Пока так

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

...
А если требуется унаследоваться от Trade\Trade.mqh ? Как?

Ну, т.е., чтобы подключать ваш класс, а Trade\Trade.mqh уже прицепом подтянется.
fxsaber
14683
fxsaber  
Artyom Trishkin:
А если требуется унаследоваться от Trade\Trade.mqh ? Как?

Ну, т.е., чтобы подключать ваш класс, а Trade\Trade.mqh уже прицепом подтянется.
Наследование будет работать, как и раньше. Но лучше уточните свой вопрос.
Artyom Trishkin
Модератор
125690
Artyom Trishkin  
fxsaber:
Наследование будет работать, как и раньше. Но лучше уточните свой вопрос.
Вот этот код унаследовать от CTrade.

Т.е., в первой строке в вашем коде сделать  CTrade базовым классом:

class ORDERSEND  : public CTrade
Соответственно, подключать к своей программе уже не Trade\Trade.mqh, а инклудник, например, #include <aTradeSync.mqh>, в котором содержится ваш класс, и там же, в самом начале, прописан #include <Trade\Trade.mqh> .

Как в таком случае быть? Вместо #include <Trade\Trade.mqh> вставить предлагаемый код?
fxsaber
14683
fxsaber  
Artyom Trishkin:
Вот этот код унаследовать от CTrade.

Т.е., в первой строке в вашем коде сделать  CTrade базовым классом:

class ORDERSEND  : public CTrade

Соответственно, подключать к своей программе уже не Trade\Trade.mqh, а инклудник, например, #include <aTradeSync.mqh>, в котором содержится ваш класс, и там же, в самом начале, прописан #include <Trade\Trade.mqh> .

Так бы не делал, т.к. это потребует изменения ранее написанных экспертов. И чистый OrderSend не будет синхронизирован, а только СБ-OrderSend. Не все же используют СБ-only. Некоторые и чистый MQL5 не брезгуют.

Поэтому ниже решение видится пока оптимальным. Все эксперты будут работать без изменений.

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

Так бы не делал, т.к. это потребует изменения ранее написанных экспертов. И чистый OrderSend не будет синхронизирован, а только СБ-OrderSend. Не все же используют СБ-only. Некоторые и чистый MQL5 не брезгуют.

Поэтому ниже решение видится пока оптимальным. Все эксперты будут работать без изменений.

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