detection fin de barre

 

Bonjour,

je suis à la recherche d'une méthode ou d'une fonction pour détecter la fin d'une barre. L'idée sous-jacente consiste à stocker le résultat d'un calcul dans un tableau.

tab[0]= (val close) -  (Moyenne mobile lors de la clôture de la barre)


cdl remy

 
Si j’ai bien compris, tu cherches à détecter la fin d’une candlestick. 

Pour faire cela, je considère que, généralement, fin d’une candlestick = début d’une nouvelle candlestick. 

Il suffit juste donc de détecter le début d’une nouvelle candlestick. 

Je suis sur téléphone pour le moment donc je ne peux pas t’envoyer le code, mais cherche dans la Codebase « Is New Bar », tu trouveras très probablement une fonction qui te permet de détecter l’ouverture d’une nouvelle barre, donc la fin d’une autre. C’est un code très simple. 
 

oui, oui  tu as bien compris, merci pour les infos   https://www.mql5.com/fr/articles/159  

je rajoute un petit bout de code


   
  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
{

    double mm=moyenneMobileArithmetique();  
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    //gestion de l'index
    if(isNewBar()){index++;}
    if(index>(nbBarres-1)){index=0;}
    // calcul 
    tabBar[index]=currentPrice-mm;


   // Filtrage des faux positifs à partir des valeurs du tableau.
}





bool isNewBar()
  {
//--- memorize the time of opening of the last bar in the static variable
   static datetime last_time=0;
//--- current time
   datetime lastbar_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- if it is the first call of the function
   if(last_time==0)
     {
      //--- set the time and exit
      last_time=lastbar_time;
      return(false);
     }

//--- if the time differs
   if(last_time!=lastbar_time)
     {
      //--- memorize the time and return true
      last_time=lastbar_time;
      return(true);
     }
//--- if we passed to this line, then the bar is not new; return false
   return(false);
  }
  
  


cdl remy

Le gestionnaire d'événements "New Bar"
Le gestionnaire d'événements "New Bar"
  • www.mql5.com
Le langage de programmation MQL5 est en mesure de résoudre des problèmes à un tout nouveau niveau. Même ces tâches, qui offrent déjà de telles solutions, grâce à la programmation orientée objet peuvent atteindre un niveau supérieur. Dans cet article, nous prenons un exemple particulièrement simple de vérification d'une nouvelle barre sur un graphique, qui a été transformé en un outil plutôt puissant et polyvalent. Quel outil ? Découvrez-le dans cet article.
 
Essaie aussi avec cette fonction :

_________________

 
 bool TesterPremierTick(ENUM_TIMEFRAMES Tf)
  
 {                                       
  MqlRates TickBougie[5];   
  int NbreBougie = CopyRates(_Symbol, Tf, 0, 5, TickBougie);
        
  if ((NbreBougie == 5) && (TickBougie[4].tick_volume == 1)) return true;
   
  return false;
 }

_________________

// Et pour l'appeler de n'importe où dans ton code, il te suffirait de faire juste ça, par exemple :

bool NewBar = TesterPremierTick(PERIOD_M1)

if (NewBar)
  {
   instruction1;
   instruction2;
   etc...
  }

 

Merci cela fct, cela prend probablement un peu moins de temps. Par contre, s'il y a une coupure réseau ou  lorsque je passe de

 

tick_volume=50+ nouvelles barres + coupure + fin de la coupure+ tick_volum ( nouvelles barres )=10,

il va y avoir un problème, non ? Et j'ai également adapté ton code. un peu


bool isNewBar()
 {                                       
  MqlRates TickBougie[1];   
  int NbreBougie = CopyRates(_Symbol, _Period , 0, 1, TickBougie);
  if ((NbreBougie == 1) && (TickBougie[0].tick_volume == 1)) return true;
  return false;
 } 

cdl remy

 
pipoubibou #:

Merci cela fct, cela prend probablement un peu moins de temps. Par contre, s'il y a une coupure réseau ou  lorsque je passe de

 

tick_volume=50+ nouvelles barres + coupure + fin de la coupure+ tick_volum ( nouvelles barres )=10,

il va y avoir un problème, non ? Et j'ai également adapté ton code. un peu


cdl remy

Pas mal. Et j'espère que ton adaptation donne le même résultat, et c'est le plus important.

 

Je viens de vérifier, dans les deux cas il y a bien un problème. Il ne faut pas que la coupure dure plus longtemps

que la durée d'une barre. Je vais choisir l'option dans les dates,

parque  

 if(last_time!=lastbar_time)

me semble pus robuste que

if(TickBougie[0].tick_volume == 1)
L'idéal aurais été  de savoir calculer la valeur de la moyenne mobile pour une date donnée


encore merci cdl remy

 
pipoubibou #:

Je viens de vérifier, dans les deux cas il y a bien un problème. Il ne faut pas que la coupure dure plus longtemps

que la durée d'une barre. Je vais choisir l'option dans les dates,

parque   if(last_time!=lastbar_time) me semble pus robuste que   if(TickBougie[0].tick_volume == 1)

encore merci cdl remy

Encore une fois, pas mal. C'est donc à toi de choisir la formule qui te va en tenant compte justement de la logique algorithmique que tu souhaites implémenter au final. Le plus important étant que tu arrives à obtenir le résultat que tu souhaites bien obtenir. Voilà ! Merci.

 
pipoubibou #:

Je viens de vérifier, dans les deux cas il y a bien un problème. Il ne faut pas que la coupure dure plus longtemps

que la durée d'une barre. Je vais choisir l'option dans les dates,

parque  

me semble pus robuste que

L'idéal aurais été  de savoir calculer la valeur de la moyenne mobile pour une date donnée


encore merci cdl remy

Et pour ce qui est du calcul de la moyenne mobile, puisque tu es sur python et non directement sur Mql5, là, il te faudrait te renseigner davantage sur les bibliothèques python dédiées au trading, où tu trouverais des informations précises sur notamment le calcul des indicateurs techniques, en l'occurrence les moyennes mobiles, car c'est de ça qu'il t'est question ici. Merci

 
Petite précision : CopyRates est une fonction assez gourmande, je ne la conseille pas et je vous suggère vraiment de privilégier l’approche avec les dates, beaucoup moins gourmande et plus traditionnelle !