Совместимость 4ки и 5ки. Быстрый переход

 

Кто может поделится советами и примочками для быстрого перехода с 4ки на 5ку, Велкам! Если нужно пару баксов, то я со своего кармана даю 100тку баков ($100) тому, кто реально этого заслужит в обсуждении этой темы. Достойного выберем всем сообществом, путем голосования (оплата через фриланс). Тема думаю понятна и будет полезна всем. Интересен быстрый и понятный переход с 4ки на 5рку. Не переписывать код 4ки с самого начала, а адаптировать его на 5ку путем замены переменных и добавлением нескольких строк к коду. Сам так делал, все возможно (простенький правда). Чем проще будет все сделать, тем лучше. Реальные примеры обязательны. Про вознаграждение не гоню, качайте скрин для гарантии или процитируйте первый пост!

Если подойдет, то в качестве примера на совместимость набросал из запчастей безиндикаторный советник, работает на безоткатном скачке цены, с выводком инфы по счету, общим тралом позиций, автолотом и безубытком. Опубликую в КодоБазе версию до и после конверта. Этот код на данный момент без справки и недели времени не осилю, хотелось бы научится быстро перестраиваться на 5ку. (за качество кода не пинать, набросал на скорую руку)

 
Так берите себе свои 100 баксов, это вы тут такой единственно уникальный который " Сам так делал, все возможно" и тему можно закрывать.
 
Dmitry Fedoseev:
Так берите себе свои 100 баксов, это Вы тут такой единственно уникальный, который " Сам так делал, все возможно" и тему можно закрывать.

Прикольно. А че такая агрессия то?

Я что, плохое что-то предложил, или только в свою харю..?

100 баксов взбесили или что!? Ну больше не могу, сорри если мало.

 
Да ничего такого, кроме сомнения, через "е" ли пишется слово "че". Вы тут самый заслуживающий. у вас же  "Сам так делал, все возможно", у нас другая реальность.
 
Dmitry Fedoseev:
Да ничего такого, кроме сомнения, через "е" ли пишется слово "че". Вы тут самый заслуживающий. у вас же  "Сам так делал, все возможно", у нас другая реальность.

У Вас ко мне личная неприязнь что ли?

 
Vladimir Gribachev:

У Вас ко мне личная неприязнь что ли?

Вам так сильно хочется?

Нет простого метода перевода советника с МТ4 в МТ5.

1. Советник может работать с несколькими рыночными ордерами, притом разнонаправленными.

2. Советник может держать разнонаправленные отложенные ордера, если в МТ4 допустимо срабатывание из обеих, в МТ5 это будет недопустимо, т.е. требуется переработка алгоритма советника. 

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

--

Есть конечно вариант "виртуальной прокладки" - в массивах хранить аналоги рыночных ордеров, а в рынок выводить совокупную позицию. Но нафига такая жизнь... 

 
Dmitry Fedoseev:

Нет простого метода перевода советника с МТ4 в МТ5.

Я надеюсь что все таки есть.

Некоторые экспериментальные куски кода которыми я заменял привычные для 4ки функции примерно год назад. Не пару строк конечно, но как мог. С тех пор в 5рку даже и не заглядывал. Думаю, что многое с тех пор поменялось и стало намного проще.

datetime iTime(string symb, ENUM_TIMEFRAMES period, int h_shift)
     {
     datetime Time[];
     if (CopyTime(symb,period,0,h_shift+1,Time)==h_shift+1)
          return(Time[0]);
     else
          return(-1);     
     }

double iClose (string symb, ENUM_TIMEFRAMES period, int h_shift)
     {
     double CLOSE[];
     if (CopyClose(symb,period,0,h_shift+1,CLOSE)==h_shift+1)
          return(CLOSE[0]);
     else
          return(-1);     
     }
double iOpen (string symb, ENUM_TIMEFRAMES period, int h_shift)
     {
     double OPEN[];
     if (CopyOpen(symb,period,0,h_shift+1,OPEN)==h_shift+1)
          return(OPEN[0]);
     else
          return(-1);     
     }
double iHigh (string symb, ENUM_TIMEFRAMES period, int h_shift)
     {
     double HIGH[];
     if (CopyHigh(symb,period,0,h_shift+1,HIGH)==h_shift+1)
          return(HIGH[0]);
     else
          return(-1);     
     }
double iLow (string symb, ENUM_TIMEFRAMES period, int h_shift)
     {
     double LOW[];
     if (CopyLow(symb,period,0,h_shift+1,LOW)==h_shift+1)
          return(LOW[0]);
     else
          return(-1);     
     }
int iBarShift(string symb,ENUM_TIMEFRAMES period, datetime h_time)
     {
     return(Bars(symb,period,TimeCurrent(),h_time)-1);
     }
