Как переписать код с MQL4 на MQL5 ? - страница 4

 
borilunad:

А если мне нужен пока только новый МКЛ4, который вот-вот могут ввести в новом метаэдиторе МТ4-МТ5, где могу найти понятное объяснение перехода на "новые рельсы", основываясь только на знании МКЛ4? Или тут тоже без МКЛ5 уже не обойтись?! Ведь уже наработанное и исправно работающее сейчас, завтра окажется непригодным! И что делать?! Посоветуйте, пожалуйста, но без МКЛ5!

То, что наработано, будет работать и там. Ну, может, внесёте минимальные доработки.
 
Urain:

Так если советник делается в мастере MQL5 то больше $10 он и не стоит, так что минималка адекватная.

Другое дело что масса программистов освоив штамповку дальше этого и не идёт, берётся за любой проект, а если он оказывается сложным то просто бросает его (подумаешь одним плохим отзывом больше, в общей массе сделанного это не заметно).

А что, разве есть такие "разработчики", которые заказы делают в мастере? Как мне кажется, заказ - штучное производство. А в мастере можно и самому заказчику себе сделать. Либо, если совсем лень народу, то ввести чекбокс "Разработка в мастере MQL5", за такое и минималку $10 сделать. Остальное - по адекватным ценам. Во всём мире труд программиста оценивается достаточно высоко. А в сервисе Работа - беда прямо...
 
artmedia70:
То, что наработано, будет работать и там. Ну, может, внесёте минимальные доработки.

Привет, Артём! Благодарю за внимание и ответ! Правда, с вашим другим лооком не признал сразу. Так где эти "минимальные доработки" могу изучить? Ведь Ренат их только бегло перечислил, не объяснив, в чём разница?

Например, это первое же:

"Изменился приоритет логических операций И/ИЛИ. Теперь всё как в классическом C/C++."

В чём смысл изменения "приоритета"? Вдруг сработала ссылка, посмотрел, но разницы конкретной не усёк.

И тут: "Раньше в функции start можно было указывать параметры."! Теперь все параметры нужно представлять вначале между extern и int init()?

 

Добрый всем вечер. Помогите пож. переписать индюка с mq4 на mq5. Вот сам код:

//---------------------------------- 

//           IND22.mq4

//----------------------------------


#property indicator_chart_window

#property indicator_buffers 3

#property indicator_color1    Magenta

#property indicator_color2 Magenta

#property indicator_color3 DodgerBlue

#property indicator_width1 0

#property indicator_width2 2

#property indicator_width3 2


extern string TimeFrame = "0";

extern int Length = 1;

extern int tprice = PRICE_LOW;

extern int barscount = 50;


bool timeOp = TRUE;

double Buf0[];

double Buf1[];

double Buf2[];

string N_Indic;

bool AdaptTF;

bool AdaptTF1;

int TF,begin;

