Discussion de l'article "Création d’un Expert Advisor, qui trade sur un certain nombre d’instruments" - page 5

 
Interesting:
By Tnew[1] Invalid array range - it seems to be a range overrun. N'oubliez pas que la numérotation des éléments d'un tableau commence au début de la plage du tableau.

no access to edit message from 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Replace:8.Pourquoi Exp_TEMA.mq5, lors d'un test, ouvre des trades à l'intérieur d'une barre ? par

8.Pourquoi Exp_TEMA.mq5, lors d'un test, ouvre plusieurs trades dans une barre ?

 
ias:
pas d'accès pour éditer le message du 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Les messages ne peuvent être modifiés que dans les 3 jours suivant leur publication.

[Supprimé]  

ias:

8) Pourquoi Exp_TEMA.mq5, lors des tests, ouvre-t-il plusieurs transactions dans une même barre ?

Il serait logique de supposer qu'il n'y a pas de vérification de la présence de positions précédemment ouvertes et de fixer des ordres....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

Intéressant:
Il serait logique de supposer qu'il n'y a pas de vérification des positions précédemment ouvertes et de définir des ordres en attente....

Les ordres en attente ne sont pas utilisés dans Exp_TEMA.mq5. Les positions précédemment ouvertes sont vérifiées :

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Peut-être que quelque chose ne va pas, dans :

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Déclaration de variables pour stocker les tailles des tableaux de variables
   static int Size_ = 0;
   
   //----+ Redimensionnement des tableaux de variables
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ) : Erreur !!! Échec du redimensionnement des tableaux de variables !!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ) : Code d'erreur ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

ou dans :

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Contrôle de l'interdiction du commerce
   if (!Trade)return(true);
   
   //----+ Déclarer une variable pour stocker la taille totale des tableaux de variables
   static int Size_ = 0;
   
   //----+ Déclarer un tableau pour stocker les poignées d'indicateurs en tant que variable statique
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Initialisation 
   if (Number + 1 > Size_) // Entrée dans le bloc d'initialisation uniquement lors du premier démarrage
    {
     Size_ = Number + 1; // L'accès au bloc est fermé pour ce numéro
     
     //---- Redimensionnement des tableaux de variables
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Détermination du nombre minimum de barres suffisant pour le calcul 
     MinBars[Number] = 3 * period;
     
     //---- Mise à zéro préliminaire des cellules du tableau
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Utiliser le tableau comme une série temporelle
     ArraySetAsSeries(TEMA, true);
     
     //----+ Obtenir la poignée de l'indicateur
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Vérification de la suffisance du nombre de barres pour le calcul 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Recevoir des signaux de trading 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Entrée dans le bloc en cas de changement de barre ou d'échec de la copie de données
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ A l'aide des poignées de l'indicateur, copier les valeurs des paramètres de l'indicateur
                   // tampons dans un tableau statique spécialement préparé
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // puisque les données ne sont pas reçues, il faut renvoyer 
                                 // dans ce bloc de réception de signaux de trading sur le prochain tick !
       return(false); // quitter la fonction TradeSignalCounter() sans recevoir de signaux de transaction
      }
      
     //---- Toutes les opérations de copie à partir de la mémoire tampon de l'indicateur ont été effectuées avec succès.
     Recount[Number] = false; // il est possible de ne pas revenir à ce bloc jusqu'au prochain changement de barre
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Définition des signaux d'entrée
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Définition des signaux de sortie
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

Transactions multiples dans une barre lors du test de Exp_TEMA.mq5 sur EURUSD, période D1

[Supprimé]  
ias, il vaut mieux s'adresser à l'auteur de l'article....
 
ias:

Pourquoi Exp_TEMA.mq5, lorsqu'il est testé, ouvre-t-il des transactions à l'intérieur de la barre ? sur

Pourquoi Exp_TEMA.mq5, lors des tests, ouvre-t-il plusieurs transactions dans une barre ?

