Disegnare un quadrato o un rettangolo. Davvero bisogno di aiuto... - pagina 6

 
evillive:

Quindi dove funziona? Disegna linee su ogni barra, non sul TF. O nell'immagine sopra è TF=H1?

Calcola su un pezzo di carta quale sarà il limite e i ad ogni iterazione dei cicli.

Il mio esempio mostrato sopra non viene mai contabilizzato, per quanto ne so.

Le frecce di tick possono essere disegnate usando i buffer degli indicatori, così come le linee che collegano le ombre delle candele.

PERIOD_H;. Sotto il periodo H4 tutto è disegnato bene.

i = 0;

Il limite è una variabile esterna di default = 5;

extern int barsToProcess = 5; //--- Numero di periodi (linee) da visualizzare .

"Le frecce di tick possono essere disegnate usando i buffer degli indicatori, così come le linee che collegano le ombre delle candele. "

Io lo capisco così.

Nel buffer con l'indice [Limit] vengono assegnati i valori di alto dall'Array.

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

Ho capito come fare un cerchio su ogni barra. Ma non capisco come farlo su ogni barra H4.

 
Alex_Profit:

PERIOD_H;. Sotto il periodo H4, tutto si disegna bene.

i = 0;

Limite è una variabile esterna di default = 5;

extern int barsToProcess = 5; //--- Numero di periodi visualizzati (linee) .

"Le frecce di tick possono essere disegnate usando i buffer degli indicatori, così come le linee che collegano le ombre delle candele. "

Io lo capisco così.

Nel buffer con l'indice [Limit] vengono assegnati i valori di alto dall'Array.

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

Ho capito come girare su ogni barra. Ma non capisco come farlo su ogni barra H4.

Capire come funzionano i cicli prima di usarli.i = 0 solo la prima volta, poii++, fino al limite.

Alla prima esecuzione dell'indicatore limit=Bars-counted_bars=Bars-0=Bars.

Il ciclo for in questo caso dovrebbe teoricamente contare da 0 al numero di barre sul grafico. MA!!! Il secondo ciclo while interferisce qui e ricalcola sia i che il limite.

Non riesco a capire perché avrei dovuto farlo, e chi mi ha insegnato a farlo...

Ecco un esempio, abbiamo impostato: bars - 100, barsToProcess = 5.

Durante la prima esecuzione dell'indicatore, counted_bars=0, non sono state ancora contate, quindi limit=100. Significa che il ciclo per l' inizio dovrebbe essere eseguito 100 volte, da 0 a 99.

Iterazioni del ciclo for:

1. i=0, limit=barsToProcess=5, while(i<5) - il ciclo interno con linee e ticks disegnati viene eseguito 5 volte, da 0 a 4, ogni volta che i++, al termine while - i=5, limit=5.

2. i=5=limite - il ciclo for è completo.

QUESTO È QUANTO! L'indicatore non fa più nulla fino al prossimo tick. Arriva un tick, counted_bars=99, limit=Bars-counted_bars= 100-99=1.

Il ciclo for viene eseguito una volta, il ciclo while non viene eseguito affatto (poiché la condizione if(limit>barsToProcess) non è soddisfatta). Continueremo fino a quando l'indicatore viene scaricato dal grafico o il timeframe viene cambiato, in generale, fino alla reinizializzazione dell'indicatore.

Infatti, l'indicatore disegna le sue linee di tick una volta quando viene caricato sul grafico, e rimane inattivo fino alla reinizializzazione. La domanda è: perché abbiamo bisogno di un tale indicatore? Lo script può gestire una sola risposta.

 

Ho riscritto il codice. Tutto sembra essere corretto con il ciclo.

C'è ancora la questione di tracciare la linea "cuscinetto".

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

Perché l'ho fatto, chi me l'ha insegnato, non capisco...

Ho trovato un indicatore adatto e l'ho "smontato", finché non è rimasto il frammento che mi serviva. Poi ho assemblato i frammenti di codice e ho ottenuto quello che mi serviva. Funziona così.

"Sto imparando".

 
Alex_Profit:

Ho riscritto il codice. Tutto sembra essere corretto con il ciclo.

C'è ancora la questione di tracciare la linea "cuscinetto".

Per incollare il codice c'è il pulsante SRC nel pannello superiore della finestra di modifica del messaggio, inserisce il codice in modo piacevole e senza linee vuote.

La linea dovrà probabilmente essere disegnata anche da oggetti (trending), memorizzare il tempo/prezzo precedente in variabili separate e usare come coordinate del secondo punto.

Per sostituire un segno di spunta con un altro simbolo -OBJ_ARROW e ARROW_CODE.

 
evillive:

Per l'inserimento del codice c'è il pulsante SRC sul pannello superiore della finestra di modifica del messaggio, inserisce il codice in modo piacevole e senza linee vuote.

La linea dovrà probabilmente essere disegnata anche da oggetti (tendenza), memorizzare il tempo/prezzo precedente in variabili separate e usare come coordinate del secondo punto.

Per sostituire un segno di spunta con un altro simbolo -OBJ_ARROW e ARROW_CODE.

Cosa non deve piacere

DISEGNO_SEZIONE

1

Segmenti di linea tra valori di linea non vuoti

 
AlexeyVik:

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

DRAW_SECTION

1

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

Non so come applicarlo.

 
AlexeyVik:

Cosa c'è che non va in

DISEGNO_SEZIONE

1

Segmenti di linea tra valori non vuoti della linea

Evillive:

La linea dovrebbe probabilmente essere disegnata anche da oggetti (tendenza), memorizzare il tempo/prezzo precedente in variabili separate e usare come coordinate del secondo punto.

L'idea è buona. Lo proverò se funziona.

In effetti, non c'è bisogno di disegnarlo. Basta che funzioni correttamente.

 

Alex_Profit:

Non so come applicarlo.

Semplicemente in OnInit() invece di

SetIndexStyle(0, DRAW_LINE);

scrivere

SetIndexStyle(0, DRAW_SECTION);

 

In qualche modo nessun cambiamento

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);
Motivazione: