помогите найти ошибку

 

собственно сабж, буду рад, если кто растолкует в чем принципиальная разница между МТ4 и МТ5 при написании индикаторов 

хочу переделать индикатор: KvantLevel.mq4

1-й вариант по статье https://www.mql5.com/ru/articles/81

2-й вариант пытаюсь заменить ф-ции МТ4 iHighest и iLowest на ArrayMaximum() и ArrayMinimum()

но , увы два часа пробую переделать простой индикатор и все никак :)

заранее спс 

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

1. Достаточно одного буфера
2. Если даете одним буферам сериес, то и основному тоже надо true
3. Функции поиска экстремумов возвращают ИНДЕКСЫ, а не сами значения
4. Про остальное не спрашивайте :)


#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_ARROW
#property indicator_color1  DodgerBlue
input int HLPeriod=3;
input double K=0.5;
input int MinStep=10;
double PlotBuffer[];
//------------------------------------------------------------------
void OnInit()
{
        SetIndexBuffer(0,PlotBuffer); PlotIndexSetInteger(0,PLOT_ARROW,159);
}
//------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
        ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(PlotBuffer, true); 
        int limit; if(prev_calculated>1) limit=prev_calculated-1; else limit=0;
        for(int i=rates_total-1-HLPeriod; i>=limit; i--)
        {
                PlotBuffer[i]=PlotBuffer[i+1];
                double h=high[ArrayMaximum(high, i, HLPeriod)];
                double l=low[ArrayMinimum(low, i, HLPeriod)];
                double av=0; for (int j=i;j<i+HLPeriod;j++) av+=(high[j]-low[j]); av/=HLPeriod;
                if(av>=(h-l)*K)
                        if(MathAbs((h+l)/2-PlotBuffer[i])>=Point()*MinStep) PlotBuffer[i]=(h+l)/2;
        }
        return(rates_total);
}
 
sergeev:

1. Достаточно одного буфера
2. Если даете одним буферам сериес, то и основному тоже надо true
3. Функции поиска экстремумов возвращают ИНДЕКСЫ, а не сами значения
4. Про остальное не спрашивайте :)


огромное спс, еще уточните про п.2

- без   ArraySetAsSeries() можно код писать или обязательно так?

- почему мой первый вариант не переделался как в статье?

ЗЫ:в принципе все это я знал, но чет когда обнаружил отсутствие МТ4-шных  iHighest и iLowest начались скачки по справке и форуму, и совершенно потерял нить рассуждений

 
IgorM:

огромное спс, еще уточните про п.2

- без   ArraySetAsSeries() можно код писать или обязательно так?


1. Можно скорей всего. Только информация отображаемая или анализируемая индикатором (в зависимости от характера информации в массивах) может отображаться при этом не совсем так как это задумано.

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

Также в этом сулучае следует подумать о циклах, какие они должны быть: нарастающие или убывающие (от 0 до n / от n до 0).

PS

Хотел как проще, получилось как всегда... :)

2.   iHighest и iLowest вроде были представлены в статье про миграцию. Насколько они работоспособные правда не скажу (у меня своя библиотека для этих целей)...

 
Interesting:
спс за участие, но, увы - Ваш ответ информации не нес, единственное, соглашусь, что циклы нужно перепроверить
 
IgorM:
спс за участие, но, увы - Ваш ответ информации не нес, единственное, соглашусь, что циклы нужно перепроверить
А вся информация необходимая изложена в справке, верней ее там вполне достаточно.
 
Ну не знаю, я вот недолюбливаю когда массив, как серия.
Можно мозги в узел завязать.
Как только узнал что в mql5 можно нормально работать с массивами в прямом порядке, сразу все индикаторы и эксперты пишу с нормальным обращением к элементам массива.
Прошлое -> будущее

0 -> 100

А если сомневаетесь в правильности, используйте отладку, поймете что и куда. :)

 
mrProF:
Ну не знаю, я вот недолюбливаю когда массив, как серия.
Можно мозги в узел завязать.
Как только узнал что в mql5 можно нормально работать с массивами в прямом порядке, сразу все индикаторы и эксперты пишу с нормальным обращением к элементам массива.
Прошлое -> будущее

0 -> 100

А если сомневаетесь в правильности, используйте отладку, поймете что и куда. :)

При совместном использовании МТ4 и MT5 (бывает и такое)... :) придется использовать серийность в любом случае.

Да и в получении данных от индюка или с графика удобней это, на мой взгляд - указал последний бар как 0 и не мучайся...

 
mrProF:
Ну не знаю, я вот недолюбливаю когда массив, как серия.
Можно мозги в узел завязать.
Как только узнал что в mql5 можно нормально работать с массивами в прямом порядке, сразу все индикаторы и эксперты пишу с нормальным обращением к элементам массива.
Прошлое -> будущее

0 -> 100

А если сомневаетесь в правильности, используйте отладку, поймете что и куда. :)

угу, тяжело с МТ4 на МТ5 переходить, привычки портят логику написания программ,

спс, значит  ArraySetAsSeries()  можно и убрать если не требуется для специфических задач

 

Помогите найти ошибку, пол дня ищу, не могу найти,
вот эта прграмма в виде скрипта работает правильно:

static datetime S_F[]={0,0};

void OnStart()
  {
   MqlDateTime tms;
   string st, fi;
   bool session=false;
   datetime start1=0, finish1=0, start=0, finish=0;
   ENUM_DAY_OF_WEEK days[]={SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY};
   for(int i=0;i<7;i++)
     {
      session=SymbolInfoSessionQuote(_Symbol,days[i],0,start1,finish1);
      if(session)
        {
         st=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(start1,TIME_SECONDS);
         fi=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(finish1-1,TIME_SECONDS);
         start1=StringToTime(st);
         finish1=StringToTime(fi);
         TimeToStruct(start1,tms);
         for(int m=0; m<7; m++)
           {
            if(days[tms.day_of_week]==days[m]) 
              {
               int k=(m-i)*86400;
               start1=start1-k;
               finish1=finish1-k+1;
               break;
              }
           }
         if(start==0) start=start1;
         if(finish==0) finish=finish1;
         if(finish==start1) finish=finish1;
        }
     }
   if(S_F[0]!=start) {S_F[0]=start; S_F[1]=finish;}
   Print("Начало сессии оп ",_Symbol,": ",TimeToString(S_F[0],TIME_DATE|TIME_SECONDS)," конец сессии: ",TimeToString(S_F[1],TIME_DATE|TIME_SECONDS));
   return;
  }

 при запуске на тестере в виде эксперта работает неправильно:

static datetime S_F[]={0,0};

int OnInit()
  {
   EventSetTimer(86000);
   return(0);
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();
  }

void OnTimer()
  {
   MqlDateTime tms;
   string st, fi;
   bool session=false;
   datetime start1=0, finish1=0, start=0, finish=0;
   ENUM_DAY_OF_WEEK days[]={SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY};
   for(int i=0;i<7;i++)
     {
      session=SymbolInfoSessionQuote(_Symbol,days[i],0,start1,finish1);
      if(session)
        {
         st=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(start1,TIME_SECONDS);
         fi=TimeToString(TimeCurrent(),TIME_DATE)+" "+TimeToString(finish1-1,TIME_SECONDS);
         start1=StringToTime(st);
         finish1=StringToTime(fi);
         TimeToStruct(start1,tms);
         for(int m=0; m<7; m++)
           {
            if(days[tms.day_of_week]==days[m]) 
              {
               int k=(m-i)*86400;
               start1=start1-k;
               finish1=finish1-k+1;
               break;
              }
           }
         if(start==0) start=start1;
         if(finish==0) finish=finish1;
         if(finish==start1) finish=finish1;
        }
     }
   if(S_F[0]!=start) {S_F[0]=start; S_F[1]=finish;}
   Print("Начало сессии оп ",_Symbol,": ",TimeToString(S_F[0],TIME_DATE|TIME_SECONDS)," конец сессии: ",TimeToString(S_F[1],TIME_DATE|TIME_SECONDS));
   return;
  }

 

Причина обращения: