Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1161

 
KolyanSNA:
¿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?

#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:

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.

 
Pregunta, ¿hay una descripción de las bibliotecas estándar para MT4 o no?
 
Valeriy Yastremskiy:

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

 
Valeriy Yastremskiy:
Pregunta, ¿hay una descripción de las bibliotecas estándar para MT4 o no?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4.

Felicitaciones por los artículos. Gran trabajo.

 
Roman Sharanov:

Ayuda - el zigzag se construye sobre 2 buffers, ejemplo con 2 buffers también

Inicio del código 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[];

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 ruso
Archivos adjuntos:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4.

Felicitaciones por los artículos. Gran trabajo.

No importa, casi todo encaja.

Gracias.

Razón de la queja: