Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Предложенное решение пока больше ни на что не нарывалось. Поэтому лучше предложить не смог.
Если сейчас вставить решение перед СБ, то она станет синхронизированной.
#include <Trade\Trade.mqh>
Можно небольшой пример? При подключении классов - вашего и СБ:
#include <Trade\Trade.mqh>
Влезу в тему)
Взято отсюда
Влезу в тему)
Взято отсюда
Просто местами строки поменял...
Можно небольшой пример? При подключении классов - вашего и СБ:
#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
Виноват, излишне самоуверенно заявил, не проверил.
Да, запамятовал про этот нюанс. Правда, там этого ограничения уже нет...
Если переставить местами инклудники, то ругаться, конечно, не будет. Но эффект станет нулевым - СБ не будет синхронизирован.
К сожалению, красивого решения не вижу. Пока так
// Это сделает СБ синхронизированным и не потребует каких-либо изменений в экспертах.
...
Ну, т.е., чтобы подключать ваш класс, а Trade\Trade.mqh уже прицепом подтянется.
А если требуется унаследоваться от Trade\Trade.mqh ? Как?
Ну, т.е., чтобы подключать ваш класс, а Trade\Trade.mqh уже прицепом подтянется.
Наследование будет работать, как и раньше. Но лучше уточните свой вопрос.
Т.е., в первой строке в вашем коде сделать CTrade базовым классом:
Как в таком случае быть? Вместо #include <Trade\Trade.mqh> вставить предлагаемый код?
Вот этот код унаследовать от CTrade.
Т.е., в первой строке в вашем коде сделать CTrade базовым классом:
Соответственно, подключать к своей программе уже не Trade\Trade.mqh, а инклудник, например, #include <aTradeSync.mqh>, в котором содержится ваш класс, и там же, в самом начале, прописан #include <Trade\Trade.mqh> .
Так бы не делал, т.к. это потребует изменения ранее написанных экспертов. И чистый OrderSend не будет синхронизирован, а только СБ-OrderSend. Не все же используют СБ-only. Некоторые и чистый MQL5 не брезгуют.
Поэтому ниже решение видится пока оптимальным. Все эксперты будут работать без изменений.
#include <TradeSync.mqh> // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.
Так бы не делал, т.к. это потребует изменения ранее написанных экспертов. И чистый OrderSend не будет синхронизирован, а только СБ-OrderSend. Не все же используют СБ-only. Некоторые и чистый MQL5 не брезгуют.
Поэтому ниже решение видится пока оптимальным. Все эксперты будут работать без изменений.
#include <TradeSync.mqh> // Если подключен OrderSendSync.mqh - СБ станет синхронизированной, иначе - стандартной.