Indikator zum Zählen von Bars der M1-Periode, die den Eröffnungskurs der D1-Periode kreuzen

 

Grüße! Ich brauche Hilfe zu diesem Indikator. Ich habe verschiedene Methoden ausprobiert, um die Anzahl der Bars in der M1-Periode zu zählen, die auf das Niveau des Eröffnungskurses in der D1-Periode treffen. Ich habe meinen Versuch, es zu codieren, aber nicht in der Lage, es erfolgreich auszuführen. Ich habe mich sehr bemüht, aber ich bin an eine Wand gestoßen, so dass ich jetzt die Hilfe der freundlichen Herren hier um Hilfe bitte!

Hier ist, was ich für diesen Indikator brauche:

1. Wann immer ein Bar in der M1-Periode über den Preis der Eröffnung in der D1-Periode kommt, wird er gezählt. Es gibt 1440 Bars in der M1-Periode für jede D1-Periode, so dass alle 1440 Bars getestet werden.

2. Für jeden D1-Balken wird die Gesamtzahl/D1-Balken summiert und durch einen bestimmten Wert gemittelt. Sagen wir, der Durchschnitt ist 30, diese 30 ist die Anzahl der D1-Balken.

//+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link      "XXX"
#property version   "1.00"
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;  // Bar index
extern int Aver_Bars=30;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                          // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer(0,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Line style
//--------------------------------------------------------------------
   SetIndexBuffer(1,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }

3. Dann wird der Durchschnittswert als Indikator aufgezeichnet.

 
BITTE HELFEN SIE UNS! IST DIES ÜBERHAUPT MÖGLICH?
 

Aus Ihrem Code kann ich nicht ersehen, was Sie zu tun versuchen, aber an 2 Stellen geben Sie der Variablen i keinen Wert. Dies müssen Sie beheben.

int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }
 

Entschuldigen Sie, dass ich so offen bin, aber Ihr Code zeigt, dass Sie versuchen, etwas zu erreichen, das weit über Ihre Fähigkeiten hinausgeht

Beispiel

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);

Nehmen wir zum Beispiel an, dass i = 1 ist.

double O=iOpen(NULL,PERIOD_D1,1);

Dies gibt den gestrigen Eröffnungskurs zurück

   double H=iHigh(NULL,PERIOD_M1,1);
   double L=iLow(NULL,PERIOD_M1,1);

Diese 2 geben Werte für den letzten geschlossenen 1-Minuten-Balken zurück.


Sie vergleichen also die Werte von vor 1 Minute mit dem Eröffnungskurs von gestern.

Wenn i = 2 ist, vergleichen Sie die Werte von vor 2 Minuten mit dem Eröffnungskurs von vor 2 Tagen.

Sie werden sehen, dass dies nicht das sein kann, was Sie wollen.

 
GumRai:

Entschuldigen Sie, dass ich so offen bin, aber Ihr Code zeigt, dass Sie versuchen, etwas zu erreichen, das weit über Ihre Fähigkeiten hinausgeht

Beispiel

Nehmen wir zum Beispiel an, dass i = 1 ist.

Dies gibt den gestrigen Eröffnungskurs zurück

Diese 2 geben Werte für den letzten geschlossenen 1-Minuten-Balken zurück.


Sie vergleichen also die Werte von vor 1 Minute mit dem Eröffnungskurs von gestern.

Wenn i = 2 ist, vergleichen Sie die Werte von vor 2 Minuten mit dem Eröffnungskurs von vor 2 Tagen.

Sie werden sehen, dass dies nicht das sein kann, was Sie wollen.


Hallo GumRai,

Danke, dass Sie sich die Zeit genommen haben, mir zu helfen. Sie haben Recht, ich bin noch ein Anfänger und versuche eifrig, EA zu programmieren. Hier ist, was ich zu tun versuche:

1. Vergleichen Sie PERIOD_D1 Open zu jeder Minute PERIOD_M1 bar auf seine eigene D1 bar, so gibt es 1440 M1 Bars mit dem D1 bar zu vergleichen. Dann zähle ich die M1-Balken, die die Bedingung if (O > L && O < H) erfüllen.

2. Speichern Sie die gezählten Balken in einem Array, gehen Sie dann zum nächsten D1-Balken und wiederholen Sie den Zyklus.

3. Die gezählten Balken werden vom Indikator in einem Tagesdiagramm dargestellt. Wenn z.B. die M1-Balken, die den Anweisungen entsprechen, 5 sind, wird diese 5 als Wert des täglichen Bar1 gezeichnet. Angenommen, der nächste Tagesbalken hat einen Wert von 10, dann wird er wieder als Bar1 dargestellt, da der vorherige Balken nach Bar2 verschoben wurde.

Bitte zeigen Sie mir, wie am besten zu codieren diese schien einfache Anweisung, die ich mit kämpfen. Lassen Sie mich wissen, wenn Sie weitere Erklärungen benötigen. und vielen Dank.

 
Zaldy:


Hallo GumRai,

Danke, dass Sie sich die Zeit genommen haben, mir zu helfen. Sie haben Recht, ich bin nur ein Anfänger und eifrig versuchen, hart zu lernen, Kodierung EA. Hier ist, was ich versuche zu tun:

1. Vergleichen Sie PERIOD_D1 Open mit jeder Minute PERIOD_M1 bar auf seine eigene D1 bar, so gibt es 1440 M1 Bars mit dem D1 bar zu vergleichen. Dann zähle ich die M1-Balken, die die Bedingung if (O > L && O < H) erfüllen.

2. Speichern Sie die gezählten Balken in einem Array, gehen Sie dann zum nächsten D1-Balken und wiederholen Sie den Zyklus.

