Indicateur Questions diverses - page 5

 
Marco vd Heijden:
Veuillez décrire ce que vous essayez de faire.

Désolé pour la confusion.

J'ai besoin de définir 3'EventSetMillisecondTimer' comme ci-dessous (vous dites que cela ne fonctionne pas...). Existe-t-il une autre méthode, s'il vous plaît ?

EventSetMillisecondTimer( 10   ); // 1st will read in 10   | if won't read try next
EventSetMillisecondTimer( 250  ); // 2nd will read in 250  | if won't read try next
EventSetMillisecondTimer( 1250 ); // 3rd will read in 1250 | if read then stop reading till next PERIOD_M5

La meilleure.

 

Le timer n'est réglé qu'une seule fois dans la fonction OnInit().

Si vous voulez réinitialiser, vous devez d'abord tuer l'ancienne minuterie, ce qui se produit généralement avec la fonction OnDeinit().

Comme je l'ai dit, vous pouvez aussi utiliser un compteur.

Si vous placez du code dans un timer de 10 millisecondes par exemple, le code sera exécuté toutes les 10 millisecondes.

Cela va très probablement geler votre terminal parce que c'est trop rapide.

int counter;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);// 1 second

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- increment counter
   counter++;
//--- comment status on the chart
   Comment(IntegerToString(counter));  
//--- switch timer  
   switch(counter)
     {
      case 60:
         Alert(" 1 Minute ");
         // Do Something...
         break;
      case 300:
         Alert(" 5 Minutes ");
         // Do Something...
         break;
      case 900:
         Alert(" 15 Minutes ");
         // Do Something...
         counter=0;// Reset counter on highest value.
         break;
     }
// end switch timer    
   if(counter>900)
     {
      counter=0;// Safety Mechanism
     }
  }
//+------------------------------------------------------------------+

Notez que la minute n'est déclenchée qu'une seule fois, donc pas toutes les minutes.

Les 5 minutes ne se déclencheront également qu'une seule fois après les cinq premières minutes, donc pas au bout de 10 ou 15 minutes.

Si vous voulez par exemple déclencher toutes les minutes, vous devez ajouter du code pour 60 sec pour 120 sec pour 180 sec et ainsi de suite.

La marque des 15 minutes se déclenchera toutes les 15 minutes car elle met le compteur à zéro.


Quel mécanisme voulez-vous utiliser, quel code voulez-vous déclencher sur les intervalles minutés ?

Qu'est-ce que vous essayez d'obtenir ?
 

void OnTimer()
  {
   static int counter=0;
   static int next1m=60;
   static int next5m=300;
   static int next15m=900;
//--- increment counter
   counter++;
//--- comment status on the chart
   Comment(IntegerToString(counter));  
//--- timer
   if(counter==next1m)
         {
         Alert(" 1 Minute ");
         // Do Something...
         next1m+=60;
         }
   if(counter==next5m)
         {
         Alert(" 5 Minutes ");
         // Do Something...
         next5m+=300;
         }
   if(counter==next15m)
         {
         Alert(" 15 Minutes ");
         // Do Something...
         counter=0;// Reset counter on highest value.
         next1m=60;
         next5m=300;
         }
  }

Bien vu, Marco.

Vous pourriez faire quelque chose comme ceci pour déclencher à chaque intervalle de temps

 

Marco vd Heijden:

Quel mécanisme voulez-vous utiliser, quel code voulez-vous déclencher sur les intervalles de temps ?

Qu'est-ce que vous essayez d'obtenir ?
Merci pour cet excellent commentaire, qui explique beaucoup plus clairement l'opérateur 'switch' et les intervalles de temps.

Encore une fois, excellent commentaire, merci beaucoup.

//---

Maintenant, je dois vous donner des informations sur mon indicateur.
Parce que peut-être je n'ai pas décrit mon problème, (mais votre dernier commentaire m'a aidé de plus en plus)....

...mon indicateur fonctionne ce qui était (/ est) ce que je voulais (/ veut).

L'indicateur fonctionne comme ceci :

déplace automatiquement / montre en avant 'VLINE'(celle que je veux)
montre les 'VLINE' de la semaine précédente (celle que je veux)
pas de croisement des lignes de période (celle que je veux )
mise à jour continue (avec des intervalles) juste une fois dans chaque prochain PERIOD_**'s (celui que je veux)
et bien d'autres choses encore...
Une fois de plus, MERCI SPÉCIAL à Marco et whroeder1 (qui ne m'ont pas seulement aidé mais m'ont aussi beaucoup appris).

Je dois décrire mon problème avec un exemple :

J'ouvre un graphique EURUSD et j'ai attaché mon indicateur au graphique, et il fonctionne parfaitement, comme je le souhaite, il déplace / montre les VLINEs vers l'avant (et même vers l'arrière), je peux changer le PERIOD du TIMEFRAME et les intervalles sont automatiquement adaptés à ce PERIOD (comme je le souhaite).

Où est le problème de mon indicateur ? // Peut-être que ce n'est pas un problème mais il faut un peu plus de temps 'non pertinent' pour mettre à jour.

Si je choisis 'EventSetMillisecondTimer( 10 );' et ensuite je change TIMEFRAME PERIODs à n'importe quel TIMEFRAME PERIODs et presque je ne vois pas (quand cela) charge de nouvelles VLINE's sur le graphique (ce que je veux).

En ce moment, si je change EURUSD en 'autres symboles (comme GBPUSD, etc.)', mon indicateur ne chargera pas toutes les VLINEs. C'est juste un problème (/ pour moi).

Sinon : Si je choisis 'EventSetMillisecondTimer( 1250 );' je ne vois aucun problème de chargement. Il fonctionne parfaitement.
Mais il y a unproblème (/ pour moi), il prend un peu plus de temps 'non pertinent' - quand je change les PERIODs de TIMEFRAME.

Donc, si vous me comprenez si clairement, s'il vous plaît prenez le temps de commenter (et aidez-moi comment puis-je résoudre ce problème) ou vous ne me comprenez pas si clairement ne perdez pas votre temps, s'il vous plaît.

Nousapprécions beaucoup et beaucoup plus vos commentaires - Marco & whroeder1


(NOTE : Je n'utilise pas "opérateur de commutation" - parce que votre commentaire #18 mieux que tout ce qui est je l'améliorer et de travailler sur elle - et il est très utile pour moi)

(L'anglais n'est pas ma langue maternelle)

 

Keith Watford:

Bien joué Marco.

Vous pourriez faire quelque chose comme ceci pour déclencher à chaque intervalle de temps

Bien joué aussi Keith:)

Vraiment, cela m'a beaucoup aidé, je vais l'utiliser dans mon prochain indicateur.

Je vous souhaite bonne chance.

 

Je ne sais pas ce qu'il en est pour les autres, mais je trouve votre mélange de polices, de couleurs, de gras et d'italique, etc. distrayant et ennuyeux. En fait, je n'ai pas pris la peine de lire ce message.

Max Enrik:
Merci pour cet excellent commentaire, qui explique beaucoup plus clairement l'opérateur 'switch' et les intervalles de temps.

Encore une fois, excellent commentaire, merci beaucoup.

//---

Maintenant, je dois vous donner des informations sur mon indicateur.
Parce que peut-être je n'ai pas décrit ma préoccupation, (mais votre dernier commentaire m'a aidé de plus en plus)....

...mon indicateur fonctionne ce qui était (/ est) ce que je voulais (/ veut).

L'indicateur fonctionne comme ceci :

déplace automatiquement / montre en avant 'VLINE'(celle que je veux)
montre les 'VLINE' de la semaine précédente (celle que je veux)
pas de croisement des lignes de période (celle que je veux )
mise à jour continue (avec des intervalles) juste une fois dans chaque prochain PERIOD_**'s (celui que je veux)
et bien d'autres choses encore...
Une fois de plus, MERCI SPÉCIAL à Marco et whroeder1 (qui ne m'ont pas seulement aidé mais m'ont aussi beaucoup appris).

Je dois décrire mon problème avec un exemple :

J'ouvre un graphique EURUSD et j'ai attaché mon indicateur au graphique, et il fonctionne parfaitement, comme je le souhaite, il déplace / montre les VLINEs vers l'avant (et même vers l'arrière), je peux changer le PERIOD du TIMEFRAME et les intervalles sont automatiquement adaptés à ce PERIOD (comme je le souhaite).

Où est le problème de mon indicateur ? // Peut-être que ce n'est pas un problème mais il faut un peu plus de temps 'non pertinent' pour mettre à jour.

Si je choisis 'EventSetMillisecondTimer( 10 );' et ensuite je change TIMEFRAME PERIODs à n'importe quel TIMEFRAME PERIODs et presque je ne vois pas (quand cela) charge de nouvelles VLINE's sur le graphique (ce que je veux).

En ce moment, si je change EURUSD en 'autres symboles (comme GBPUSD, etc.)', mon indicateur ne chargera pas toutes les VLINEs. C'est juste un problème (/ pour moi).

Sinon : Si je choisis 'EventSetMillisecondTimer( 1250 );' je ne vois aucun problème de chargement. Il fonctionne parfaitement.
Mais il y a unproblème (/ pour moi), il prend un peu plus de temps 'non pertinent' - quand je change les PERIODs de TIMEFRAME.

Donc, si vous me comprenez si clairement, s'il vous plaît prenez le temps de commenter (et aidez-moi comment puis-je résoudre ce problème) ou vous ne me comprenez pas si clairement ne perdez pas votre temps, s'il vous plaît.

Nousapprécions beaucoup et beaucoup plus vos commentaires - Marco & whroeder1


(NOTE : Je n'utilise pas "opérateur de commutation" - parce que votre commentaire #18 mieux que tout ce qui est je l'améliorer et de travailler sur elle - et il est très utile pour moi)

(L'anglais n'est pas ma langue maternelle)

 

S'il s'agit de changer de cadre temporel, le timer n'est pas une bonne option car il est détruit lors du changement de cadre.

Vous pouvez créer vos lignes dans la fonction OnInit(), et les mettre à jour dans les fonctions OnTick() ou OnTimer().

Voici un exemple :

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
//--- playsound
   PlaySound("alert2.wav");  
//--- create moving timeline
   ObjectCreate(0,"Time",OBJ_VLINE,0,TimeCurrent(),0);  
//--- detect period
   switch(Period())
     {
      case PERIOD_M1:
        MessageBox("Switched to 1 Minute Frame");
        //Do Something...
        ObjectCreate(0,"1-Minute",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_M5:
        MessageBox("Switched to 5 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"5-Minutes",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_M15:
        MessageBox("Switched to 15 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"15-Minutes",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_M30:
        MessageBox("Switched to 30 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"30-Minutes",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_H1:
        MessageBox("Switched to 1 Hour Frame");
        //Do Something...
        ObjectCreate(0,"1-Hour",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_H4:
        MessageBox("Switched to 4 Hour Frame");
        //Do Something...
        ObjectCreate(0,"4-Hour",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_D1:
        MessageBox("Switched to Daily Frame");
        //Do Something...
        ObjectCreate(0,"Daily",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_W1:
        MessageBox("Switched to Weekly Frame");
        //Do Something...
        ObjectCreate(0,"Weekly",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_MN1:
        MessageBox("Switched to Monthly Frame");
        //Do Something...
        ObjectCreate(0,"Monthly",OBJ_VLINE,0,Time[0],0);
         break;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
//--- delete objects
   ObjectsDeleteAll(0,0,-1);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   ObjectMove(0,"Time",0,TimeCurrent(),0);// Update timeline
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   ObjectMove(0,"Time",0,TimeCurrent(),0);// Update timeline
  }
//+------------------------------------------------------------------+
Notez également l'utilisation de la fonction ObjectsDeleteAll() dans la fonction OnDeint(). Cela permet de s'assurer que tout est supprimé avant d'être recréé dans le nouveau cadre.
 

De plus, si vous voulez mettre à jour les lignes chaque fois qu'une nouvelle bougie apparaît, vous pouvez combiner l'exemple de la page précédente avec le dernier pour obtenir ceci :

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
//--- playsound
   PlaySound("alert2.wav");
//--- load open times
   M1=iTime(Symbol(),PERIOD_M1,0);
   M5=iTime(Symbol(),PERIOD_M5,0);
   M15=iTime(Symbol(),PERIOD_M15,0);
   M30=iTime(Symbol(),PERIOD_M30,0);
   H1=iTime(Symbol(),PERIOD_H1,0);
   H4=iTime(Symbol(),PERIOD_H4,0);
   D1=iTime(Symbol(),PERIOD_D1,0);
   W1=iTime(Symbol(),PERIOD_W1,0);
   MN1=iTime(Symbol(),PERIOD_MN1,0);  
//--- create moving timeline
   ObjectCreate(0,"Time",OBJ_VLINE,0,TimeCurrent(),0);  
//--- detect period
   switch(Period())
     {
      case PERIOD_M1:
        MessageBox("Switched to 1 Minute Frame");
        //Do Something...
        ObjectCreate(0,"1-Minute",OBJ_VLINE,0,Time[0],0);
        M1=Time[0];// store current time
         break;
      case PERIOD_M5:
        MessageBox("Switched to 5 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"5-Minutes",OBJ_VLINE,0,Time[0],0);
        M5=Time[0];// store current time
         break;
      case PERIOD_M15:
        MessageBox("Switched to 15 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"15-Minutes",OBJ_VLINE,0,Time[0],0);
        M15=Time[0];// store current time
         break;
      case PERIOD_M30:
        MessageBox("Switched to 30 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"30-Minutes",OBJ_VLINE,0,Time[0],0);
        M30=Time[0];// store current time
         break;
      case PERIOD_H1:
        MessageBox("Switched to 1 Hour Frame");
        //Do Something...
        ObjectCreate(0,"1-Hour",OBJ_VLINE,0,Time[0],0);
        H1=Time[0];// store current time
         break;
      case PERIOD_H4:
        MessageBox("Switched to 4 Hour Frame");
        //Do Something...
        ObjectCreate(0,"4-Hour",OBJ_VLINE,0,Time[0],0);
        H4=Time[0];// store current time
         break;
      case PERIOD_D1:
        MessageBox("Switched to Daily Frame");
        //Do Something...
        ObjectCreate(0,"Daily",OBJ_VLINE,0,Time[0],0);
        D1=Time[0];// store current time
         break;
      case PERIOD_W1:
        MessageBox("Switched to Weekly Frame");
        //Do Something...
        ObjectCreate(0,"Weekly",OBJ_VLINE,0,Time[0],0);
        W1=Time[0];// store current time
         break;
      case PERIOD_MN1:
        MessageBox("Switched to Monthly Frame");
        //Do Something...
        ObjectCreate(0,"Monthly",OBJ_VLINE,0,Time[0],0);
        MN1=Time[0];// store current time
         break;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
//--- delete objects
   ObjectsDeleteAll(0,0,-1);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- update timeline
   ObjectMove(0,"Time",0,TimeCurrent(),0);
//--- check for new candles
   if(M1!=iTime(Symbol(),PERIOD_M1,0))
    {
     Alert("New candle on M1");
     ObjectMove(0,"1-Minute",0,iTime(Symbol(),PERIOD_M1,0),0); // Move line
     M1=iTime(Symbol(),PERIOD_M1,0);// Overwrite old with new value
    }  
   if(M5!=iTime(Symbol(),PERIOD_M5,0))
    {
     Alert("New candle on M5");
     M1=iTime(Symbol(),PERIOD_M5,0);// Overwrite old with new value
    }      
   if(M15!=iTime(Symbol(),PERIOD_M15,0))
    {
     Alert("New candle on M15");
     M15=iTime(Symbol(),PERIOD_M15,0);// Overwrite old with new value
    }
   if(M30!=iTime(Symbol(),PERIOD_M30,0))
    {
     Alert("New candle on M30");
     M30=iTime(Symbol(),PERIOD_M30,0);// Overwrite old with new value
    }
    // and so on to MN1...        
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   ObjectMove(0,"Time",0,TimeCurrent(),0);// Update timeline
  }
//+------------------------------------------------------------------+
S'il y a d'autres problèmes, veuillez montrer du code.
 
Keith Watford:

Je ne sais pas ce qu'il en est pour les autres, mais je trouve votre mélange de polices, de couleurs, de gras et d'italique, etc. distrayant et ennuyeux. En fait, je ne me suis pas donné la peine de lire ce message.

On m'a dit de ne pas perdre mon temps.
 

Max Enrik:

Keith Watford:

Je ne sais pas ce qu'il en est pour les autres, mais je trouve votre mélange de polices, de couleurs, de gras et d'italique, etc. distrayant et ennuyeux. En fait, je n'ai pas pris la peine de lire ce message.


On m'a dit de ne pas perdre mon temps.
Pourquoi avez-vous juste cité mon message sans aucun commentaire ?