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

 
KolyanSNA:
Здравствуйте! Как поменять размер шрифтов в терминале? Может кто-нибудь подсказать?

Возможно, если у вас есть такая необходимость, вам поможет изменение масштаба в настройках дисплея ОС. 

 

Можно ли как-нибудь определить из OnChartEvent была ли нажата какая-нибудь кнопка на клавиатуре в момент клика мыши по графику?

 

Прошу помощи в понимании индикаторов.

Вот тут, на открытии каждого нового бара должен происходить перерасчет.

Логика - ZigZag должен соединять последовательно низины(лоу среднего из последних 3 баров ниже двух соседних) и вершины(хай среднего из последних 3 баров выше двух соседних).

Если после вершины следует новая вершина - индикатор перерисовывается на новую, старая удаляется, я думаю понятно. 

По факту индикатор соединяет вообще все хай и лоу последовательно, в чем проблема?

#property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ZigZag 
#property indicator_label1  "ZigZag" 
#property indicator_type1   DRAW_ZIGZAG 
#property indicator_color1  clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- indicator buffers 
double         ZigZagBuffer1[]; 
double         ZigZagBuffer2[]; 
double a = 0;
int last = 0; //В последний раз была вершина или низина 
int lastN = 0; //Номер бара с экстремумом
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- связывание массивов и индикаторных буферов 
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA); 
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA); 
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   ArrayInitialize(ZigZagBuffer1, EMPTY_VALUE);
   ArrayInitialize(ZigZagBuffer2, EMPTY_VALUE);
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2"); 
//--- 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| 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(a != iOpen(_Symbol, PERIOD_CURRENT, 0))
   {
      a = iOpen(_Symbol, PERIOD_CURRENT, 0);
      for(int i = Bars(_Symbol, PERIOD_CURRENT) - 3; i > 0; i--)
      {
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1] && low[i] >= low[i+1] && low[i+2] >= low[i+1]) //В обе стороны на одном баре
         {
            if(last == 0) continue; //Если с этого начинается расчет - пропускаем просто
            if(last == 1) //Если была вершина
            {
               if(high[lastN] > high[i+1])//Если новая верщина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = -1;
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               if(low[lastN] < low[i+1])//Если новая низина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = 1;
               lastN = i+1;
               continue;
            }
         }
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1]) //Новая вершина
         {
            if(last == 0)
            {
               last = 1;
               lastN = i+1;
               ZigZagBuffer1[i+1] = high[i+1];
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               last = 1;
               continue;
            }
         }
         if(low[i] >= low[i+1] && low[i+2] >= low[i+1])//Новая низина
         {
            if(last == 0)
            {
               last = -1;
               lastN = i+1;
               ZigZagBuffer2[i+1] = low[i+1];
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               last = -1;
               continue;
            }
         }
      }
   }
   
   return(rates_total); 
} 
Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Roman Sharanov:

Прошу помощи в понимании индикаторов.

Вот тут, на открытии каждого нового бара должен происходить перерасчет.

Логика - ZigZag должен соединять последовательно низины(лоу среднего из последних 3 баров ниже двух соседних) и вершины(хай среднего из последних 3 баров выше двух соседних).

Если после вершины следует новая вершина - индикатор перерисовывается на новую, старая удаляется, я думаю понятно. 

По факту индикатор соединяет вообще все хай и лоу последовательно, в чем проблема?

Как понял у Вас 2 буфера отрисовки. Оба и рисуются. Каждый буфер свою линию, у вас получается через один экстремум. В зигзаге 3 буфера. Два расчетных отдельно для максимумов и минимумов и один для отрисовки по признаку после записанного в буфер максимумов последнего максимума ищем минимум и наоборот.

 
Вопрос, есть описание стандартных библиотек для МТ4 или нет? не нашел поиском.
 
Valeriy Yastremskiy:

Как понял у Вас 2 буфера отрисовки. Оба и рисуются. Каждый буфер свою линию, у вас получается через один экстремум. В зигзаге 3 буфера. Два расчетных отдельно для максимумов и минимумов и один для отрисовки по признаку после записанного в буфер максимумов последнего максимума ищем минимум и наоборот.

в справке - zigzag строится по 2 буферам, пример тоже с 2 буферами

 
Valeriy Yastremskiy:
Вопрос, есть описание стандартных библиотек для МТ4 или нет? не нашел поиском.
 
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:
 

МТ4. 

За статьи респект. Большой труд.

 
Roman Sharanov:

в справке - zigzag строится по 2 буферам, пример тоже с 2 буферами

Начало кода ZZ.

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Red
//---- indicator parameters
input int InpDepth=12;     // Depth
input int InpDeviation=5;  // Deviation
input int InpBackstep=3;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];

Один буфер отрисовки. Три массива.

Посмотрите код. Логика сложная. Сходу сложно обычно.

Код ЗигЗага с переведенными комментами на русский
Файлы:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

МТ4. 

За статьи респект. Большой труд.

Не важно - подходит почти всё.

Спасибо.

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