3. Die gezählten Balken werden vom Indikator in einem Tagesdiagramm dargestellt. Wenn z.B. die M1-Balken, die den Anweisungen entsprechen, 5 sind, wird diese 5 als Wert des täglichen Bar1 gezeichnet. Angenommen, der nächste Tagesbalken hat einen Wert von 10, dann wird er wieder als Bar1 dargestellt, da der vorherige Balken nach Bar2 verschoben wurde.

Bitte zeigen Sie mir, wie am besten zu codieren diese schien einfache Anweisung, die ich mit kämpfen. Lassen Sie mich wissen, wenn Sie weitere Erklärungen benötigen. und vielen Dank.


Ich helfe Ihnen gerne, aber ich werde den Code nicht schreiben, denn das würde Ihnen nicht helfen, zu lernen.

Zunächst müssen Sie sich darüber im Klaren sein, dass 1440 M1-Balken nicht immer einem Zeitraum von einem Tag entsprechen. Wenn es während eines Balkens keine Ticks gibt, fehlt dieser Balken in der Historie und es können weniger sein, als Sie erwarten.

Sie benötigen also den Datumswert für den Eröffnungszeitpunkt der D1-Kerze. Können Sie das tun? Probieren Sie es aus und posten Sie Ihren Code

 

nicht so schnell

Ich weiß, was du versuchst zu tun und dein Code(if (O > L && O < H)) bringt dir nicht das, was du willst

Sehen Sie sich das beigefügte Diagramm an



der Pfeil nach oben ist die heutige Eröffnung

& der Pfeil nachrechts ist der erste Balken, der zu Ihrem Code passt (if (O > L && O < H)), also count = 1

aber wenn Sie darauf achten, schloss der Balken über der heutigen Eröffnung, so dass der Zähler eigentlich = 2 sein sollte (zumindest (vielleicht gibt es noch ein paar weitere Kreuze, die man nur im Tick-Chart nicht erkennen kann))

aber in deinem Code ist count = 1

 
qjol:

nicht so schnell

Ich weiß, was du versuchst zu tun und dein Code(if (O > L && O < H)) bringt dir nicht das, was du willst

Sehen Sie sich das beigefügte Diagramm an



der Pfeil nach oben ist die heutige Eröffnung

& der Pfeil nachrechts ist der erste Balken, der zu Ihrem Code passt (if (O > L && O < H)), also count = 1

aber wenn Sie darauf achten, schloss der Balken über der heutigen Eröffnung, so dass der Zähler eigentlich = 2 sein sollte (zumindest (vielleicht gibt es noch ein paar weitere Kreuze, die man nur im Tick-Chart nicht erkennen kann))

aber in deinem Code ist count = 1


So wie ich es verstehe, will er die Bars zählen, die den Eröffnungskurs überspannen - ich kann mich aber auch irren :)
 
  1. Zaldy: BITTE HELFEN SIE UNS! IST DAS ÜBERHAUPT MÖGLICH?
    Schreien Sie uns nicht an. Natürlich ist es möglich.
  2. Ganzzahlen und Boolesche Zahlen sind konvertierbar. Falsch == 0, wahr = ungleich Null.
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. Sie haben es auch mit drei Zeitrahmen zu tun, D1, Chart, M1. Sie müssen konvertieren.
    Nicht kompiliert oder getestet.
       Counted_bars=IndicatorCounted(); // Number of counted bars
       for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
          int      iD1    = iBarShift(NULL, PERIOD_D1, Time[iCht];
          double   openD1 = iOpen(NULL, PERIOD_D1, iD1);
          int      iM1Beg = iBarShift(NULL, PERIOD_M1, Time[iCht],
                   iM1End = -1;
          if(iCht > 0) iM1End = iBarShift(NULL, PERIOD_M1, Time[iCht-1];
          for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh(NULL, PERIOD_M1, iM1Beg),
                    lM1 =  iLow(NULL, PERIOD_M1, iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    Nicht kompiliert oder getestet.
 
qjol:

nicht so schnell

Ich weiß, was du versuchst zu tun und dein Code(if (O > L && O < H)) bringt dir nicht das, was du willst

Sehen Sie sich das beigefügte Diagramm an



der Pfeil nach oben ist die heutige Eröffnung

& der Pfeil nachrechts ist der erste Balken, der zu Ihrem Code passt (if (O > L && O < H)), also count = 1

aber wenn Sie darauf achten, schloss der Balken über der heutigen Eröffnung, so dass der Zähler eigentlich = 2 sein sollte (zumindest (vielleicht gibt es noch ein paar weitere Kreuze, die man nur im Tick-Chart nicht erkennen kann))

aber in deinem Code ist count = 1


Hallo Qjol, Ja, der Pfeil nach rechts ist die erste Zählung, die ich will. Diejenigen, die kreuz und quer die D1 Open nur gezählt wird. Nochmals vielen Dank für deine Bemühungen.
 
WHRoeder:
  1. Zaldy: BITTE HILFT MIR JEMAND! IST DAS ÜBERHAUPT MÖGLICH?
    Schreien Sie uns nicht an. Natürlich ist es möglich.
  2. Ganzzahlen und Boolesche Zahlen sind konvertierbar. Falsch == 0, wahr = ungleich Null.
  3. Sie haben es auch mit drei Zeitrahmen zu tun, D1, Chart, M1. Sie müssen konvertieren.
    Nicht kompiliert oder getestet.
    Nicht kompiliert und nicht getestet.

Danke WHRoeder und Entschuldigung für die Großbuchstaben hier! Ich werde Ihre Vorschläge ausprobieren und hier auf das Ergebnis zurückkommen.