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

 
Zaldy:


Dieser Code kann Werte liefern, aber er liefert keine korrekten Werte.

Bitte lesen Sie meine früheren Beiträge

 
GumRai:


Dieser Code liefert zwar Werte, aber keine korrekten Werte.

Bitte lesen Sie meine früheren Beiträge

Hallo Gumrai, ich habe Ihren Code plus den magischen Qjol-Code kompiliert, den ich hier angehängt habe. Ohne den Qjol-Code ist die Form des Plots wie eine Zahl 7, aber mit dem Qjol-Code verhält er sich besser. Der Wert ist, wie Sie im Bild sehen können, auf -1 gefallen. Das Diagramm hat die gleiche Form wie das vorherige Bild hier, aber einen anderen Wert. Bitte geben Sie mir einen Rat, wie ich dies verbessern kann. Danke!
 
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Red     // Color of the 1st line
//#property indicator_color2 Yellow      // Color of the 2nd line
 
//extern int Multiplier=2; 
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_SOLID,2);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  
  
     int  i=0, iCht, Counted_bars; 
      
   
//--------------------------------------------------------------------
  Counted_bars=IndicatorCounted(); // Number of counted bars
   for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
      int      iD1    = iBarShift(Symbol(), PERIOD_D1, Time[iCht]); 
    Buf_0[iCht] = EMPTY;  //  <<<<<<<<<<<< This is the magic code that gjol inserted and it worked.      
      //----find the datetime of iD1. ie the Time[]
      datetime daystarttime = iTime(Symbol(),PERIOD_D1,iD1);
      
      double   openD1 = iOpen(Symbol(), PERIOD_D1, iD1);
      
      //----find BarShift of daystarttime on current chart and take the nearest following bar if it doesn't exist
      int iM1Beg = iBarShift(Symbol(),PERIOD_M1,daystarttime,true);
      if(iM1Beg<0)
         iM1Beg = iBarShift(Symbol(),PERIOD_M1,daystarttime,false)+1;
      
      //----find BarShift for end of day on current chart and take the nearest following bar if it doesn't exist
      if(iD1>0)
         {
         datetime nextday = iTime(Symbol(),PERIOD_D1,iD1-1);
         int iM1End = iBarShift(Symbol(),PERIOD_M1,nextday-1,true);
         if(iM1End<0)
         
            iM1End = iBarShift(Symbol(),PERIOD_M1,nextday,false);
      
               
       
         for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
                double hM1 = iHigh(Symbol(), PERIOD_M1, iM1Beg),
                lM1 =  iLow(Symbol(), PERIOD_M1, iM1Beg);
// count Bars of M1 Period that crisscross Open price of D1 Period 
         if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++;
         } 
         }
         }
//--------------------------------------------------------------------
   return(0);// 
  }
//--------------------------------------------------------------------
 
GumRai:


Dieser Code liefert zwar Werte, aber keine korrekten Werte.

Bitte beachten Sie meine früheren Beiträge


Hallo GumRai,

Bitte teilen Sie uns mit, wie wir dies am besten verbessern können. Danke!

 
Zaldy:


Hallo GumRai,

Bitte teilen Sie uns mit, wie wir dies am besten verbessern können. Danke!


Sieht so aus, als hätten Sie meine Vorschläge bereits umgesetzt.

Die Zeile indi fällt auf Null, weil der Puffer[0] im Code nicht berechnet wird. Sie müssen entscheiden, ob dieser Wert bei 0 beginnen und im Laufe des Tages ansteigen soll, oder ob Sie einfach buffer[0] == buffer[1] setzen wollen, was das Ganze aufgeräumter aussehen lassen würde.

 
Vielen Dank an WHRoeder, qjol und GumRai für die große Hilfe bei der Programmierung meines Indikators.
 
GumRai:


Wie es aussieht, haben Sie meine Vorschläge bereits umgesetzt.

Die Zeile indi fällt auf Null, weil der Puffer[0] im Code nicht berechnet wird. Sie müssen sich entscheiden, ob dieser Wert bei 0 beginnen und im Laufe des Tages ansteigen soll, oder ob Sie einfach Puffer[0] == Puffer[1] setzen wollen, was das Ganze aufgeräumter aussehen lassen würde.


Hallo GumRai, wie kann ich einen Code erstellen, der bei 0 beginnt und im Laufe des Tages ansteigt? Bitte um Hilfe. Danke!
 
Zaldy:

Hallo GumRai, wie kann ich einen Code erstellen, der bei 0 beginnt und im Laufe des Tages ansteigt? Bitte helfen Sie mir. Danke!


Ich habe einige Änderungen an Ihrem Code vorgenommen



int start()                         // Special function start()
  {
  
  
  int  i, iCht, Counted_bars, limit, iD1, iM1Beg, iM1End, counter ; 
  datetime daystarttime, nextday ;   
  double hM1, lM1, openD1 ; 
//--------------------------------------------------------------------
  Counted_bars=IndicatorCounted(); // Number of counted bars
  limit = Bars - 1 - Counted_bars;
  if(limit > Bars-100)   
      limit = Bars-100;
  for(iCht = limit; iCht >= 0; iCht--){ // Chart bars
      iD1 = iBarShift(Symbol(), PERIOD_D1, Time[iCht]); //---Barshift on daily chart
      daystarttime = iTime(Symbol(),PERIOD_D1,iD1); //--Find datetime value for start of the day      
      openD1 = iOpen(Symbol(), PERIOD_D1, iD1);
      
      //----find BarShift of daystarttime on current chart and take the nearest following bar if it doesn't exist
      iM1Beg = iBarShift(Symbol(),PERIOD_M1,daystarttime,true);
      if(iM1Beg<0)
         iM1Beg = iBarShift(Symbol(),PERIOD_M1,daystarttime,false)+1;
      
      //----find BarShift for end of day on current chart and take the nearest following bar if it doesn't exist
      if(iD1>0)  //-- Change to iD1>=0 to show running total for the current day
         {
         nextday = iTime(Symbol(),PERIOD_D1,iD1-1);
         iM1End = iBarShift(Symbol(),PERIOD_M1,nextday-1,true);
         if(iM1End<0)         
            iM1End = iBarShift(Symbol(),PERIOD_M1,nextday,false);
       
         counter = 0;
         for(i= iM1Beg; i >= iM1End; i--){
            hM1 = iHigh(Symbol(), PERIOD_M1, i);
            lM1 =  iLow(Symbol(), PERIOD_M1, i);
            // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1)
               counter++ ;
         }
         Buf_0[iCht] = counter; 
         }
         }
//--------------------------------------------------------------------
   return(0);// 
  }
//--------------------------------------------------------------------
//+------------------------------------------------------------------+

Dies sollte das tun, was Sie wollen

So wie es ist, gibt es keinen Wert für den heutigen Tag.

Wenn Sie die Änderung wie im hervorgehobenen Text vornehmen, sollte er einen Wert für heute enthalten, der bei 0 beginnt und sich im Laufe des Tages erhöht

 

Warum die Handlung hier unvollständig ist. Es ist nicht vor Januar 2014 zu füllen. Bitte weisen Sie auf das Problem hin. Dieses Diagramm wurde mit dem WHRoeder-Code erstellt, aber auch das von GumRai vorgeschlagene Diagramm ergibt die gleiche unvollständige Darstellung.

 
weil Sie keine M1-Daten vor diesem Datum haben