Zeichnen eines Quadrats oder Rechtecks. Ich brauche wirklich Hilfe... - Seite 6

 
evillive:

Und wo funktioniert es? Es zeichnet Linien auf jeden Balken, nicht auf die TF. Oder ist in der obigen Abbildung TF=H1?

Zählen Sie auf einem Blatt Papier, wie hoch der Grenzwert und i bei jeder Iteration der Zyklen sein werden.

Mein oben angeführtes Beispiel ist meines Erachtens nie berücksichtigt worden.

Die Tick-Pfeile können mit Indikatorpuffern gezeichnet werden, ebenso wie Linien, die Kerzenschatten verbinden.

PERIOD_H;. Unterhalb des H4-Zeitraums ist alles gut gezeichnet.

i = 0;

Der Grenzwert ist eine externe Variable und beträgt standardmäßig 5;

extern int barsToProcess = 5; //--- Anzahl der anzuzeigenden Perioden (Zeilen) .

"Tick-Pfeile können mit Indikatorpuffern gezeichnet werden, ebenso wie Linien, die Kerzenschatten verbinden. "

Ich verstehe das so.

Im Puffer mit dem Index [Limit] werden die Werte von high aus dem Array zugewiesen.

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

Ich weiß, wie man bei jedem Takt kreisen muss. Aber ich verstehe nicht, wie man das bei jedem H4-Takt macht.

 
Alex_Profit:

PERIOD_H;. Unterhalb des H4-Zeitraums ist alles in Ordnung.

i = 0;

Der Grenzwert ist eine externe Variable und beträgt standardmäßig 5;

extern int barsToProcess = 5; //--- Anzahl der angezeigten Perioden (Zeilen) .

"Tick-Pfeile können mit Indikatorpuffern gezeichnet werden, ebenso wie Linien, die Kerzenschatten verbinden. "

Ich verstehe das so.

Im Puffer mit dem Index [Limit] werden die Werte von high aus dem Array zugewiesen.

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

Ich weiß, wie man bei jedem Takt kreisen muss. Aber ich verstehe nicht, wie man das bei jedem H4-Takt macht.

Finden Sie heraus, wie Schleifen funktionieren, bevor Sie sie verwenden.i = 0 nur beim ersten Mal, danni++, bis zum Limit.

Beim ersten Start des Indikators limit=Bars-counted_bars=Bars-0=Bars.

Die for-Schleife sollte in diesem Fall theoretisch von 0 bis zur Anzahl der Balken im Diagramm zählen. ABER!!! Die zweite while-Schleife greift hier ein und berechnet sowohl i als auch limit neu.

Ich kann nicht verstehen, warum ich das hätte tun sollen, und wer mir das beigebracht hat...

Hier ist ein Beispiel, wir setzen: bars - 100, barsToProcess = 5.

Beim ersten Indikatorlauf, counted_bars=0, wurde noch nicht gezählt, daher limit=100. Das bedeutet, dass die Schleife für den Anfang 100 Mal ausgeführt werden soll, von 0 bis 99.

Iterationen der for-Schleife:

1. i=0, limit=barsToProcess=5, while(i<5) - die interne Schleife mit gezeichneten Linien und Ticks wird 5 mal ausgeführt, von 0 bis 4, jedes Mal wenn i++, nach Beendigung while - i=5, limit=5.

2. i=5=Limit - for-Schleife ist beendet.

DIES IST ES! Der Indikator führt bis zum nächsten Tick keine weiteren Aktionen aus. Ein Tick kommt, counted_bars=99, limit=Bars-counted_bars= 100-99=1.

Die for-Schleife wird einmal ausgeführt, die while-Schleife wird gar nicht ausgeführt (da die Bedingung if(limit>barsToProcess) nicht erfüllt ist). Wir fahren fort, bis der Indikator aus dem Diagramm entladen oder der Zeitrahmen geändert wird, im Allgemeinen bis zur Reinitialisierung des Indikators.

Tatsächlich zeichnet der Indikator seine Tick-Linien einmal, wenn er in das Diagramm geladen wird, und bleibt bis zur Neuinitialisierung inaktiv. Die Frage ist, warum wir einen solchen Indikator brauchen? Das Skript kann eine einzige Antwort verarbeiten.

 

Ich habe den Code umgeschrieben. Mit der Schleife scheint alles in Ordnung zu sein.

Bleibt noch die Frage nach der Ziehung der "Pufferlinie".

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

Warum ich das getan habe, wer mir das beigebracht hat, weiß ich nicht...

Ich fand einen geeigneten Indikator und "zerlegte" ihn, bis das von mir benötigte Fragment übrig blieb. Dann habe ich die Codefragmente zusammengesetzt und bekam, was ich brauchte. Das geht so.

"Ich lerne."

 
Alex_Profit:

Ich habe den Code umgeschrieben. Mit der Schleife scheint alles in Ordnung zu sein.

Bleibt noch die Frage nach der Ziehung der "Pufferlinie".

Zum Einfügen des Codes gibt es die Schaltfläche SRC im oberen Bereich des Nachrichtenbearbeitungsfensters, die den Code sauber und ohne Leerzeilen einfügt.

Die Linie wird wahrscheinlich auch von Objekten gezeichnet werden müssen (Trending), die vorherige Zeit/Preis in separaten Variablen speichern und als zweite Punktkoordinaten verwenden.

Um ein Häkchen durch ein anderes Symbol zu ersetzen -OBJ_ARROW und ARROW_CODE.

 
evillive:

Für das Einfügen von Code gibt es eine SRC-Schaltfläche im oberen Bereich des Nachrichtenbearbeitungsfensters, die den Code sauber und ohne Leerzeilen einfügt.

Die Linie wird wahrscheinlich auch von Objekten gezeichnet werden müssen (Trend), die vorherige Zeit/Preis in separaten Variablen speichern und als zweite Punktkoordinaten verwenden.

Um ein Häkchen durch ein anderes Symbol zu ersetzen -OBJ_ARROW und ARROW_CODE.

Was gibt es nicht zu mögen?

ZEICHNEN_SCHNITT

1

Liniensegmente zwischen nicht leeren Linienwerten

 
AlexeyVik:

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

DRAW_SECTION

1

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

Ich weiß nicht, wie man es anwendet.

 
AlexeyVik:

Was gibt es nicht zu mögen an

ZEICHNEN_SCHNITT

1

Liniensegmente zwischen nicht leeren Werten der Linie

Evillive:

Die Linie müsste wahrscheinlich auch von Objekten gezeichnet werden (Trend), den vorherigen Zeitpunkt/Preis in separaten Variablen speichern und als zweite Punktkoordinaten verwenden.

Die Idee ist gut. Ich werde es versuchen, wenn es funktioniert.

In der Tat ist es nicht nötig, sie zu zeichnen. Hauptsache, es funktioniert richtig.

 

Alex_Profit:

Ich weiß nicht, wie man es anwendet.

Einfach in OnInit() anstelle von

SetIndexStyle(0, DRAW_LINE);

schreiben.

SetIndexStyle(0, DRAW_SECTION);

 

Irgendwie keine Veränderung

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