Aquí, en la apertura de cada nueva barra debe haber un recálculo.
Lógica - El zigzag debe conectar los fondos (el mínimo de las últimas 3 barras por debajo de dos adyacentes) y los máximos (el máximo de las últimas 3 barras por encima de dos adyacentes).
Si a un pico le sigue uno nuevo, el indicador se vuelve a dibujar sobre el nuevo, el antiguo se borra, creo que está claro.
De hecho, el indicador conecta todos los máximos y mínimos de forma secuencial, ¿cuál es el problema?
#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);
}
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
Aquí, en la apertura de cada nueva barra debe haber un recálculo.
Lógica - El zigzag debe conectar los fondos (el mínimo de las últimas 3 barras por debajo de dos adyacentes) y los máximos (el máximo de las últimas 3 barras por encima de dos adyacentes).
Si a un pico le sigue uno nuevo, el indicador se vuelve a dibujar sobre el nuevo, el antiguo se borra, creo que está claro.
De hecho, el indicador conecta todos los HI y LH en serie, ¿cuál es el problema?
Por lo que tengo entendido tienes 2 buffers de dibujo. Ambos están dibujados. Cada búfer tiene su propia línea, se obtiene un extremo. Hay 3 topes en el zigzag. Dos calculados para máximos y mínimos por separado, y uno para dibujar según el signo que después de escribir los máximos en el buffer, buscamos el mínimo y viceversa.
Tengo entendido que tiene dos buffers de dibujo. Ambos están dibujados. Cada búfer tiene su propia línea, se obtiene un extremo. Hay 3 topes en el zigzag. Hay dos búferes de cálculo separados para los máximos y los mínimos, y un búfer se utiliza para dibujar después del último máximo escrito en el búfer de máximos, y viceversa.
Ayuda - el zigzag se construye usando 2 buffers, ejemplo con 2 buffers también
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
¿Cómo puedo cambiar el tamaño de la letra en el terminal? ¿Puede alguien darme una pista?
Puede ayudar a cambiar el zoom en la configuración de la pantalla del sistema operativo si tiene esa necesidad.
¿Hay alguna forma de determinar a partir del OnChartEvent si se ha pulsado un botón del teclado cuando el ratón ha hecho clic en el gráfico?
Por favor, ayúdenme a entender los indicadores.
Aquí, en la apertura de cada nueva barra debe haber un recálculo.
Lógica - El zigzag debe conectar los fondos (el mínimo de las últimas 3 barras por debajo de dos adyacentes) y los máximos (el máximo de las últimas 3 barras por encima de dos adyacentes).
Si a un pico le sigue uno nuevo, el indicador se vuelve a dibujar sobre el nuevo, el antiguo se borra, creo que está claro.
De hecho, el indicador conecta todos los máximos y mínimos de forma secuencial, ¿cuál es el problema?
Por favor, ayúdenme a entender los indicadores.
Aquí, en la apertura de cada nueva barra debe haber un recálculo.
Lógica - El zigzag debe conectar los fondos (el mínimo de las últimas 3 barras por debajo de dos adyacentes) y los máximos (el máximo de las últimas 3 barras por encima de dos adyacentes).
Si a un pico le sigue uno nuevo, el indicador se vuelve a dibujar sobre el nuevo, el antiguo se borra, creo que está claro.
De hecho, el indicador conecta todos los HI y LH en serie, ¿cuál es el problema?
Por lo que tengo entendido tienes 2 buffers de dibujo. Ambos están dibujados. Cada búfer tiene su propia línea, se obtiene un extremo. Hay 3 topes en el zigzag. Dos calculados para máximos y mínimos por separado, y uno para dibujar según el signo que después de escribir los máximos en el buffer, buscamos el mínimo y viceversa.
Tengo entendido que tiene dos buffers de dibujo. Ambos están dibujados. Cada búfer tiene su propia línea, se obtiene un extremo. Hay 3 topes en el zigzag. Hay dos búferes de cálculo separados para los máximos y los mínimos, y un búfer se utiliza para dibujar después del último máximo escrito en el búfer de máximos, y viceversa.
Ayuda - el zigzag se construye usando 2 buffers, ejemplo con 2 buffers también
Pregunta, ¿hay una descripción de las bibliotecas estándar para MT4 o no?
MT4.
Felicitaciones por los artículos. Gran trabajo.
Ayuda - el zigzag se construye sobre 2 buffers, ejemplo con 2 buffers también
Inicio del código ZZ.
Un buffer de dibujo. Tres matrices.
Mira el código. La lógica es compleja. Suele ser difícil hacerlo sobre la marcha.
Código ZigZag con comentarios traducidos al rusoMT4.
Felicitaciones por los artículos. Gran trabajo.
No importa, casi todo encaja.
Gracias.