int iHighest (string symb, ENUM_TIMEFRAMES period, ENUM_SERIES_ID series_id, int count, int start=0)
     {
     double buf[];
     int h_result;
     ArrayFree(buf);
     ArrayResize(buf,count);
     switch (series_id)
      {
      case MODE_OPEN:
         if (CopyOpen(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      case MODE_LOW:
         if (CopyLow(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      case MODE_HIGH:
         if (CopyHigh(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      case MODE_CLOSE:
         if (CopyClose(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      
      default:
          return(-1);     
      }
     h_result=count-ArrayMaximum(buf);
     return(h_result);
     }
int iLowest (string symb, ENUM_TIMEFRAMES period, ENUM_SERIES_ID series_id, int count, int start=0)
     {
     double buf[];
     int h_result;
     ArrayFree(buf);
     ArrayResize(buf,count);
     switch (series_id)
      {
      case MODE_OPEN:
         if (CopyOpen(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      case MODE_LOW:
         if (CopyLow(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      case MODE_HIGH:
         if (CopyHigh(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      case MODE_CLOSE:
         if (CopyClose(symb,period,start, count, buf)<=0)
            return(-1);
         break;
      
      default:
          return(-1);     
      }
     h_result=count-ArrayMinimum(buf);
     return(h_result);
     }
int OrderSend(string symbol,ENUM_ORDER_TYPE direct,double lots,double h_price,int slippage=0,double h_SL=0,double h_TP=0,string comment="",int Magic=NULL,datetime expiration=0,color clr=clrNONE)
   {
   MqlTradeRequest  request={};      // структура запроса
   MqlTradeResult   h_result={};
   request.symbol=symbol;
   request.type=direct;
   request.volume=lots;
   if (direct==ORDER_TYPE_BUY || direct==ORDER_TYPE_SELL)
      request.price=h_price;
   else
      {
      request.price=h_price;
      request.stoplimit=SymbolInfoDouble(symbol,SYMBOL_BID);
      }  
   request.deviation=slippage;
   request.sl=h_SL;
   request.tp=h_TP;
   request.comment=comment;
   request.magic=Magic;
   request.expiration=expiration;
   request.type_time=(expiration==0 ? ORDER_TIME_GTC : ORDER_TIME_SPECIFIED);
   request.type_filling=ORDER_FILLING_IOC;
   request.action=((direct==ORDER_TYPE_BUY || direct==ORDER_TYPE_SELL) ? TRADE_ACTION_DEAL : TRADE_ACTION_PENDING);
   if (!OrderSend(request,h_result))
      return(-1);
   Sleep(150);
   if (direct==ORDER_TYPE_BUY || direct==ORDER_TYPE_SELL)
      return((int)h_result.deal);
   else
      {
      if (expiration>0 && OrderSelect(h_result.order))
         if (OrderGetInteger(ORDER_TIME_EXPIRATION)!=expiration)
            {
            
            }
      return((int)h_result.order);
      } 
   }
double AccountFreeMarginCheck(string symbol,ENUM_ORDER_TYPE direct,double lots,uint& retcode, string& comment)
   {
   MqlTradeRequest  h_request={};      // структура запроса
   MqlTradeCheckResult   h_result={};
   h_request.symbol=symbol;
   h_request.type=direct;
   h_request.volume=lots;
   h_request.price=NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK),_Digits);
   h_request.sl=0;
   h_request.tp=0;
   h_request.deviation=0;
   h_request.type_filling=ORDER_FILLING_IOC;
   h_request.action=((direct==ORDER_TYPE_BUY || direct==ORDER_TYPE_SELL) ? TRADE_ACTION_DEAL : TRADE_ACTION_PENDING);
   if (!OrderCheck(h_request,h_result))
      {
      retcode=h_result.retcode;
      comment=h_result.comment;
      return(-1);
      }
   retcode=h_result.retcode;
   return(h_result.margin_free);
   }
int OrderModify(string symbol,double h_SL=0,double h_TP=0)
   {
   MqlTradeRequest  h_request={};      // структура запроса
   MqlTradeResult   h_result={};
   if (!PositionSelect(symbol) || PositionGetDouble(POSITION_VOLUME)<=0)
      return(-1);
   h_request.symbol=symbol;
   h_request.sl=h_SL;
   h_request.tp=h_TP;
   h_request.action=TRADE_ACTION_SLTP;
   bool h_res=OrderSend(h_request,h_result);
   Sleep(150);
   if (!h_res)
      {
      Print ("Order not modify. "+h_result.comment);
      return(-1);
      }
   else
      return((int)h_result.deal);   
   }
int OrderModifyPending(ulong l_ticket,double h_price=0, double h_SL=0,double h_TP=0,datetime Expiration=0)
   {
   MqlTradeRequest  h_request={};      // структура запроса
   MqlTradeResult   h_result={};
   if (!OrderSelect(l_ticket))
      return(-1);
   h_request.symbol=OrderGetString(ORDER_SYMBOL);
   h_request.price=(h_price<=0 ? OrderGetDouble(ORDER_PRICE_OPEN):h_price);
   h_request.order=l_ticket;
   h_request.sl=h_SL;
   h_request.tp=h_TP;
   h_request.type_time=(ENUM_ORDER_TYPE_TIME)OrderGetInteger(ORDER_TYPE_TIME);
   h_request.expiration=Expiration;
   h_request.action=TRADE_ACTION_MODIFY;
   bool h_res=OrderSend(h_request,h_result);
   Sleep(150);
   if (!h_res)
      {
      Print ("Order not modify. "+h_result.comment);
      return(-1);
      }
   else
      return((int)h_result.order);   
   }
bool OrderDelete(ulong h_ticket,color clr)
   {
   MqlTradeRequest  h_request={};      // структура запроса
   MqlTradeResult   h_result={};
//   request.symbol=_Symbol;
   h_request.order=h_ticket;
//   request.volume=lots;
//   request.price=price;
//   request.deviation=slippage;
//   request.sl=SL;
//   request.tp=TP;
//   request.comment=comment;
//   request.magic=Magic;
//   request.expiration=expiration;
   h_request.action=TRADE_ACTION_REMOVE;
   if (!OrderSend(h_request,h_result))
      return(false);
   else
      return(true);   
   }
 
Vladimir Gribachev:

Я надеюсь что все таки есть.

...

На примере всем известного илана.

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

 
Начните с этой статьи.
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 
Также, чтобы свое не придумывать, можете ознакомиться со стандартной библиотекой.
 
Dmitry Fedoseev:

На примере всем известного илана.

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

Дмитрий, кажется Вы еще не в курсе, но МТ5 отныне поддерживает локи (хеждирумый тип счета). Поэтому поднимаемая тема топикстартера закономерна.
Причина обращения: