Indicatore per contare le barre del periodo M1 che incrociano il prezzo aperto del periodo D1 - pagina 2

 
 
Ciao WHRoeder, sono riuscito a compilare l'indicatore e ho allegato qui l'immagine del grafico. La linea dell'indicatore in rosso forma una linea retta in alto ed è scesa a Bar0. Ho allegato qui gli ultimi codici gentilmente consigliare dove migliorare il codice in modo che l'indicatore tracci i valori di M1 incrociati. Grandi ringraziamenti in anticipo.
#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

 
double Buf_0[];             // 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()
  {
  
  
     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(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]++; 
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------
 
 
Zaldy: una linea retta in alto ed è caduto a Bar0.
Avete la storia di M1?
 
WHRoeder:
Ha la storia di M1?


Sì, ce l'ho.
 
#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

 
double Buf_0[];             // 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()
  {
  
  
     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(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]++; 
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------
 

La linea di codice evidenziata darà lo spostamento corretto solo se l'indi è collegato al grafico giornaliero.

Come ho già detto nel mio post precedente

"Quindi hai bisogno del valore datetime per l'apertura della candela D1. Puoi farlo? "

 
GumRai:

La linea di codice evidenziata darà lo spostamento corretto solo se l'indi è collegato al grafico giornaliero.

Come ho già detto nel mio post precedente

"Quindi hai bisogno del valore datetime per l'apertura della candela D1. Puoi farlo? "


Ciao GumRai, ho provato molte volte ma non sono nemmeno riuscito a compilarlo, è oltre la mia comprensione. La cosa migliore è se qualcuno può mostrarmi come allora imparerò da esso, ho notato che imparo rapidamente se ci sono esempi. In questo momento l'indicatore sta contando le barre M1 all'interno della Bar1 che incrociano il prezzo Open[1]. Tuttavia il conteggio si ferma da lì e non progredisce per completare il grafico. Ho provato a collegare l'indicatore a un EA ma anche l'EA non può inviare il segnale durante il back testing. Per favore mostra qualche codice che completi questo indicatore per bene. Grazie.
 
Buf_0[iCht] = EMPTY;
 
Zaldy:

Ciao GumRai, ho provato molte volte ma non sono nemmeno riuscito a compilarlo, è oltre la mia comprensione. La cosa migliore è se qualcuno può mostrarmi come allora imparerò da esso, ho notato che imparo rapidamente se ci sono esempi. In questo momento l'indicatore sta contando le barre M1 all'interno della Bar1 che incrociano il prezzo Open[1]. Tuttavia il conteggio si ferma da lì e non progredisce per completare il grafico. Ho provato a collegare l'indicatore a un EA ma anche l'EA non può inviare il segnale durante il back testing. Per favore mostra qualche codice che completi questo indicatore per bene. Grazie.


Non compilato o testato, ma potrebbe aiutarti

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]); 
      
      //----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]++;
         } 
         }
 
qjol:


Sono riuscito a inserire Buf_0[iCht] = EMPTY; nel codice WHRoeder e in qualche modo l'indicatore ha funzionato. Tuttavia, quando l'ho collegato al mio EA, continuava a caricarlo e scaricarlo come un ubriacone che vomitava latte. Gli altri indicatori collegati allo stesso EA hanno funzionato bene. Questo è il messaggio che ho ricevuto:

2014.02.25 17:17:08.806 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: rimosso

2014.02.25 17:17:08.799 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: caricato con successo

2014.02.25 17:17:08.794 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: rimosso

2014.02.25 17:17:08.787 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: caricato con successo

2014.02.25 17:17:08.783 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: rimosso

2014.02.25 17:17:08.774 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: caricato con successo

2014.02.25 17:17:08.768 2014.01.02 07:48 Indicatore personalizzato MamaMaryII EURPLN,Daily: rimosso

Per favore fatemi sapere cosa è andato storto. Grazie. Indicatore personalizzato attaccato su un grafico
 
#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(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]);
   Buf_0[iCht] = EMPTY;  //  <<<<<<<<<<<< This is the magic code that gjol inserted and it worked.    
      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]++; 
       // Buf_1[iCht]= Multiplier*Buf_0[iCht];
     }
  }   
//--------------------------------------------------------------------
   return(0);// 
  }
//--------------------------------------------------------------------
Motivazione: