Как можно легко писать программы работающие в MT4 и в MT5 кроссплатформенный код , стимул изучать ООП - страница 4

 
Vasiliy Sokolov:
Просто курс сейчас взят на портирование разных математических пакетов. Та же секция \Math сейчас активно развивается. Хорошо, что хоть что-то в СБ развивается.

Ну да, получается, как в ресторане. Приносят тебе кучу соусов, приправ разных. А потом спрашивают, - доставайте тарелку

- ???????

- А у нас все посетители приходят приходят со своей посудой

- да вы ***ели???????????

- ну, маленькое неудобство, зато смотрите, сколько разных редких соусов! 

 
Andrey F. Zelinsky:

3) и главное -- МТ5 сейчас по функционалу полностью перекрывает МТ4 со многими плюсами

Вот этого ну очень не хватало, чтобы говорить о полноценном перекрытии

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Список изменений в билдах MetaTrader 5 Client Terminal

MetaQuotes Software Corp., 2017.01.26 13:30

Новая версия платформы MetaTrader 5 build 1525: Представление истории в виде позиций и улучшение тестера

  1. Для хеджинговых счетов данный вид представления позиций фактически аналогичен истории счета в MetaTrader 4.



 
fxsaber:
Вот этого ну очень не хватало, чтобы говорить о полноценном перекрытии
По терминалу вообще много полезных улучшений, а это особенно
 
Vasiliy Sokolov:
// к примеру
   CTrade            trade;
...
dBid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
dAsk = SymbolInfoDouble(_Symbol,SYMBOL_ASK);


   trade.Sell(0.1,_Symbol,dBid ,dAsk +0.0020,dBid -0.0010,""); // и в MQL5 и MQL4 работает

с индикаторами примерно так
...
#ifdef __MQL4__
      ValMA[1]=iMA(NULL,PERIOD_CURRENT,14,0,MODE_EMA,PRICE_CLOSE,1);
#endif
#ifdef __MQL5__
      CopyBuffer(ind_handleMA,0,1,2,ValMA);
#endif
...

и все чудесно работает на обоих платформах

С макросами условной компиляции нужно вообще быть очень осторожным, как и с любыми другими макросами. В качестве эксперимента, попробуйте скомпилировать более менее крупный проект на C++. 9 из 10 что получите ошибку (ошибок 100-150) undefined reference to или что-нибудь в этом роде. Нет конечно, без условной компиляции не обойтись, но сама по себе это не поноцея.

Вот к примеру в Вашем коде CopyBuffer использует уже созданный хендл индикатора. А ведь его где-то надо хранить, как-то надо его создать. И все это кроссзависимый код, поэтому одним #ifdef здесь будет не обойтись, а нужно будет массу #ifdef'ов которые в результате сделают код адски сложным.

А я не вижу в чем проблемы ? Хендл хранится одинаково среди членов класса.

У меня весь код уже давно переносим.

Правда, я думал, что развиваться МТ будет в сторону неттинга, соответственно, интерфейс позиций и торговых действий у меня был неттинг-ориентированный. В данный момент - переписываю код на хедж-ориентированный. После написания переносимых классов - не будет вобще никакой разницы, где писать советник. При необходимости вызова тех или иных инструментов - объявляются соответствующие переносимые объекты, и модуль компилируется в нужной среде - хоть в МТ4, хоть в МТ5-неттинге, хоть в МТ5-хедже.

 
bool CTrade::OrderSend(const MqlTradeRequest &request,MqlTradeResult &result)
  {
   bool   res=true;
   int    ticket;
   string action="";
   string fmt   ="";
//--- action
   switch(request.action)
     {
      case TRADE_ACTION_DEAL:
         ticket=OrderSend(request.symbol,request.type,request.volume,request.price,(int)request.deviation,request.sl,request.tp,request.comment,(int)request.magic);
//         res=OrderClose((int)request.order,request.volume,request.price,(int)request.deviation);


result.deal = ticket;
result.order =ticket;
result.price =  request.price;



         break;
      case TRADE_ACTION_PENDING:
         ticket=OrderSend(request.symbol,request.type,request.volume,request.price,(int)request.deviation,request.sl,request.tp,request.comment,(int)request.magic,request.expiration);


result.deal = ticket;
result.order =ticket;
result.price =  request.price;


         break;
      case TRADE_ACTION_SLTP:
         res=OrderModify((int)request.order,request.price,request.sl,request.tp,request.expiration);
         break;
      case TRADE_ACTION_MODIFY:
         res=OrderModify((int)request.order,request.price,request.sl,request.tp,request.expiration);
         break;
      case TRADE_ACTION_REMOVE:
         res = OrderDelete((int)request.order);
         break;
      default:
         break;
     }
//--- check
   if(res)
     {
      if(m_log_level>LOG_LEVEL_ERRORS)
         printf(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
     }
   else
     {
      if(m_log_level>LOG_LEVEL_NO)
         printf(__FUNCTION__+": %s [%s]",FormatRequest(action,request),FormatRequestResult(fmt,request,result));
     }
//--- return the result
   return(res);
  }


Модернизация класса   <Trade\Trade.mqh>   
 <терминал>\MQL4\Include\Trade

после чего заработал механизм

         trade.Buy(gLots,sSymbol,pAsk,0,0,"");
         trade.Result(result);
         ticket=result.deal;