string Mperiod[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"};

int    Tperiod[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};


int init() {

   IndicatorDigits(Digits);

   IndicatorBuffers(3);


   //#define accountNum  1111

  // #define expiryDate "2019.01.30"


   Length = MathMax(Length, 1);

   begin = 5 * Length;


   SetIndexBuffer(0, Buf0);

   SetIndexDrawBegin(0, begin);

   SetIndexBuffer(1, Buf1);

   SetIndexDrawBegin(1, begin);

   SetIndexBuffer(2, Buf2);

   SetIndexDrawBegin(2, begin);

   IndicatorShortName("IND22");


   N_Indic = WindowExpertName();

   AdaptTF = TimeFrame == "calculateTma";

   if (AdaptTF) return (0);

   AdaptTF1 = TimeFrame == "returnBars";

   if (AdaptTF1) return (0);


  if (TimeFrame == "0") {

      TimeFrame = "" + Period();

   }

   for (int K = 0; K <= 8; K++) {

      if (K == 8) {return (0);

         if (TimeFrame == "" + Tperiod[K]) {

            TF = On_tf("" + Tperiod[K]);

            break;

         }      

       }

      if (K == 2) {

         if (TimeFrame == "" + Tperiod[K]) {

            TF = On_tf("" + Tperiod[K + 2]);

            break;

         }

       }  

      else {

         if (TimeFrame == "" + Tperiod[K]) {

            TF = On_tf("" + Tperiod[K+1]);

            break;

         }    

      } 

   } 

   return (0);

}

//--------------------

int deinit() {

   return (0);

}

//--------------------

int start() {

     //if (AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_DEMO) return(0);

    // if(TimeCurrent() >= StringToTime(expiryDate)) {return(0);} 

     //if (accountNum!=AccountNumber()) {return(0);} 

   int cize;

   double Length1;

   double Length2;

   int shift,limit;

   int datetimeOp;

   double koef;


   int bcount = IndicatorCounted();

   if (bcount < 0) return (-1);

   

   if(BarChanged() || bcount==0)

  {

   Length1=0;

   Length2=0;

   limit = Bars - 1;

  }

  else

   if (bcount > 0)

    limit = Bars - bcount + begin; 

   limit++;   

   

   SetIndexDrawBegin(0, Bars-barscount);

   SetIndexDrawBegin(1, Bars-barscount);

   SetIndexDrawBegin(2, Bars-barscount);

   if (AdaptTF || TF == Period()) {

      for (int ii = limit; ii >= 0; ii--) {

         Length1 = (Length + 1) * iMA(NULL, 0, 1, 0, MODE_SMA, tprice, ii);

         Length2 = Length + 1;

         cize = 1;

         for (int kk = Length; cize <= Length; kk--) {

            Length1 += kk * iMA(NULL, 0, 1, 0, MODE_SMA, tprice, ii + cize);

            Length2 += kk;

          if (cize <= ii) {

            Length1 += kk * iMA(NULL, 0, 1, 0, MODE_SMA, tprice, ii - cize);

            Length2 += kk;

            }

            cize++;

         }

         Buf0[ii] = Length1 / Length2;

   

     }

      return (0);

   }

    limit = Bars - bcount + begin; 

   if (limit> barscount+5)  limit = barscount+5;

   for (ii = limit; ii >= 0; ii--) {

      shift = iBarShift(NULL, TF, Time[ii]);

      Buf0[ii] = iCustom(NULL, TF, N_Indic, "calculateTma", Length, tprice, 0, shift);

      if (TF <= Period() || shift == iBarShift(NULL, TF, Time[ii - 1])) continue;

      if (timeOp) {

         datetimeOp = iTime(NULL, TF, shift);

         for (int b = 1; ii + b < Bars && Time[ii + b] >= datetimeOp; b++) {

         }

         koef = 1.0 / b;

         for (kk = 1; kk < b; kk++) {

            Buf0[ii + kk] = kk * koef * (Buf0[ii + b]) + (1.0 - kk * koef) * Buf0[ii];

         }


     for(int i = limit; i >= 0; i--)

     {  

       Buf2[i] = Buf0[i]; 

       Buf1[i] = Buf0[i]; 

     if (Buf0[i] > Buf0[i+1])

        {

        Buf2[i] = EMPTY_VALUE;

        Buf1[i+1] = Buf0[i+1];

        }

      // else //

      if (Buf0[i] < Buf0[i+1]) 

        {

        Buf1[i] = EMPTY_VALUE; 

        Buf2[i+1] = Buf0[i+1];

        }  

     }

         

      }

   }

   RefreshRates();

   return (0);

}


int On_tf(string tt) {

   tt = F01(tt);

   for (int bcount = ArraySize(Tperiod) - 1; bcount >= 0; bcount--)

      if (tt == Mperiod[bcount] || tt == "" + Tperiod[bcount]) return (MathMax(Tperiod[bcount], Period()));

   return (Period());

}


string F01(string tt) {

   int kk;

   string ret1 = tt;

   for (int cize = StringLen(tt) - 1; cize >= 0; cize--) {

      kk = StringGetChar(ret1, cize);

      if ((kk > '`' && kk < '{') || (kk > 'Я' && kk < 256)) ret1 = StringSetChar(ret1, cize, kk - 32);

      else

         if (kk > -33 && kk < 0) ret1 = StringSetChar(ret1, cize, kk + 224);//kk + 224

   }

   return (ret1);

 }

//-----------------------

  bool BarChanged(){

  static datetime dt = 0;

  if (dt != Time[0])

  {

   dt = Time[0];

   return(true);

  }

   return(false);

}

//------------------------------

 
Это какой-то цветной МА для первых 50 свечей.