Dibujar un cuadrado o un rectángulo. Realmente necesito ayuda... - página 6

 
evillive:

Entonces, ¿dónde funciona? Dibuja líneas en cada barra, no en la TF. ¿O en la imagen anterior es TF=H1?

Cuenta en un papel qué límite e i estarán en cada iteración de ciclos.

Mi ejemplo mostrado arriba nunca se contabiliza, según tengo entendido.

Las flechas de los ticks se pueden dibujar utilizando los topes de los indicadores, así como las líneas que conectan las sombras de las velas.

PERIOD_H;. Por debajo del periodo H4 todo se dibuja bien.

i = 0;

El límite es una variable externa por defecto = 5;

extern int barsToProcess = 5; //--- Número de periodos (líneas) a mostrar .

"Se pueden dibujar flechas de garrapatas utilizando los topes de los indicadores, así como líneas que conectan las sombras de las velas. "

Yo lo entiendo así.

En el buffer con el índice [Límite] se asignan los valores de alta del Array.

double Buf_High[Limit] =mqlRates[0].high;

Entiendo cómo hacer un círculo en cada barra. Pero no entiendo cómo hacerlo en cada barra H4.

 
Alex_Profit:

PERIOD_H;. Por debajo del periodo H4, todo se dibuja bien.

i = 0;

El límite es una variable externa por defecto = 5;

extern int barsToProcess = 5; //--- Número de periodos mostrados (líneas) .

"Se pueden dibujar flechas de garrapatas utilizando los topes de los indicadores, así como líneas que conectan las sombras de las velas. "

Yo lo entiendo así.

En el buffer con el índice [Límite] se asignan los valores de alta del Array.

double Buf_High[Limit] =mqlRates[0].high;

Entiendo cómo hacer un círculo en cada barra. Pero no entiendo cómo hacerlo en cada barra H4.

Averigua cómo funcionan los bucles antes de utilizarlos.i = 0 sólo la primera vez, luegoi++, hasta el límite.

Al ejecutar por primera vez el indicador limit=Bars-counted_bars=Bars-0=Bars.

El bucle for en este caso debería contar teóricamente desde 0 hasta el número de barras del gráfico. ¡¡¡PERO!!! El segundo bucle while interfiere aquí y recalcula tanto i como el límite.

No puedo entender por qué debería haberlo hecho, y quién me enseñó a hacerlo...

Aquí hay un ejemplo, establecemos: barras - 100, barrasParaProcesar = 5.

Durante la primera ejecución del indicador, counted_bars=0, no se han contado todavía, por lo tanto limit=100. Significa que el bucle del principio debe ejecutarse 100 veces, de 0 a 99.

Iteraciones del bucle for:

1. i=0, limit=barsToProcess=5, while(i<5) - el bucle interno con líneas y ticks dibujados se ejecuta 5 veces, de 0 a 4, cada vez que i++, al terminar while - i=5, limit=5.

2. i=5=limit - el bucle for está completo.

¡ESTO ES! El indicador no hace nada más hasta el siguiente tick. Llega un tick, counted_bars=99, limit=Bars-counted_bars= 100-99=1.

El bucle for se ejecuta una vez, el bucle while no se ejecuta en absoluto (ya que la condición if(limit>barsToProcess) no se cumple). Continuaremos hasta que el indicador se descargue del gráfico o se cambie el marco temporal, en general, hasta la reinicialización del indicador.

De hecho, el indicador dibuja sus líneas de tick una vez cuando se carga en el gráfico, y permanece inactivo hasta su reinicialización. La pregunta es: ¿por qué necesitamos ese indicador? El script puede manejar una sola respuesta.

 

He reescrito el código. Todo parece correcto con el bucle.

Queda la cuestión del trazado de la línea de "amortiguación".

#property strict 

#property indicator_chart_window


extern int     Total_bars = 5;        //--- Кол-во отображаемых Элементов в истории


    //---  Глобальные переменные    

string Name_VLine;     //--- Имя Элементов

string Name_CHECK;     //--- Имя Элементов


MqlRates    mqlRates[1]; //Структура для хранения информации 


#property indicator_buffers 1

#property indicator_type1   DRAW_LINE   // тип графического построения - линия 

#property indicator_color1  clrRed      // цвет линии 

#property indicator_style1  STYLE_SOLID // стиль линии 

#property indicator_width1  1           // толщина линии 


double Buff_High[];

 

//+------------------------------------------------------------------+

int OnInit()

  {

     return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

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[])

