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

 
FMIC:

Il n'y a pas de OnStart() dans les EA mais je comprends ce que vous voulez dire. Cependant, l'OP même en réponse à vos commentaires a dit et je cite :

Oui, je voulais dire OnTick(). Vous attachez encore trop d'importance à "pendant l'exécution de l'EA". Cela ne signifie pas nécessairement, ou même le plus plausiblement, "pendant que l'EA exécute son OnTick()", plutôt que "pendant que l'EA est attaché à un graphique, c'est-à-dire pendant toute sa durée de vie".

Nous avons besoin de plus d'informations de la part de paranoyakX.

 
jjc:

Oui, je voulais dire OnTick(). Vous attachez encore trop d'importance à "pendant l'exécution de l'EA". Cela ne signifie pas nécessairement, ou même le plus plausiblement, "pendant que l'EA exécute son OnTick()", plutôt que "pendant que l'EA est attaché à un graphique, c'est-à-dire pendant toute sa durée de vie".

Nous avons besoin de plus d'informations de la part de paranoyakX.

Salut les gars,

Laissez-moi clarifier ceci. Mon code recherche un modèle très basique sur les barres précédentes et décidera si un ordre sera ouvert mais l'ouverture d'un nouvel ordre ne sera vérifiée que lorsqu'une nouvelle barre apparaîtra. Ce que je veux dire, c'est que j'attends la clôture de la dernière barre, puis je vérifie le modèle et si c'est bon, j'ouvre l'ordre. Donc l'ouverture d'un ordre se produit à l'ouverture de la nouvelle barre. Comme @jjc l'a dit, je garde les informations de base du modèle dans des variables globales, comme quand mon modèle a commencé et s'est terminé, quelle est la valeur la plus élevée et la plus basse, etc.

D'une manière ou d'une autre, si je dois réexécuter l'EA, je veux retrouver ces informations de base (barre de début et de fin de pattern, prix les plus hauts et les plus bas, etc) et remplir à nouveau mes variables globales, c'est pourquoi j'en ai besoin. J'utiliserai les informations de début et de fin pour décider quand fermer mon ordre. Il suffit donc qu'une nouvelle barre n'apparaisse pas à OnInit, pendant l'exécution de l'EA, ce n'est pas un problème.

 
jjc:

Oui, je voulais dire OnTick(). Vous attachez encore trop d'importance à "pendant l'exécution de l'EA". Cela ne signifie pas nécessairement, ou même le plus plausiblement, "pendant que l'EA exécute son OnTick()", plutôt que "pendant que l'EA est attaché à un graphique, c'est-à-dire pendant toute sa durée de vie".

Nous avons besoin de plus d'informations de la part de paranoyakX.

Oui, vous avez raison ! D'après les dernières informations fournies par l'OP, il est certain qu'il exécute tout dans le OnInit() et non dans le OnTick(). J'ai supposé à tort que l'OP faisait les choses un peu plus correctement. Il ne m'est jamais venu à l'esprit que toute sa logique se trouvait dans le OnInit().
 
paranoyakX:

Salut les gars,

Laissez-moi clarifier ceci. Mon code recherche un modèle très basique sur les barres précédentes et décidera si un ordre sera ouvert mais l'ouverture d'un nouvel ordre ne sera vérifiée que lorsqu'une nouvelle barre apparaîtra. Ce que je veux dire, c'est que j'attends la clôture de la dernière barre, puis je vérifie le modèle et si c'est bon, j'ouvre l'ordre. Ainsi, l'ouverture d'un ordre se produit à l'ouverture de la nouvelle barre. Comme @jjc l'a dit, je conserve les informations de base du modèle dans les variables globales, comme le moment où mon modèle a commencé et s'est terminé, quelle est la valeur la plus élevée et la plus basse, etc.

D'une manière ou d'une autre, si je dois réexécuter l'EA, je veux retrouver ces informations de base (barre de début et de fin de pattern, prix les plus hauts et les plus bas, etc) et remplir à nouveau mes variables globales, c'est pourquoi j'en ai besoin. J'utiliserai les informations de début et de fin pour décider quand fermer mon ordre. Il suffit donc qu'une nouvelle barre n'apparaisse pas à OnInit, pendant l'exécution de l'EA, ce n'est pas un problème.

Vous ne devriez PAS faire tout cela dans le OnInit(). Vous devriez faire toute cette logique (y compris la récupération) dans le OnTick(). C'est important! Le faire dans OnInit() vous causera d'autres problèmes que vous n'avez pas prévus et laissera votre EA dans un état d'"initialisation" pendant que vous faites toute cette logique. Donc, faites-le bien ! Ne faites que votre initialisation (comme les variables, les vérifications des paramètres externes, etc.) dans OnInit() et tout le reste dans OnTick().
 
