Analyse des barres à l'envers dans l'EA - page 3

 
paranoyakX:

Merci pour les conseils, voici une version très simple de mon code, ce n'est pas mon vrai code mais j'espère que ce sera plus clair.

Comme je l'ai dit, ce n'est pas le vrai code, la recherche de modèle etc. est juste un exemple. La raison pour laquelle j'ai ouvert ce fil de discussion est lafonction DetectExistingPattern().

Je vous ai déjà donné un exemple de code sur la façon d'exécuter le code lors de la première exécution de OnTick(), alors maintenant mettez à jour votre post de code en conséquence afin que votre DetectExistingPattern() s'exécute dans le premier appel de OnTick() et non dans OnInit().

De plus, vous ne pouvez pas utiliser "Bars" pour détecter une nouvelle barre. C'est incorrect. Vous devez utiliser soit "Time[0]" soit "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Voici un exemple :

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

Je vous ai déjà donné un exemple de code sur la façon d'exécuter le code lors de la première exécution de OnTick(), alors mettez à jour votre post de code en conséquence afin que votre DetectExistingPattern() s'exécute lors du premier appel de OnTick() et non dans OnInit().

De plus, vous ne pouvez pas utiliser "Bars" pour détecter une nouvelle barre. C'est incorrect. Vous devez utiliser soit "Time[0]" soit "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Voici un exemple :

Merci @FMIC, j'ai ajouté le code simple car @jjc l'a demandé. D'ailleurs, j'ai appris à utiliser les barres à partir du moment où je me souviens que tout le monde écrivait de cette façon, alors je l'ai fait. Pourquoi est-ce mauvais ? Est-ce que cela peut fonctionner de manière incorrecte ?

ps : J'utilise metatrader 4, donc c'est bien mql4 ?

 
paranoyakX:

Merci @FMIC, j'ai ajouté le code simple parce que @jjc l'a demandé. D'ailleurs, j'ai appris à utiliser les barres à partir du moment où je me souviens que tout le monde écrivait de cette façon, alors je l'ai fait. Pourquoi est-ce mauvais ? Est-ce que cela peut fonctionner de manière incorrecte ?

ps : J'utilise metatrader 4, donc c'est bien mql4 ?

Non ! Sur le forum, vous trouverez que de nombreux utilisateurs ont montré que la méthode "Bars" est très ancienne et peu fiable car le nombre de barres peut être modifié par les "Options" pour les graphiques ou il peut être constant lorsque le nombre maximum de barres par graphique a été atteint. C'est donc une erreur de l'utiliser. Utilisez plutôt "Time[0]" ou, si vous voulez qu'il soit également compatible avec MQL5, utilisez "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Veuillez voir mon exemple.
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

wow je ne savais pas que je vais utiliser votre code merci beaucoup.
 
Les barres ne sont pas fiables (un rafraîchissement/une reconnexion peut changer le nombre de barres sur le graphique) Le volume n'est pas fiable (ticks manqués) Utilisez toujours le temps. Nouvelle bougie - MQL4 forum
 
paranoyakX:

Comme je l'ai dit, ce n'est pas le vrai code, la recherche de motifs etc. est juste un exemple. La raison pour laquelle j'ai ouvert ce fil de discussion est lafonction DetectExistingPattern().

Pour en revenir à votre question initiale... Dans cet exemple, une option serait de modifier votre fonction CheckTrendPattern() de façon à ce qu'on puisse lui demander de commencer à une barre spécifique. Au lieu d'utiliser la plage fixe des barres 1 à 10, vous utilisez plutôt un décalage de 1 à 10 à partir d'un point de départ spécifié.

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

Lorsqu'il n'y a pas d'ordre existant et que vous voulez vérifier si le modèle est actuellement respecté, vous utilisez alors CheckTrendPattern(0) au lieu de CheckTrendPattern().

