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

 

Saluti! Ho bisogno di aiuto per questo indicatore. Ho provato diversi metodi per contare il numero di barre nel periodo M1 che si sono imbattuti nel livello di prezzo aperto nel periodo D1. Ho allegato il mio tentativo di codificarlo ma non riesco a farlo funzionare con successo. Sto provando duramente su questo ma ho colpito il muro così ora chiedo l'aiuto dei gentili signori qui per aiuto!

Ecco cosa mi serve per questo indicatore:

1. 1. Quando una barra del prezzo del periodo M1 incontra il prezzo dell'apertura del periodo D1, questo viene contato. Ci sono 1440 barre in M1 Period per ogni D1 Period quindi ogni 1440 barre saranno testate.

2. Per ogni D1 Bar il conteggio totale/D1 Bar sarà sommato e mediato per un certo valore. Diciamo che la media è 30, questo 30 è il numero di barre D1.

//+------------------------------------------------------------------+
//|                                                          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. Poi il valore medio sarà tracciato come indicatore.

 
PER FAVORE AIUTATE CHIUNQUE! È POSSIBILE?
 

Non riesco a capire dal tuo codice cosa stai cercando di fare, ma in 2 punti non dai un valore alla variabile i. Dovete risolvere questo problema.

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

Mi dispiace essere schietto, ma il tuo codice mostra che stai cercando di ottenere qualcosa che va ben oltre le tue capacità

Esempio

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

Diciamo che i = 1 per esempio

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

Questo restituirà il prezzo aperto di ieri

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

Questi 2 restituiranno i valori dell'ultima barra chiusa da 1 minuto.


Quindi stai confrontando i valori di 1 minuto fa con l'open di ieri.

Se i = 2, confronterai i valori di 2 minuti fa con l'apertura di 2 giorni fa

Devi capire che questo non può essere ciò che vuoi.

 
GumRai:

Mi dispiace essere schietto, ma il tuo codice mostra che stai cercando di ottenere qualcosa che va ben oltre le tue capacità

Esempio

Diciamo che i = 1 per esempio

Questo restituirà il prezzo aperto di ieri

Questi 2 restituiranno i valori dell'ultima barra chiusa da 1 minuto.


Quindi stai confrontando i valori di 1 minuto fa con l'open di ieri.

Se i = 2, confronterai i valori di 2 minuti fa con l'apertura di 2 giorni fa

Devi capire che questo non può essere ciò che vuoi.


Ciao GumRai,

Grazie per aver dedicato del tempo ad aiutarmi. Hai ragione, sono solo un principiante e sto cercando di imparare a codificare EA. Ecco cosa sto cercando di fare:

1. 1. Confrontare PERIOD_D1 Open con ogni minuto PERIOD_M1 bar sulla propria barra D1, quindi ci sono 1440 barre M1 da confrontare con la barra D1. Poi contare le barre M1 che soddisfano la condizione if (O > L && O < H) .

2. Memorizza le barre contate in un array, poi procedi di nuovo alla prossima barra D1 e ripeti il ciclo di nuovo.

3. Le barre contate saranno tracciate dall'indicatore su un grafico giornaliero. Quindi, se diciamo che le barre M1 che soddisfano le dichiarazioni sono 5, questo 5 sarà tracciato come valore della Bar1 giornaliera. Poi diciamo che per la prossima barra giornaliera la barra M1 contata è 10 allora sarà tracciata di nuovo su Bar1 come la barra precedente spostata su Bar2.

Gentilmente mostratemi come codificare al meglio questa dichiarazione che sembra semplice e con la quale faccio fatica. Fatemi sapere se avete bisogno di ulteriori spiegazioni e grazie.

 
Zaldy:


Ciao GumRai,

Grazie per aver dedicato del tempo ad aiutarmi. Hai ragione, sono solo un principiante e sto cercando duramente di imparare la codifica di EA. Ecco cosa sto cercando di fare:

1. 1. Confrontare PERIOD_D1 Open con ogni minuto della barra PERIOD_M1 sulla propria barra D1, quindi ci sono 1440 barre M1 da confrontare con la barra D1. Poi contare le barre M1 che soddisfano la condizione if (O > L && O < H) .

2. Memorizza le barre contate in un array, poi procedi di nuovo alla prossima barra D1 e ripeti il ciclo di nuovo.

3. Le barre contate saranno tracciate dall'indicatore su un grafico giornaliero. Quindi, se diciamo che le barre M1 che soddisfano le dichiarazioni sono 5, questo 5 sarà tracciato come valore della Bar1 giornaliera. Poi diciamo che per la prossima barra giornaliera la barra M1 contata è 10 allora sarà tracciata di nuovo su Bar1 come la barra precedente spostata su Bar2.

Gentilmente mostratemi come codificare al meglio questa dichiarazione che sembra semplice e con la quale faccio fatica. Fatemi sapere se avete bisogno di ulteriori spiegazioni e grazie mille.


Sarò felice di aiutarvi, ma non scriverò il codice perché questo non vi aiuterebbe a learmare.

Per prima cosa, devi capire che 1440 barre M1 non corrispondono sempre a un periodo di 1 giorno. Se non ci sono tick durante una barra, quella barra mancherà dalla storia e potrebbe essercene meno di quanto ti aspetti.

Quindi hai bisogno del valore datetime per l'apertura della candela D1. Puoi fare questo? Prova e pubblica il tuo codice

 

non così veloce

so cosa stai cercando di fare e il tuo codice(if (O > L && O < H)) non ti darà quello che vuoi

guarda il grafico allegato



la freccia rivolta verso l'alto è l'apertura di oggi

e la freccia rivoltaa destra è la prima barra che corrisponde al tuo codice (if (O > L && O < H)) quindi conta = 1

ma se fai attenzione la barra ha chiuso sopra l'apertura di oggi quindi, in realtà il conteggio dovrebbe essere = 2 (almeno (potrebbe esserci qualche altro incrocio che non puoi vedere solo nel grafico in tick))

ma nel tuo codice conta = solo 1

 
qjol:

non così veloce

so cosa stai cercando di fare e il tuo codice(if (O > L && O < H)) non ti darà quello che vuoi

guarda il grafico allegato



la freccia rivolta verso l'alto è l'apertura di oggi

e la freccia rivoltaa destra è la prima barra che corrisponde al tuo codice (if (O > L && O < H)) quindi conta = 1

ma se fai attenzione la barra ha chiuso sopra l'apertura di oggi quindi, in realtà il conteggio dovrebbe essere = 2 (almeno (potrebbe esserci qualche altro incrocio che non puoi vedere solo nel grafico in tick))

ma nel tuo codice conta = solo 1


Da quanto ho capito, vuole contare le barre che sono a cavallo del prezzo di apertura - potrei sbagliarmi però :)
 
  1. Zaldy: PER FAVORE AIUTATE CHIUNQUE! È POSSIBILE?
    Non gridare contro di noi. Certo che è possibile.
  2. Gli interi e i booleani sono convertibili. Falso == 0, vero = non zero.
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. Avete anche a che fare con tre timeframes, D1, chart, M1. Dovete convertire.
    Non compilato o testato.
       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]++; 
          }
       }
    
    Non compilato o testato.
 
qjol:

non così veloce

so cosa stai cercando di fare e il tuo codice(if (O > L && O < H)) non ti darà quello che vuoi

guarda il grafico allegato



la freccia rivolta verso l'alto è l'apertura di oggi

e la freccia rivoltaa destra è la prima barra che corrisponde al tuo codice (if (O > L && O < H)) quindi conta = 1

ma se fai attenzione la barra ha chiuso sopra l'apertura di oggi quindi, in realtà il conteggio dovrebbe essere = 2 (almeno (potrebbe esserci qualche altro incrocio che non puoi vedere solo nel grafico in tick))

ma nel tuo codice conta = solo 1


Ciao Qjol, Sì la freccia rivolta a destra è il primo conteggio che voglio. Quelli che attraversano il D1 Open solo è contato. Grazie ancora per i tuoi sforzi.
 
WHRoeder:
  1. Zaldy: PER FAVORE AIUTATE QUALCUNO! È POSSIBILE?
    Non gridare con noi. Naturalmente è possibile.
  2. Gli interi e i booleani sono convertibili. Falso == 0, vero = non zero.
  3. Avete anche a che fare con tre timeframes, D1, chart, M1. Dovete convertire.
    Non compilato o testato.
    Non compilato o testato.

Grazie WHRoeder e scusa se ho usato le maiuscole qui! Proverò i tuoi suggerimenti e tornerò qui per il risultato.