FMIC:
Vous ne devriez PAS faire tout cela dans le OnInit(). Vous devriez faire toute cette logique (y compris la récupération) dans le OnTick(). C'est important ! Le faire dans OnInit() vous causera d'autres problèmes que vous n'avez pas prévus et laissera votre EA dans un état d'"initialisation" pendant que vous faites toute cette logique. Donc, faites-le bien ! Ne faites que votre initialisation (comme les variables, les vérifications des paramètres externes, etc.) dans OnInit() et tout le reste dans OnTick().

Non non non ! Je n'ai pas pu m'expliquer, désolé, j'exécute tout dans le OnTick, mais je vérifie simplement si ce tick appartient à une nouvelle barre et je fais mon personnel. Ce que j'exécute dans OnInit, c'est de retrouver les ordres et le modèle que j'ai calculé avant, de le recalculer. J'ai dit que ce que j'exécute à OnInit, c'est de trouver le modèle auquel appartient l'ordre actuellement ouvert.

J'espère que je peux expliquer.

 
paranoyakX:

Non non non ! Je n'ai pas pu m'expliquer, désolé, j'exécute tout dans le OnTick, mais je vérifie simplement si ce tick appartient à une nouvelle barre et je fais mon personnel. Ce que j'exécute dans OnInit, c'est de retrouver les ordres et le modèle que j'ai calculé avant, de le recalculer. J'ai dit que ce que j'exécute à OnInit, c'est de trouver le modèle auquel appartient l'ordre actuellement ouvert.

J'espère que je peux expliquer.

Oui, j'ai compris cela dans votre post ! Ce que je dis, c'est qu'il ne faut pas faire ça dans le OnInit(). Vous devriez trouver vos ordres et modèles et tout ce calcul dans le OnTick().

Définissez juste une variable statique locale dans OnTick() et faites toutes vos vérifications et définitions de modèles, puis mettez la variable à false.

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

Oui, j'ai compris cela dans votre post ! Ce que je veux dire, c'est qu'il ne faut pas faire ça dans le OnInit(). Vous devriez trouver vos ordres et vos modèles et tout ce calcul dans le OnTick().

Définissez juste une variable statique locale dans OnTick() et faites toutes vos vérifications et définitions de modèles, puis mettez la variable à false.

Désolé, je vous ai mal compris. Pourquoi ne pas le faire dans OnInit ? N'est-ce pas plus pratique ? Si je fais cela, pour chaque tick après le premier, je vais exécuter une instruction if qui ne sera pas toujours vraie. Je pense que c'est une charge inutile pour le code.

La raison d'être de OnInit n'est-elle pas d'initialiser quelque chose comme mes variables globales ?

 
paranoyakX:

J'espère pouvoir vous expliquer.

Je pense que nous avons besoin de voir du code pour être certains de ce dont vous parlez. Par exemple, il n'est pas clair si vous recherchez le modèle historique qui a généré un trade ouvert existant parce que (a) cela vous indique comment gérer le trade ouvert, où/quand le fermer, etc. ou (b) simplement pour dessiner quelques marqueurs sur le graphique expliquant à vous-même pourquoi le trade existant a été ouvert.

Je suis généralement d'accord avec le FMIC pour dire que vous devriez essayer d'en faire le plus possible dans OnTick(), et de garder le moins d'état possible dans les variables globales.

 
paranoyakX:

Désolé alors, je vous ai mal compris avant. Pourquoi je ne fais pas ce OnInit ? N'est-ce pas plus pratique ? Si je fais cela, pour chaque tick après le premier, je vais exécuter une instruction if qui ne sera pas toujours vraie. Je pense que c'est une charge inutile pour le code.

La raison d'être de OnInit n'est-elle pas d'initialiser quelque chose comme mes variables globales ?

Non, il n'est pas correct de faire cela dans le OnInit() parce que vous allez retarder l'exécution de l'initialisation et non, les variables statiques maintiendront leur état donc vous ne ferez les vérifications qu'une seule fois, pas à chaque OnTick(). Le "if( FirstOnTick )" est très rapide et a très peu de charge, surtout en comparaison avec tout votre autre code qui s'exécute dans le OnTick().
 

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 motifs etc. est juste un exemple. La raison pour laquelle j'ai ouvert ce fil de discussion est la fonction DetectExistingPattern().

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


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



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};