Le fait est que dans le contexte de cet article, la tâche consistait à mettre en œuvre un Expert Advisor multidevises simple sans encombrer l'idée principale avec des détails mineurs qui interfèrent avec la compréhension de l'essence. Et chacun a sa propre façon de remplir les détails. Dans votre cas, tout est résolu de manière élémentaire. Les variables des signaux de trading sont utilisées comme entrées pour les fonctions de trading et sont liées par le lien, et ces variables sont réinitialisées après la transaction au sein des fonctions de trading.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
Le fait est que dans le contexte de cet article, l'objectif était de mettre en œuvre un Expert Advisor multidevises simple sans encombrer l'idée principale avec des détails mineurs qui interfèrent avec la compréhension de l'essence. Et chacun a sa propre façon de remplir les détails. Dans votre cas, tout est résolu de manière élémentaire. Les variables des signaux de trading servent d'entrée aux fonctions de trading et sont liées par le lien, et ces variables sont réinitialisées après l'exécution d'une transaction dans les fonctions de trading.
Veuillez me montrer comment le faire sur l'exemple de votre Expert Advisor Exp_TEMA.mq5.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

À mon avis, l'apprentissage et la compréhension d'un langage de programmation consistent à résoudre de petites tâches consistant à réorganiser le code en fonction de ses propres besoins. Sinon, pourquoi avez-vous besoin de ce site et de ces articles sur la programmation ? Pour démontrer les capacités des auteurs des articles ? Ceux qui ne veulent pas comprendre par eux-mêmes peuvent utiliser la ressource https://www.mql5.com/ru/job
Par exemple, dans MQL4, j'ai mis en œuvre cette approche dans sa forme la plus simple comme ceci https://www.mql5.com/fr/articles/1516. Pour MQL5, rien ne change et tout se fait de la même manière.

.

 
GODZILLA:

J'ai beaucoup de respect pour l'auteur de l'article "Creating an Expert Advisor that trades on different instruments".
1.Le code de l'Expert Advisor Exp_TEMA.mq5 présenté dans l'article ouvre plusieurs trades dans une barre pendant les tests,
comme indiqué précédemment sur ce sujet. Ce fait confirme la présence d'un code incorrect ou d'un bug dans l'Expert Advisor, que de nombreux visiteurs du site sont intéressés à éliminer.
2.La réponse de Roche sur le sujet "Expert Advisors:Multicast" : "En outre, la fonction de détermination d'une nouvelle barre peut être mise en œuvre sans utiliser la fonction de copie de temps" - confirme également la possibilité d'une écriture plus rationnelle de la fonction IsNewBar() dans le Conseiller Expert.
J'aimerais voir comment l'auteur éliminera professionnellement ces défauts, car tout le monde peut faire des erreurs, et seuls les professionnels peuvent les corriger correctement.
 
ias:

Si vous regardez de près les systèmes de trading présentés dans l'article, vous pouvez conclure qu'il s'agit de systèmes de renversement. Le stoploss dans ces systèmes joue un rôle secondaire et est placé à une distance très décente de l'entrée, comptée en plusieurs bougies au moins. Le professionnalisme dans la présentation du matériel consiste à développer le sujet sous la forme la plus simple possible, sans l'encombrer de gadgets supplémentaires, et non sur la base du public qui ne veut pas penser par lui-même. Tout manuel est toujours imparfait par rapport à l'idéal. Et cela est considéré comme acceptable et normal. À l'avenir, il y aura un tel ordre de présentation détaillée de ce détail de la construction des systèmes de négociation, il y aura un examen détaillé de la mise en œuvre, qui n'est pas non plus si simple.
En ce qui concerne la copie de temps, je peux dire sans hésiter que je n'ai pas vu de différence significative dans l'écriture plus rationnelle de la fonction IsNewBar() dans l'Expert Advisor, bien que je l'aie mesurée ! J'ai même écrit un article à ce sujet. Il serait donc compréhensible qu'il y ait une détérioration significative du travail du code.
Et si je le voulais, je pourrais, par exemple, mettre en pièces n'importe quel article de ce site sans aucun problème. Mais j'apprécie l'information avant tout parce qu'elle est disponible, et non parce qu'elle correspond à mes idées sur l'idéal.
Je ne vais donc pas éliminer des défauts farfelus tout en encombrant considérablement le code, qui n'est pas si simple que cela, pour des raisons tout à fait compréhensibles et tout à fait professionnelles.