{

  

     SetIndexBuffer(0,Buff_High);     

     SetIndexStyle(0,DRAW_LINE);     

     SetIndexStyle(0,DRAW_SECTION);

     

//+------------------------------------------------------------------+

int limit;                                //--- переменная  старт кол-во баров. Линии рисуем о по всем барам

int counted_bars = IndicatorCounted();     //--- перем counted_bars = функц.  Возвращает количество баров

   

if(counted_bars > 0) counted_bars --;      //--- последний посчитанный бар будет пересчитан 

  //--- основной цикл 

  limit = Bars - counted_bars;         

  for(int i = 0; i <= limit; i ++)

   {

     if(limit > Total_bars)              //--- Если кол-во баров на графике > Кол-ву выбранных элементов 

      {

       limit = Total_bars-1;              //--- тогда кол-во баров на графике = Кол-ву выбранных элементов

      }

      

   datetime t_Line = iTime(Symbol(),PERIOD_H4,i);         //--- В ПЕРЕМ t_Line Будет Присваиваться значение времени открытия бара

   CopyRates(_Symbol, PERIOD_H4, t_Line, 1, mqlRates);    //--- Структура для хранения информации 

         

   //+------------------------ Рисуем вертикальную линии -----------------------------------------------------+                 

   ObjectCreate (Name_VLine + " VLine" + DoubleToStr(i,0),OBJ_VLINE,0,t_Line,0);         //--- Создаём обьект вертикальную линию

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_STYLE,2);              //--- Со стилем

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_COLOR,DimGray);        //--- Со цветом  

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_WIDTH,0);              //--- С  толщиной

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_BACK,0);               //--- С типом отображения. Объект на заднем плане


   //--- кубики по хай (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].high, t_Line,mqlRates[0].high);

   ObjectSetInteger(0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 

   

   //--- кубики по лоу (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].low, t_Line,mqlRates[0].low);

   ObjectSetInteger(0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 


  // На ТФ Н4 линии рисуются по хайям,

  // При смене ТФ линия рисуется на растоянии параметра Total_bars. 

  

   //--- Заполнение буфера

   Buff_High[i] = mqlRates[0].high ;  

  

   }

    return(rates_total);

}

//+------------------------------------------------------------------+


 
evillive:

Por qué lo hice, quién me enseñó, no lo entiendo...

Encontré un indicador adecuado y lo "desmonté", hasta que quedó el fragmento que necesitaba. Luego reuní los fragmentos de código y obtuve lo que necesitaba. Es así.

"Estoy aprendiendo".

 
Alex_Profit:

He reescrito el código. Todo parece correcto con el bucle.

Queda la cuestión del trazado de la línea de "amortiguación".

Para pegar el código hay un botón SRC en el panel superior de la ventana de edición de mensajes, que inserta el código de forma agradable y sin líneas vacías.

La línea probablemente tendrá que ser dibujada por objetos también (tendencia), almacenar el tiempo/precio anterior en variables separadas y usar como coordenadas del segundo punto.

Para sustituir una marca por otro símbolo -OBJ_ARROW y ARROW_CODE.

 
evillive:

Para la inserción de código hay un botón SRC en el panel superior de la ventana de edición de mensajes, inserta el código de forma agradable y sin líneas vacías.

La línea probablemente tendrá que ser dibujada por objetos también (tendencia), almacenar el tiempo/precio anterior en variables separadas y usar como coordenadas del segundo punto.

Para sustituir una marca por otro símbolo -OBJ_ARROW y ARROW_CODE.

Qué es lo que no le gusta

SECCIÓN_DRAGADA

1

Segmentos de línea entre valores de línea no vacíos

 
AlexeyVik:

А чем не нравится

DRAW_SECTION

1

Отрезки между непустыми значениями линии

No sé cómo aplicarlo.

 
AlexeyVik:

¿Qué es lo que no le gusta?

SECCIÓN_DRAGADA

1

Segmentos de línea entre valores no vacíos de la línea

Evillive:

La línea probablemente tendría que ser dibujada por objetos también (tendencia), almacenar el tiempo/precio anterior en variables separadas y usar como coordenadas del segundo punto.

La idea es buena. Lo probaré si funciona.

De hecho, no es necesario dibujarlo. Siempre que funcione correctamente.

 

Alex_Profit:

No sé cómo aplicarlo.

Simplemente en OnInit() en lugar de

SetIndexStyle(0, DRAW_LINE);

escribir

SetIndexStyle(0, DRAW_SECTION);

 

De alguna manera no hay cambios

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[])
{
  
     SetIndexBuffer(0,Buff_High);     
     //SetIndexStyle(0,DRAW_LINE);     
     SetIndexStyle(0,DRAW_SECTION);