Вот тут, на открытии каждого нового бара должен происходить перерасчет.
Логика - ZigZag должен соединять последовательно низины(лоу среднего из последних 3 баров ниже двух соседних) и вершины(хай среднего из последних 3 баров выше двух соседних).
Если после вершины следует новая вершина - индикатор перерисовывается на новую, старая удаляется, я думаю понятно.
По факту индикатор соединяет вообще все хай и лоу последовательно, в чем проблема?
#property indicator_chart_window#property indicator_buffers2#property indicator_plots1//--- plot ZigZag #property indicator_label1"ZigZag"#property indicator_type1DRAW_ZIGZAG#property indicator_color1clrBlue#property indicator_style1STYLE_SOLID#property indicator_width11//--- indicator buffers double ZigZagBuffer1[];
double ZigZagBuffer2[];
double a = 0;
int last = 0; //В последний раз была вершина или низина int lastN = 0; //Номер бара с экстремумом//+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ intOnInit()
{
//--- связывание массивов и индикаторных буферов 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 | //+------------------------------------------------------------------+ intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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);
}
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
Вот тут, на открытии каждого нового бара должен происходить перерасчет.
Логика - ZigZag должен соединять последовательно низины(лоу среднего из последних 3 баров ниже двух соседних) и вершины(хай среднего из последних 3 баров выше двух соседних).
Если после вершины следует новая вершина - индикатор перерисовывается на новую, старая удаляется, я думаю понятно.
По факту индикатор соединяет вообще все хай и лоу последовательно, в чем проблема?
Как понял у Вас 2 буфера отрисовки. Оба и рисуются. Каждый буфер свою линию, у вас получается через один экстремум. В зигзаге 3 буфера. Два расчетных отдельно для максимумов и минимумов и один для отрисовки по признаку после записанного в буфер максимумов последнего максимума ищем минимум и наоборот.
Как понял у Вас 2 буфера отрисовки. Оба и рисуются. Каждый буфер свою линию, у вас получается через один экстремум. В зигзаге 3 буфера. Два расчетных отдельно для максимумов и минимумов и один для отрисовки по признаку после записанного в буфер максимумов последнего максимума ищем минимум и наоборот.
в справке - zigzag строится по 2 буферам, пример тоже с 2 буферами
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
Здравствуйте! Как поменять размер шрифтов в терминале? Может кто-нибудь подсказать?
Возможно, если у вас есть такая необходимость, вам поможет изменение масштаба в настройках дисплея ОС.
Можно ли как-нибудь определить из OnChartEvent была ли нажата какая-нибудь кнопка на клавиатуре в момент клика мыши по графику?
Прошу помощи в понимании индикаторов.
Вот тут, на открытии каждого нового бара должен происходить перерасчет.
Логика - ZigZag должен соединять последовательно низины(лоу среднего из последних 3 баров ниже двух соседних) и вершины(хай среднего из последних 3 баров выше двух соседних).
Если после вершины следует новая вершина - индикатор перерисовывается на новую, старая удаляется, я думаю понятно.
По факту индикатор соединяет вообще все хай и лоу последовательно, в чем проблема?
Прошу помощи в понимании индикаторов.
Вот тут, на открытии каждого нового бара должен происходить перерасчет.
Логика - ZigZag должен соединять последовательно низины(лоу среднего из последних 3 баров ниже двух соседних) и вершины(хай среднего из последних 3 баров выше двух соседних).
Если после вершины следует новая вершина - индикатор перерисовывается на новую, старая удаляется, я думаю понятно.
По факту индикатор соединяет вообще все хай и лоу последовательно, в чем проблема?
Как понял у Вас 2 буфера отрисовки. Оба и рисуются. Каждый буфер свою линию, у вас получается через один экстремум. В зигзаге 3 буфера. Два расчетных отдельно для максимумов и минимумов и один для отрисовки по признаку после записанного в буфер максимумов последнего максимума ищем минимум и наоборот.
Как понял у Вас 2 буфера отрисовки. Оба и рисуются. Каждый буфер свою линию, у вас получается через один экстремум. В зигзаге 3 буфера. Два расчетных отдельно для максимумов и минимумов и один для отрисовки по признаку после записанного в буфер максимумов последнего максимума ищем минимум и наоборот.
в справке - zigzag строится по 2 буферам, пример тоже с 2 буферами
Вопрос, есть описание стандартных библиотек для МТ4 или нет? не нашел поиском.
МТ4.
За статьи респект. Большой труд.
в справке - zigzag строится по 2 буферам, пример тоже с 2 буферами
Начало кода ZZ.
Один буфер отрисовки. Три массива.
Посмотрите код. Логика сложная. Сходу сложно обычно.
Код ЗигЗага с переведенными комментами на русскийМТ4.
За статьи респект. Большой труд.
Не важно - подходит почти всё.
Спасибо.