Au démarrage, si vous avez un ordre existant, vous pouvez rechercher le modèle qui l'a déclenché comme suit. C'est la même suggestion que celle que j'ai faite au début : vous obtenez l'indice de la barre qui est équivalent à l'heure d'ouverture de l'ordre existant, et commencez à regarder en arrière à partir de là.

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);
CheckTrendPattern(BarShiftOfOrderOpen);

Cependant, comme le dit le CIMF, il est préférable d'effectuer cette vérification lors du premier appel à OnTick() plutôt que dans OnInit(). Mes propres raisons pour suggérer cela n'ont rien à voir avec le fait de "retarder l'initialisation". Je m'inquiéterais plutôt du fait que, lorsque MT4 redémarre avec l'EA déjà attaché à un graphique, vous n'avez pas encore une liste d'ordres du courtier ou un historique des barres mis à jour de manière 100% fiable.

Une autre considération que vous pourriez avoir à l'esprit est le scénario suivant, qui se déroule pendant la période couverte par une seule barre :

  • Vous trouvez un modèle et placez une transaction
  • Votre transaction ouverte est fermée, par exemple parce qu'elle atteint un stop-loss.
  • MT4 se ferme (délibérément ou non).
  • MT4 redémarre
  • L'EA retrouve le modèle en cours et passe une autre transaction dans la même barre, car il n'y a pas de transaction ouverte.

Pour éviter cela, vous pouvez vérifier les ordres fermés ainsi que les ordres ouverts.

 
@jjc, vos suggestions sont très bonnes. Merci de partager votre expérience.
jjc:

Pour en revenir à votre question initiale... Dans cet exemple, vous pouvez modifier la fonction CheckTrendPattern() pour lui demander de commencer à une barre spécifique. Au lieu d'utiliser la plage fixe des barres 1 à 10, vous utilisez plutôt un décalage de 1 à 10 à partir d'un point de départ spécifié.

Lorsqu'il n'y a pas d'ordre existant et que vous souhaitez vérifier si le modèle est actuellement respecté, vous utilisez alors CheckTrendPattern(0) au lieu de CheckTrendPattern().

Mon vrai modèle n'est pas celui-ci, donc il n'y a pas de nombres fixes (comme 10 par exemple), c'est dynamique, mais ma méthode de vérification du modèle est différente, donc je n'ai pas pu m'en souvenir et cela m'ennuie vraiment, car j'ai écrit un code similaire pour retrouver le modèle. Le problème est que lorsque l'EA est en cours d'exécution, je vérifie simplement la dernière barre si mon modèle continue et si c'est le cas, je ne fais rien, et lorsque le modèle est cassé, j'ouvre un ordre. Je ne peux donc pas utiliser ce code pour retrouver le modèle car cette fois, je dois revenir en arrière sur les barres et non en avant. Je ne voulais pas non plus rechercher le motif en arrière car, dans ce cas, je vérifierais les mêmes barres encore et encore. Je m'inquiétais juste du problème de performance, mais comme je vois que ce ne sera pas un problème, je pense donc changer ma méthode de recherche de modèle afin de pouvoir l'utiliser à la fois au démarrage et en cours d'exécution, comme vous l'avez dit. De plus, comme l'a dit @FMIC, je devrais peut-être faire de cette partie un indicateur (que je n'ai pas beaucoup écrit) pour ne pas avoir de problème à trouver et à retrouver.
jjc:

Au démarrage, si vous avez un ordre existant, vous pouvez rechercher le modèle qui l'a déclenché comme suit. C'est la même suggestion que j'ai faite au début : vous obtenez l'indice de la barre qui est équivalent au temps d'ouverture de l'ordre existant, et commencez à regarder en arrière à partir de là. Cependant, comme le dit le FMIC, il est préférable de faire cette vérification dans le premier appel à OnTick() plutôt que dans OnInit(). Mes propres raisons pour suggérer cela n'ont rien à voir avec le fait de "retarder l'initialisation". Je m'inquiéterais plutôt du fait que, lorsque MT4 redémarre avec l'EA déjà attaché à un graphique, vous n'avez pas encore une liste d'ordres du courtier ou un historique des barres mis à jour de manière 100% fiable.

Une autre considération que vous pourriez avoir à l'esprit est le scénario suivant, qui se déroule pendant la période couverte par une seule barre :

  • Vous trouvez un modèle et placez une transaction
  • Votre transaction ouverte est fermée, par exemple parce qu'elle atteint un stop-loss.
  • MT4 se ferme (délibérément ou non).
  • MT4 redémarre
  • L'EA retrouve le modèle en cours et ouvre une nouvelle position dans la même barre, car il n'y a pas de position ouverte.

Maintenant, je comprends mieux pourquoi je devrais le faire dans OnInit, la fiabilité est le point le plus important bien sûr et je n'ai pas pensé à votre avertissement de considération. Cette partie est vraiment importante, je pourrais ouvrir des ordres redondants, peut-être rare mais possible. Je dois gérer cela d'une certaine manière. vraiment merci beaucoup.

@WHRoeder votre nouveau contrôle de vérification des barres est si simple et si beau. J'ai ajouté votre méthode à mon code, merci.

 

Bonjour à tous,

Comme @FMIC l'a conseillé, j'ai écrit un indicateur qui trouve mon modèle, donne un signal et quelques données supplémentaires qui seront utilisées pour mes ordres (je pourrais ouvrir plus d'un ordre à des prix différents). Maintenant je veux l'utiliser dans mon EA mais j'ai une question, j'ai besoin de votre expérience en fait. Quand je reçois un signal de mon indicateur, je vais ouvrir un ordre ou placer un ordre (limite de vente ou limite d'achat etc.) si mon mt4 se plante pour une raison quelconque quand je le rouvre, comment puis-je trouver l'ordre ouvert qui appartient à quel signal dans mon indicateur. est-il correct d'utiliser le décalage de barre pour cela ? comme nous l'avons déjà dit, je peux trouver le temps de création de l'ordre, puis trouver le décalage de barre et dois-je essayer d'obtenir la valeur de l'indicateur en utilisant ce décalage ? Comment puis-je faire correspondre cet ordre et le décalage de l'indicateur?

Merci.

 
paranoyakX: Bonjour à tous, comme @FMIC l'a conseillé, j'ai écrit un indicateur qui trouve mon modèle, donne un signal et quelques données supplémentaires qui seront utilisées pour mes ordres (je pourrais ouvrir plus d'un ordre à des prix différents). Maintenant je veux l'utiliser dans mon EA mais j'ai une question, j'ai besoin de votre expérience en fait. Quand je reçois un signal de mon indicateur, je vais ouvrir un ordre ou placer un ordre (limite de vente ou limite d'achat etc.) si mon mt4 se plante pour une raison quelconque quand je le rouvre, comment puis-je trouver l'ordre ouvert qui appartient à quel signal dans mon indicateur. est-il correct d'utiliser le décalage de barre pour cela ? comme nous l'avons déjà dit, je peux trouver le temps de création de l'ordre, puis trouver le décalage de barre et dois-je essayer d'obtenir la valeur de l'indicateur en utilisant ce décalage ? Comment puis-je faire correspondre cet ordre et le décalage de l'indicateur ?
Oui, vous pouvez utiliser iBarShift(), tout comme jjc vous l'a expliqué dans un post précédent pour ensuite référencer les données de votre indicateur via la fonction iCustom().
 
FMIC:
Oui, vous pouvez utiliser iBarShift(), comme jjc vous l'a expliqué dans un post précédent pour ensuite référencer les données de votre indicateur via la fonction iCustom().
Merci beaucoup @FMIC, donc l'utilisation de shift est une bonne solution alors. Faire de mon modèle un indicateur est un très bon conseil. Je vais changer tout mon code bien sûr mais il sera plus cohérent.