Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1041

 
Igor Makanu:

Versuchen Sie, die Frage anders zu stellen, vielleicht ist Ihre Frage unklar

Ich werde versuchen, das zu erklären. Aber bedenken Sie, dass ich praktisch kein Programmierer bin.

Wir haben einen Tick-Indikator, der eine Kurve auf den Gebotswerten aufbaut.

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

Was ich jetzt tun möchte.

Befestigen Sie den Indikator am Diagramm. Ermittelt den ersten Wert von bid1 beim ersten Tick. Merken Sie sich das (ich habe es getan - ich gebe den zweiten Puffer y[0] ein und zeichne seinen Wert in init() auf).

Beim zweiten Tick erhalten wir den zweiten Wert von bid2.

Dann müssen wir die Differenz in Punkten ermitteln. delta=bid1-bid2 (ich habe es so gemacht: delta=x[0]-x[1]).

Addieren Sie nun delta zu y[0] und erhalten Sie den Wert von y[1], der tatsächlich dem Wert von bid2 entspricht.

Die Indikatorkurve sollte mit der gesuchten Kurve identisch sein, aber sie wird anhand der berechneten Werte der Gebotsdifferenzen dargestellt.

Dieser Indikator wird als Vorlage für weitere Berechnungen benötigt.

Werfen Sie keine Steine. Ich habe es so gut ich konnte erklärt.

Ich danke Ihnen.

 
Oleg Bondarev:

Ich werde versuchen, das zu erklären. Aber bedenken Sie, dass ich praktisch ein Anfänger in der Programmierung bin.

Wir haben einen Tick-Indikator, der eine Kurve nach Gebotswerten aufbaut.

Was ich jetzt tun möchte.

Befestigen Sie den Indikator am Diagramm. Ermittelt den ersten Wert von bid1 beim ersten Tick. Merken Sie sich das (ich habe es getan - ich gebe den zweiten Puffer y[0] ein und zeichne seinen Wert in init() auf).

Beim zweiten Tick erhalten wir den zweiten Wert von bid2.

Dann müssen wir die Differenz in Punkten ermitteln. delta=bid1-bid2 (ich habe es so gemacht: delta=x[0]-x[1]).

Addieren Sie nun Delta zu y[0] und erhalten Sie den Wert von y[1], der tatsächlich dem Wert von bid2 entspricht.

Die Indikatorkurve sollte mit dem gesuchten Indikator identisch sein, aber sie wird anhand der berechneten Werte der Gebotsdifferenzen dargestellt.

Dieser Indikator wird als Vorlage für weitere Berechnungen benötigt.

Werfen Sie keine Steine. Ich habe versucht, es zu erklären, so gut ich konnte.

Ich danke Ihnen.

Es ist nicht klar, was Sie tun wollen

Hier ist das allgemeine Problem - Sie verwenden Indikatorpuffer als Array zum Speichern von Ticks (Bid), die Größe des Indikatorpuffers ändert das Terminal selbst, und zusätzlich - das Terminal verschiebt die Indikatorpuffer selbst beim Auftreten eines neuen Taktes

sollten Sie ein Array zum Speichern von Ticks und einen Indikatorpuffer zum Zeichnen verwenden

Ich habe einen Code ähnlich dem Ihren erstellt, bei dem ich Ticks in einem Array speichere

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Fügen Sie nun Ihre Berechnung zu diesem Code hinzu und zeichnen Sie sie unter Verwendung des Indikatorpuffers Label1Buffer gemäß Ihrer Idee

 
Es wäre schön, wenn sie die Möglichkeit hinzufügen würden, die Eigenschaften eines anderen Indikators programmatisch zu ändern. Nachdem Sie (programmatisch) einen weiteren Indikator zum Diagramm hinzugefügt haben, können Sie dessen Farbe, Stil und Linienstärke festlegen
 
Igor Makanu:

es ist nicht klar, was Sie tun wollen

