Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1359

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

Попробуй так, но не уверен

//+------------------------------------------------------------------+
//|                                                           AZ.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Anastasiya Zolotareva"
#property link      "insta"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
//--- plot myAZ
#property indicator_label1  "myAZ"
#property indicator_color1  Black
#property indicator_color2  Blue
#property indicator_color3  Orange
#property indicator_color4  Blue
#property indicator_color5  Orange
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1

extern int barsToProcess=200; //количество последних баров в истории
//--- indicator buffers
double myAZBuffer[];
double ExtHighBuffer01[];
double ExtLowBuffer01[];
double ExtHighBuffer02[];
double ExtLowBuffer02[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexShift(1,-2);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexShift(2,-2);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexShift(3,-3);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexShift(4,-3);

//--- indicator buffers mapping
   SetIndexBuffer(0,myAZBuffer);
   SetIndexBuffer(1,ExtHighBuffer01);
   SetIndexBuffer(2,ExtLowBuffer01);
   SetIndexBuffer(3,ExtHighBuffer02);
   SetIndexBuffer(4,ExtLowBuffer02);
   IndicatorShortName("AZ");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|         deinit                                                         |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| 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-prev_calculated-barsToProcess)<=0)return(0);
   int limit, val_index;
   if(barsToProcess>0) limit=barsToProcess; 
   else
   limit=rates_total-prev_calculated-barsToProcess-1;
  
   for(int n=limit;n>=0;n--)
     {
      if(Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer01[n]=Low[val_index];
        }
      else
      if(Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer01[n]=High[val_index];
        }
      else
      if(Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer02[n]=Low[val_index];
        }
      else
      if(Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer02[n]=High[val_index];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
MakarFX:

Попробуй так, но не уверен

к сожалению, смещение по shift - не подходящий вариант. Думаю, может попробовать вставить мой код в стандартный-zigzag. Сейчас вот тыкаюсь, но безрезультатно пока. Как думаете, можно через zigzag пойти? ведь в конечном итоге мне надо, чтобы найденные вершины соединялись попеременно, типо хай-лоу-хай, а если встретится вариант хай-хай, либо лоу-лоу, то эти вторые хаи и лои не включать в массивы, а ждать противоположность.

 
azolotta:

к сожалению, смещение по shift - не подходящий вариант. Думаю, может попробовать вставить мой код в стандартный-zigzag. Сейчас вот тыкаюсь, но безрезультатно пока. Как думаете, можно через zigzag пойти? ведь в конечном итоге мне надо, чтобы найденные вершины соединялись попеременно, типо хай-лоу-хай, а если встретится вариант хай-хай, либо лоу-лоу, то эти вторые хаи и лои не включать в массивы, а ждать противоположность.

Нет. Надо предыдущий обнулять, а текущий вносить в буфер индикатора.

 
azolotta:

к сожалению, смещение по shift - не подходящий вариант. Думаю, может попробовать вставить мой код в стандартный-zigzag. Сейчас вот тыкаюсь, но безрезультатно пока. Как думаете, можно через zigzag пойти? ведь в конечном итоге мне надо, чтобы найденные вершины соединялись попеременно, типо хай-лоу-хай, а если встретится вариант хай-хай, либо лоу-лоу, то эти вторые хаи и лои не включать в массивы, а ждать противоположность.

В любом случае будет запаздывание, т.е. пока не будут выполнены условия по 2-3 предыдущим барам - рисовать не будет.

Я так понял нужен зиг-заг от хая к лоу?
 
MakarFX:

В любом случае будет запаздывание, т.е. пока не будут выполнены условия по 2-3 предыдущим барам - рисовать не будет.

Я так понял нужен зиг-заг от хая к лоу?

да, в идеале нужен зиг-заг от хая к лоу (чтобы эти хаи и лои находились по моим условиям в if, и если встречается два или более хая/лоу подряд, то эти вторые хаи/лои не отображать, а ждать разворот). Мне достаточно, чтобы в индикаторе отображались 6 последних лоу и 6 последних хай. А уже потом я хочу вызывать эти найденные точки зиг-зага в скрипте/советнике для последующих нужд.

 

Здравствуйте!

Кто-нибудь может подсказать, почему через режим отладки не показывает значения?

похоже после обновления программы МТ5, началась проблема

И что значит красный цвет значения в колонке - Значения? 

 
Mikhail Toptunov:

Здравствуйте!

Кто-нибудь может подсказать, почему через режим отладки не показывает значения?

похоже после обновления программы МТ5, началась проблема

И что значит красный цвет значения в колонке - Значения? 

1. Пожалуйста указывайте минимальную информацию (первые три строчки из вкладки Журнал после перезапуска терминала)

2. Обновите билд 

 
azolotta:

да, в идеале нужен зиг-заг от хая к лоу (чтобы эти хаи и лои находились по моим условиям в if, и если встречается два или более хая/лоу подряд, то эти вторые хаи/лои не отображать, а ждать разворот). Мне достаточно, чтобы в индикаторе отображались 6 последних лоу и 6 последних хай. А уже потом я хочу вызывать эти найденные точки зиг-зага в скрипте/советнике для последующих нужд.

Я не программист и пока не знаю как помочь, но подумаю...
 
MakarFX:
Я не программист и пока не знаю как помочь, но подумаю...
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,                                                           |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}

Функция GetExtremumZZPrice().

Эта функция выполняет поиск экстремума стандартного пользовательского индикатора ZigZag и возвращает его ценовой уровень. Функция принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
  • tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
  • ne - Номер экстремума. 0 - последний, 1 - предыдущий, 2 - предпредыдущий и т.д.
  • dp, dv, bs - Параметры ZigZaga: ExtDepth, ExtDeviation, ExtBackstep.
Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
Iurii Tokman:

Функция GetExtremumZZPrice().

Эта функция выполняет поиск экстремума стандартного пользовательского индикатора ZigZag и возвращает его ценовой уровень. Функция принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
  • tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
  • ne - Номер экстремума. 0 - последний, 1 - предыдущий, 2 - предпредыдущий и т.д.
  • dp, dv, bs - Параметры ZigZaga: ExtDepth, ExtDeviation, ExtBackstep.
это не подходит, нужны экстремумы не зиг-зага
Причина обращения: