Accueil Trading Systématique Publication

Détecter un Nouvel Événement de Bougie dans MT4 : Guide Pratique

Pièce jointe
10370.zip (734 bytes, Télécharger 2 fois)

Salut les traders ! Aujourd'hui, parlons d'un sujet qui intéresse beaucoup d'entre nous :

Comment détecter la présence d'une nouvelle bougie ?

C'est assez simple, surtout si vous souhaitez détecter une nouvelle bougie dans le timeframe actuel.

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // ajoutez votre code ici
  }
}

Mais qu'en est-il des événements sur d'autres timeframes ? Ce n'est pas trop compliqué, mais il y a quelques restrictions :

MT4 ne supporte pas l'événement onBar, mais vous pouvez mettre les heures de bougie dans un tableau et vérifier ces heures à chaque tick. Si l'heure correspond, vous pouvez exécuter l'événement de nouvelle bougie.
Par exemple, si vous exécutez un backtest sur un timeframe M5, vous pouvez attraper les événements M6, M7, jusqu'à D1.
Pourquoi ne pouvez-vous détecter que des tendances ascendantes ? La réponse réside dans la question suivante : comment générer des données de tick avec MetaTrader ? A1, A2, A3,...

Jusqu'au timeframe D1, c'est plus difficile car la semaine commence à par exemple : dimanche 20h45 (selon le broker) et le début du mois peut commencer au milieu de la semaine... etc.
Je pense que ces informations ne sont pas trop pertinentes, donc je ne les publie pas...

Il y a un sujet à ce propos, mais je pense que beaucoup de gens ne lisent pas les articles et les forums, alors j'ai décidé de publier ce code.

Quelques explications :

Dans la fonction init, vous remplissez le tableau des heures avec les heures de départ :

  curIndex = utils.periodToPeriodIndex(Period());
  times[curIndex] = Time[0];
  for(int i=curIndex+1; i<MAX; i++)
    times[i] = times[curIndex] - MathMod(times[curIndex], utils.periodIndexToPeriod(i) * 60);

Et dans la fonction start, vous vérifiez si suffisamment de temps s'est écoulé, puis vous exécutez l'événement :

  if (times[curIndex] != Time[0]) {
    times[curIndex] = Time[0];
    onBar(Period());
    for(int i=curIndex+1; i<MAX; i++) {
      int period = utils.periodIndexToPeriod(i),
          seconds = period * 60,
          time0 = times[curIndex] - MathMod(times[curIndex], seconds);
      if (times[i] != time0) {
        times[i] = time0;
        onBar(period);
      }
    }
  }


Écrivez votre code dans :

void onTick() { 
}

et

void onBar(int period) {
}

C'est tout les amis.


Update 1.1 : Merci à WHRoeder pour son code clair

Articles connexes

Commentaire (0)