Dessiner un carré ou un rectangle. J'ai vraiment besoin d'aide... - page 6

 
evillive:

Alors, où cela fonctionne-t-il ? Il dessine des lignes sur chaque barre, pas sur la TF. Ou dans l'image ci-dessus, TF=H1 ?

Calculez sur une feuille de papier ce que seront la limite et i à chaque itération des cycles.

Mon exemple ci-dessus n'est jamais pris en compte, d'après ce que je comprends.

Les flèches tick peuvent être dessinées à l'aide de tampons d'indicateurs, de même que les lignes reliant les ombres des chandeliers.

PERIOD_H ;. En dessous de la période H4, tout est bien dessiné.

i = 0 ;

La limite est une variable externe par défaut = 5 ;

extern int barsToProcess = 5 ; //--- Nombre de périodes (lignes) à afficher .

"Les flèches de tic-tac peuvent être dessinées à l'aide de tampons d'indicateurs, de même que les lignes reliant les ombres des chandeliers. "

Je le comprends de cette façon.

Dans le tampon avec l'index [Limit], les valeurs élevées du tableau sont assignées.

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

Je comprends comment faire un cercle sur chaque barre. Mais je ne comprends pas comment le faire sur chaque barre H4.

 
Alex_Profit:

PERIOD_H ;. En dessous de la période H4, tout va bien.

i = 0 ;

La limite est une variable externe par défaut = 5 ;

extern int barsToProcess = 5 ; //--- Nombre de périodes affichées (lignes) .

"Les flèches de tic-tac peuvent être dessinées à l'aide de tampons d'indicateurs, de même que les lignes reliant les ombres des chandeliers. "

Je le comprends de cette façon.

Dans le tampon avec l'index [Limit], les valeurs élevées du tableau sont assignées.

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

Je sais comment faire un cercle sur chaque barre. Mais je ne comprends pas comment le faire sur chaque barre H4.

Comprendre le fonctionnement des boucles avant de les utiliser.i = 0 seulement la première fois, puisi++, jusqu'à la limite.

Lors de la première exécution de l'indicateur, limit=Bars-counted_bars=Bars-0=Bars.

Dans ce cas, la boucle for devrait théoriquement compter de 0 au nombre de barres du graphique. MAIS ! !! La deuxième boucle while interfère ici et recalcule à la fois i et la limite.

Je ne comprends pas pourquoi j'aurais dû le faire, et qui m'a appris à le faire...

Voici un exemple, nous avons défini : bars - 100, barsToProcess = 5.

Pendant la première exécution de l'indicateur, counted_bars=0, n'ont pas encore été comptées, donc limit=100. Cela signifie que la boucle du début doit être exécutée 100 fois, de 0 à 99.

Itérations de la boucle for:

1. i=0, limit=barsToProcess=5, while(i<5) - la boucle interne avec les lignes et les ticks dessinés est exécutée 5 fois, de 0 à 4, chaque fois que i++, à la fin de while - i=5, limit=5.

2. i=5=limite - la boucle for est terminée.

C'EST ÇA ! L'indicateur ne fait rien de plus jusqu'au prochain tick. Un tick arrive, counted_bars=99, limit=Bars-counted_bars= 100-99=1.

La boucle for est exécutée une fois, la boucle while n'est pas exécutée du tout (puisque la condition if(limit>barsToProcess) n'est pas remplie). Nous continuerons jusqu'à ce que l'indicateur soit déchargé du graphique ou que l'horizon temporel soit modifié, en général, jusqu'à la réinitialisation de l'indicateur.

En fait, l'indicateur dessine ses lignes de tick une fois lorsqu'il est chargé sur le graphique, et il reste inactif jusqu'à sa réinitialisation. La question est de savoir pourquoi nous avons besoin d'un tel indicateur. Le script peut traiter une seule réponse.

 

J'ai réécrit le code. Tout semble être correct avec la boucle.

La question du tracé de la ligne "tampon" reste posée.

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

Pourquoi j'ai fait ça, qui m'a appris, je ne comprends pas...

J'ai trouvé un indicateur approprié et je l'ai "désassemblé", jusqu'à ce qu'il reste le fragment dont j'avais besoin. J'ai ensuite assemblé les fragments de code et obtenu ce dont j'avais besoin. C'est comme ça.

"Je suis en train d'apprendre."

 
Alex_Profit:

J'ai réécrit le code. Tout semble être correct avec la boucle.

La question du tracé de la ligne "tampon" reste posée.

Pour coller le code, il y a un bouton SRC dans le panneau supérieur de la fenêtre d'édition du message, qui insère le code de façon agréable et sans lignes vides.

La ligne devra probablement être tracée par des objets également (tendance), stocker le temps/prix précédent dans des variables séparées et les utiliser comme coordonnées du second point.

Pour remplacer une coche par un autre symbole -OBJ_ARROW et ARROW_CODE.

 
evillive:

Pour l'insertion de code, il existe un bouton SRC dans le panneau supérieur de la fenêtre d'édition du message, qui insère le code de manière agréable et sans lignes vides.

La ligne devra probablement être tracée par des objets également (tendance), stocker le temps/prix précédent dans des variables séparées et les utiliser comme coordonnées du second point.

Pour remplacer une coche par un autre symbole -OBJ_ARROW et ARROW_CODE.

Ce qu'il ne faut pas aimer

DRAW_SECTION

1

Segments de ligne entre des valeurs de ligne non vides

 
AlexeyVik:

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

DRAW_SECTION

1

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

Je ne sais pas comment l'appliquer.

 
AlexeyVik:

Qu'est-ce qu'on ne peut pas aimer dans

DRAW_SECTION

1

Segments de ligne entre les valeurs non vides de la ligne

Evillive:

La ligne devrait probablement être tracée par des objets également (tendance), stocker le temps/prix précédent dans des variables séparées et les utiliser comme coordonnées du second point.

L'idée est bonne. Je vais essayer si ça marche.

En fait, il n'y a pas besoin de le dessiner. Du moment qu'il fonctionne correctement.

 

Alex_Profit:

Je ne sais pas comment l'appliquer.

Simplement dans OnInit() au lieu de

SetIndexStyle(0, DRAW_LINE) ;

écrire

SetIndexStyle(0, DRAW_SECTION) ;

 

En quelque sorte, pas de changement

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