Línea vertical.

 
Hola! He empezado a hacer un indicador que dibujará una línea entre dos pips en tiempo y precio, la forma en que se dibuja la línea es aproximadamente así:
for(int w=limit;w<rates_total;w++)
 SupportBuffer[w]=low[s1]+speeds*(w-s1);
Todo está bien, pero a veces los puntos de tiempo pueden estar en una vela, se obtiene una línea vertical. ¿Entiendo que el SupportBuffer[w] no se puede poner en vertical?
 
Nauris Zukas:
Hola! He empezado a hacer un indicador que dibujará una línea entre dos pips en tiempo y precio, la forma en que se dibuja la línea es aproximadamente así:
Todo está bien, pero a veces los puntos de tiempo pueden estar en una vela, se obtiene una línea vertical. ¿Supongo que SupportBuffer[w] no se puede poner en vertical?

Si usamos un zigzag en lugar de una línea, funciona.

 
Alexey Viktorov:

Si usas un zigzag en lugar de una línea, funciona.

Gracias, intentaré desmontar el ZigZag y entender el principio de trazar una línea.

 
Alexey Viktorov:

Si utiliza un zigzag en lugar de una línea, funcionará.

El ZigZag en sí resultó ser bastante complaciente, por lo que no fue fácil desmontarlo. Pero he preparado un ejemplo sencillo... ¿Puede añadir una función, donde en 3 barras desde la última barra habrá una línea entre el Alto y el Bajo según su consejo zigzag? Me gustaría entender el principio, y entonces podré desarrollarlo yo mismo.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Support
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3

//--- indicator buffers
double         LineTest[];
double         HighMapBuffer[];     // highs
double         LowMapBuffer[];      // lows
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LineTest,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---
   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[])
  {
//---
   int limit=prev_calculated;

   for(int i2=limit;i2<rates_total;i2++) // New bar recalculate
     {
      if(limit<rates_total-1)continue; // New bar recalculate
      for(int i=0;i<rates_total;i++)
        {
         //if(i<rates_total-3 && i>rates_total-15) // H Line 3-15 bar
         //   LineTest[i]=high[rates_total-2]; // Price
         //else LineTest[i]=EMPTY_VALUE; 
         
         HighMapBuffer[i]=high[rates_total-3];
         LowMapBuffer[i]=low[rates_total-3];
         LineTest[i]=                    // ???
         

        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

El ZigZag en sí resultó ser bastante complaciente, por lo que no fue fácil desmontarlo. Pero he preparado un ejemplo sencillo... ¿Puede añadir una función, donde en 3 barras desde la última barra habrá una línea entre el Alto y el Bajo según su consejo zigzag? Me gustaría entender el principio y entonces podré desarrollarlo yo mismo.

https://www.mql5.com/ru/docs/customind/indicators_examples/draw_zigzag

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_ZIGZAG
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_ZIGZAG
  • www.mql5.com
//|                                                  DRAW_ZIGZAG.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Custom indicator initialization function                         |...
 
Taras Slobodyanik:

https://www.mql5.com/ru/docs/customind/indicators_examples/draw_zigzag


Gracias, ya hay alguna descripción y es un estilo, no un indicador :), intentaré averiguarlo.

 
¿Alguna idea de por qué en OnCalculate después de iniciar el terminal rates_total: en el primer tick 372158 y luego rates_total normal: 10001 ?
 

La línea vertical funcionó, pero no entiendo cómo eliminar la línea de conexión entre las líneas verticales. ¿Puede alguien corregir mi ejemplo para que desaparezca la línea de conexión?

#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  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  10

//--- indicator buffers
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);

   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[])
  {
   int limit=prev_calculated;
   if(prev_calculated==0)limit=rates_total-1;

   for(int i2=limit;i2<rates_total;i2++) // recalculate on new bar
     {

      for(int i=0;i<rates_total;i++)
        {
         if(i==rates_total-3 || i==rates_total-15) // should be VLine on 3th and 15th bar!
           {
            ZigZagBuffer1[i]=high[i];
           }
         else
           {
            ZigZagBuffer1[i]=EMPTY_VALUE;
           }
                      
         if(i==rates_total-3 || i==rates_total-15) // should be VLine on 3th and 15th bar !
           {
            ZigZagBuffer2[i]=low[i];
           }
         else
           {
            ZigZagBuffer2[i]=EMPTY_VALUE;
           }           
           
         if(ZigZagBuffer1[i]!=EMPTY_VALUE )Print(" ZigZagBuffer1[",i,"]: ",ZigZagBuffer1[i]);
         if(ZigZagBuffer2[i]!=EMPTY_VALUE )Print(" ZigZagBuffer2[",i,"]: ",ZigZagBuffer2[i]);

        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

La línea vertical ha funcionado, pero no sé cómo eliminar la línea de conexión entre las líneas verticales. ¿Puede alguien corregir mi ejemplo para que desaparezca la línea de conexión?

Bueno, entonces me equivoqué. No entendí el propósito...

En este caso es necesario, y más fácil, utilizar el dibujo gráfico DRAW_HISTOGRAM2

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_HISTOGRAM2
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_HISTOGRAM2
  • www.mql5.com
//|                                              DRAW_HISTOGRAM2.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Custom indicator initialization function                         |...
 
Alexey Viktorov:

Bueno, entonces me equivoqué. No entendí el propósito...

En este caso es necesario, y más fácil, utilizar el trazado gráfico DRAW_HISTOGRAM2

Gracias, lo intentaré.

Otra pregunta, ¿DRAW_HISTOGRAM2 sólo dibuja en vertical o también puede dibujar en oblicuo (entre dos barras)?
 
Nauris Zukas:

Gracias, lo intentaré.

Otra pregunta, ¿DRAW_HISTOGRAM2 dibuja sólo verticalmente o puede también inclinarse (entre dos barras)?

Tendrás que decidir qué quieres...

Si necesita mezclar, sólo a veces eliminar las conexiones entre las dos secciones verticales del zigzag, entonces es mejor tomar un zigzag de color y colocar la condición de asignar ningún color.

No estaría de más leer toda la sección de documentación sobre el trazado de gráficos. Te daría una idea de lo que se puede hacer...