Реверс отображения

 

Доброго всем времени.

Помогите плз понять - почему этот код в MQ5 отрисовывается нормально на последнем баре, а в MQ4 рисует на конце истории, т.е в абсолютно противоположную сторону??

(взят индикатор от сюда - https://www.mql5.com/ru/code/7050)

//+------------------------------------------------------------------+
//| input parameters                                                 |
//+------------------------------------------------------------------+
//--- Main
input  int             Depth      = 24;         // Zigzag: Ширина окна поиска(Depth)
input  int             Deviation  = 12;         // Zigzag: Изменение цены в пуктах(Deviation)
input  int             Backstep   = 9;          // Zigzag: Отсутп от начала данных(Backstep)
sinput int             HistSize   = 500;        // Zigzag: Размер истории для расчетов
//--- Arrow
sinput color           ColorArrow = clrBlue;    // Цвет паттерных точек
//--- Trend
sinput color           ColorTrend = clrGold;    // Цвет паттерной линии
sinput int             WidthTrend = 2;          // Толщина паттерной линии
sinput bool            BackTrend  = true;       // Задний план для паттерной линии
sinput ENUM_LINE_STYLE StyleTrend = STYLE_SOLID;// Стиль паттерной линии
//--- HLine
sinput color           ColorUpHLine   = clrBlue;// Цвет линии сопротивления        
sinput color           ColorDownHLine = clrRed; // Цвет линии поддержки        
sinput int             WidthHLine = 2;          // Толщина линий уровня
sinput bool            BackHLine  = true;       // Задний план для линий уровня
sinput ENUM_LINE_STYLE StyleHLine = STYLE_SOLID;// Стиль линий уровня
//+------------------------------------------------------------------+
//| Глобальные переменные                                            |
//+------------------------------------------------------------------+
int                    Line       = 1;          // Номер первой строки комментария
MyCPatternZigzag*      MyPatternZigzag;         // Класс: модели паттерной системы
MyCListPattern*        MyListPattern;           // Класс: хранилище графических объектов
MyCComment*            MyComment;               // Класс: комментария
//+------------------------------------------------------------------+
//|Буфера для индикатора(использовать в генераторе торговых сигналов)|
//+------------------------------------------------------------------+
double                 ExtPointE[];             // Буфер: для хранения точки E
double                 ExtDeltaDE[];            // Буфер: для хранения длины волны D-E(в пунктах!)
double                 ExtEvolution[];          // Буфер: для хранения эволюций
double                 ExtMutation[];           // Буфер: для хранения мутаций
double                 ExtSumModel[];           // Буфер: для хранения счетчика-модели
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- Подготовка графика цен, график должен быть смещен от правого угла, иначе пользователь не увидит прогноза
   if(!ChartShiftGet(0))
     {
      ChartShiftSet(true, 0);
     }
   //---
   SetIndexBuffer(0,ExtPointE,    INDICATOR_DATA);
   SetIndexBuffer(1,ExtDeltaDE,   INDICATOR_DATA);
   SetIndexBuffer(2,ExtEvolution, INDICATOR_DATA);
   SetIndexBuffer(3,ExtMutation,  INDICATOR_DATA);
   SetIndexBuffer(4,ExtSumModel,  INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   //--- 
   MyPatternZigzag= new MyCPatternZigzag;
   MyComment      = new MyCComment;
   MyListPattern  = new MyCListPattern;
   //--- Main
   MyPatternZigzag.SetDepth(Depth);
   MyPatternZigzag.SetDeviation(Deviation);
   MyPatternZigzag.SetBackstep(Backstep);
   MyPatternZigzag.AddPointerCommet(MyComment);
   MyPatternZigzag.SetNumberLineComment(Line);         // номер строки коммента
   MyPatternZigzag.SetSizeBuffers(HistSize);
   //--- Arrow, HLine & Trend
   MyListPattern.SetColorArrow(ColorArrow);
   MyListPattern.SetColorTrend(ColorTrend);
   MyListPattern.SetStyleTrend(StyleTrend);
   MyListPattern.SetWidthTrend(WidthTrend);
   MyListPattern.SetBackTrend(BackTrend);
   MyListPattern.SetStyleHLine(StyleHLine);
   MyListPattern.SetColorUpHLine(ColorUpHLine);
   MyListPattern.SetColorDownHLine(ColorDownHLine);
   MyListPattern.SetWidthHLine(WidthHLine);
   MyListPattern.SetBackHLine(BackHLine);
   //---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinit                                                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete MyPatternZigzag;
   delete MyListPattern;
   delete MyComment;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   //--- нельзя расчитывать индикатор при "малой истории"
   if(rates_total > HistSize)
     {
      //--- есть ли что считать? и был ли расчет до этого...
      int nHowMush = rates_total-prev_calculated;
      //--- Цикл подсчета
      if(nHowMush > 0)
        {
         //--- Временные переменные
         double   new_high[],new_low[];
         datetime new_time[];
         //--- Определяем размер буферов
         ArrayResize(new_high,HistSize,0);
         ArrayResize(new_low,HistSize,0);
         
         ArrayResize(new_time,HistSize,0);
         //--- Узнаем от КУДА и СКОЛЬКО считать
         int nStart = 0;                              // Индекс начала расчетов(окончание)
         int nCopy  = 0;                              // Индекс с которого начинается копирование во временные буфера
         if(prev_calculated == 0)
           {//--- Начало расчетов
            nStart = HistSize - 1;
           }else
              {//--- Продолжение расчетов
               nStart = prev_calculated - 1;
              }
         //--- Подсчет
         for(;nStart<rates_total;nStart++)
           {
            //--- Место от куда начинать копировать
            nCopy = 1+nStart-HistSize;
            //--- Копирование данных
            ArrayCopy(new_low, low, 0,nCopy,HistSize);
            ArrayCopy(new_high,high,0,nCopy,HistSize);
            ArrayCopy(new_time,time,0,nCopy,HistSize);
            //--- Расчет
            MyPatternZigzag.GetNamePattern(new_high,new_low,new_time);
            //--- Запоминаем данные: Evolution, Mutation, SumModel
            double dwDE          = MathAbs(MyPatternZigzag.GetE()-MyPatternZigzag.GetD());
            dwDE                 = dwDE/_Point;
            ExtDeltaDE[nStart]   = dwDE;                               // Буфер для хранения длины волны D-E
            ExtPointE[nStart]    = MyPatternZigzag.GetE();             // Буфер для хранения точки E
            ExtEvolution[nStart] = MyPatternZigzag.GetPointEvolution();// Буфер для хранения эволюций
            ExtMutation[nStart]  = MyPatternZigzag.GetPointMutation(); // Буфер для хранения мутаций
            ExtSumModel[nStart]  = MyPatternZigzag.GetSumModel();      // Буфер для хранения счетчика-модели
           }
         //--- Вывод графики
         DrawPattern();
        }
     }else
        {
         return(0);
        }
   //--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Функция для отображения расчетов на графике                      |
//+------------------------------------------------------------------+
void DrawPattern(void)
  {
   //--- 1. выводим на экран коммент
   MyPatternZigzag.PrintComment();
   //--- 2. выводим на экран графику
   MyListPattern.Insert(MyPatternZigzag.GetA(), MyPatternZigzag.GetTimeA(), 
                        MyPatternZigzag.GetB(), MyPatternZigzag.GetTimeB(),
                        MyPatternZigzag.GetC(), MyPatternZigzag.GetTimeC(),
                        MyPatternZigzag.GetD(), MyPatternZigzag.GetTimeD(),
                        MyPatternZigzag.GetE(), MyPatternZigzag.GetTimeE(),
                        MyPatternZigzag.GetPointEvolution(),MyPatternZigzag.GetTimeEvolution(),
                        MyPatternZigzag.GetPointMutation(), MyPatternZigzag.GetTimeMutation());   
  }
//+------------------------------------------------------------------+
//| Функция определяет, включен ли режим отображения ценового графика|
//| с отступом от правого края.                                      |
//+------------------------------------------------------------------+
bool ChartShiftGet(long chart_ID=0)
  {
   //--- подготовим переменную для получения значения свойства
   long value;
   //--- сбросим значение ошибки
   ResetLastError();
   //--- получим значение свойства
   if(!ChartGetInteger(chart_ID,CHART_SHIFT,0,value))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   //--- проверим value... :-)
   if(value <= 0) return(false);
   //--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения ценового графика с  |
//| отступом от правого края.                                        |
//+------------------------------------------------------------------+
bool ChartShiftSet(bool value, long chart_ID=0)
  {
   //--- сбросим значение ошибки
   ResetLastError();
   //--- установим значение свойства
   if(!ChartSetInteger(chart_ID,CHART_SHIFT,0,value))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   //--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
FivePattern
FivePattern
  • www.mql5.com
Технический индикатор выводит на ценовом графике технические фигуры Меррилла (М & W Wave Patterns), линии поддержки/сопротивления, построенные по экстремумам стандартного индикатора ZigZag. А. Меррилл классифицировал пятиконечные фигуры по порядку следования точек сверху вниз, создав упорядоченную классификационную модель М & W волн, вот они...
 

В самом коде для переносимомти с mq5 на mq4 поменял только

 2 строки c

if(MQL5InfoInteger(MQL5_TESTER)) на if(MQLInfoInteger(MQL_TESTER))

добавил #property indicator_chart_window

изменил пару имен у обьявляемых переменных (т.к они дублировались и компилятор ругался)

и все. Код компилируется нормально, но отображение реверсное

 
В МТ5, в отличие от МТ4, нумерация баров по умолчанию слева направо по графику (в МТ4 - справа налево). Чтобы сделать нумерацию, как в МТ4, нужно установить индексацию индикаторных буферов, как в таймсериях. Функция ArraySetAsSeries.
 
Ihor Herasko:
В МТ5, в отличие от МТ4, нумерация баров по умолчанию слева направо по графику (в МТ4 - справа налево). Чтобы сделать нумерацию, как в МТ4, нужно установить индексацию индикаторных буферов, как в таймсериях. Функция ArraySetAsSeries.

Здесь обратная задача: на 5 работает, а на 4 - нет. Дальше не обсуждаю, дабы опять не получить бан за флуд (

Иначе говоря, нужна функция  ArraySetAsNotSeries ) 

Да хрен с ним, с баном. Метаквоты, ставя благие цели, наступили сами на горло своей песне. С одной стороны - незыблемый принцип проектирования: "совместимость снизу вверх", с другой - равноправное присутствие нижней и верхней версий. имхенько

 
Алексей Тарабанов:

Здесь обратная задача: на 5 работает, а на 4 - нет. Дальше не обсуждаю, дабы опять не получить бан за флуд (

Выведите print массив и посмотрите каков порядок получаемых баров. Если обратный, то переверните.

 
Konstantin Nikitin:

Выведите print массив и посмотрите каков порядок получаемых баров. Если обратный, то переверните.

Не я бенефициар

 
Konstantin Nikitin:

Выведите print массив и посмотрите каков порядок получаемых баров. Если обратный, то переверните.

Кстати, как его перевернуть, если не обратный? Желательно, на уровне определений. 

Понял. Никак. Опять Ассемблер, опять необходимость понимания среды, опять нужны разработчики. 

 
Алексей Тарабанов:

Кстати, как его перевернуть, если не обратный? Желательно, на уровне определений. 

Понял. Никак. Опять Ассемблер, опять необходимость понимания среды, опять нужны разработчики. 

В коде у вас переворачивания нету. И если этот-же код в MQL5 работает так как нужно. И т.к. в MQL5 по умолчанию идут в обратном порядке массивы в OnCalculate, а в MQL4 в нормалном. То стоит попробовать в MQL4 их перевернуть

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[])
  {
#ifdef __MQL4__
      ArraySetAsSeries(high, true);
      ArraySetAsSeries(low,  true);
      ArraySetAsSeries(time, true);
#endif
      /* work */
  }

Или если считает все нормально, но просто на буферах идет реверс. Можно перевернуть массивы в эксперте, или буферы в индикаторе.

P.S. В код не вникал. Скажу честно.

 
Konstantin Nikitin:

В коде у вас переворачивания нету. И если этот-же код в MQL5 работает так как нужно. И т.к. в MQL5 по умолчанию идут в обратном порядке массивы в OnCalculate, а в MQL4 в нормалном. То стоит попробовать в MQL4 их перевернуть

Или если считает все нормально, но просто на буферах идет реверс. Можно перевернуть массивы в эксперте, или буферы в индикаторе.

P.S. В код не вникал. Скажу честно.

Константин, я тоже в код не вникал. 

 
Я спать.