Hier ist das genaue Problem - Sie verwenden Indikatorpuffer als Array zum Speichern von Ticks (Bid), die Größe des Indikatorpuffers ändert das Terminal selbst, und darüber hinaus - das Terminal verschiebt die Indikatorpuffer selbst, wenn ein neuer Balken erscheint

sollten Sie ein Array zum Speichern von Ticks und einen Indikatorpuffer zum Zeichnen verwenden

Ich habe einen Code ähnlich dem Ihren erstellt, bei dem ich Ticks in einem Array speichere

Jetzt müssen Sie Ihre Berechnung zu diesem Code hinzufügen und sie mit dem Indikatorpuffer Label1Buffer zeichnen, wie Sie es sich vorgestellt haben

Ich danke Ihnen für Ihre Antwort. Ich werde dich noch ein bisschen quälen.

Soll ich die Berechnung hier hinzufügen?

int OnCalculate()

Hier ist meine Berechnung.

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

Ich habe es hinzugefügt und nichts passiert.

 
Yevhenii Levchenko:
Es wäre schön, wenn sie die Möglichkeit hinzufügen würden, die Eigenschaften eines anderen Indikators programmatisch zu ändern. Nachdem Sie (programmatisch) einen weiteren Indikator zum Diagramm hinzugefügt haben, können Sie grob gesagt die Farbe, den Stil und die Dicke der Linien festlegen

Verwenden Sie Canvas und zeichnen Sie Karikaturen.

 

Ich werde noch ein Bild anhängen.

ind

 
Oleg Bondarev:

Hinzugefügt und nichts.

so funktioniert das nicht ))))

Um mit Indikatorpuffern in MQL zu zeichnen, muss man einen Wert in den Indikatorpuffer setzen - in meinem Beispiel ist es Label1Buffer (einen Wert zuweisen)

In Ihrem Beispiel weisen Sie Werte nur zu, wenn eine Bedingung erfüllt ist und wenn die Bedingung nicht erfüllt ist? - Es wird also nichts gedruckt werden.


Und noch einmal, ich habe eine "Vorlage" erstellt, in der das Array TickArr die Werte von Ticks Bid enthält, aber in Ihren Bedingungen verwenden Sie die vorherigen Werte des Indikatorpuffers - und wer hat welche Werte in diese Puffer eingegeben?


Versuchen Sie, eine Linie durch den Indikatorpuffer zu ziehen, und vergleichen Sie dann die Ticks.

 
Oleg Bondarev:

Ich werde noch ein Bild anhängen.


Was ist, wenn der Winkel umgekehrt ist? Wie würde die Berechnung erfolgen?

 
Oleg Bondarev:

Ich werde noch ein Bild anhängen.


Wenn Sie sagen, dass Sie praktisch eine Null im Programmieren sind, warum übernehmen Sie dann solche Nicht-Standardaufgaben, vielleicht sollten Sie mit einfachen Aufgaben anfangen? Oder um Ihre Grundkenntnisse zu verbessern? Es ist einfacher, die Arbeit für Sie zu erledigen, ja.
 
Igor Makanu:

das wird nicht funktionieren ))))

Um mit Indikatorpuffern in MQL zu zeichnen, muss man dem Indikatorpuffer einen Wert zuweisen - in meinem Beispiel den Label1Buffer

In Ihrem Beispiel weisen Sie Werte nur zu, wenn eine Bedingung erfüllt ist und wenn die Bedingung nicht erfüllt ist? - Es wird also nichts gedruckt werden.


Und noch einmal, ich habe eine "Vorlage" erstellt, in der das Array TickArr die Werte von Ticks Bid enthält, aber in Ihren Bedingungen verwenden Sie die vorherigen Werte des Indikatorpuffers - und wer hat welche Werte in diese Puffer eingegeben?


Versuchen Sie, eine Linie durch den Indikatorpuffer zu ziehen, und vergleichen Sie dann die Ticks.

Ich habe davor gewarnt, dass ich ein Hacker bin.)

Ich habe es auf diese Weise gemacht.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Jetzt wird das Tick-Diagramm gezeichnet, aber es gibt einige Zeilenumbrüche.

Ich mache eine 4.