Questions des débutants MQL5 MT5 MetaTrader 5 - page 984

 
Ihor Herasko:


Mais le fait est que. Le sommeil ne devrait pas affecter le recalcul des données dans l'indicateur. Il y a un problème avec le remplissage des tampons. Peut-être y a-t-il un morceau de code reproductible ?

L'indicateur a été écrit sur commande - c'est un OOP sauvage, je ne le comprends pas :(

J'ai passé toute la nuit avec ce problème, alors que j'ai trouvé la raison de la divergence entre le testeur et le compte réel, peut-être qu'après avoir dormi je vais enlever une partie de la logique secrète et la poster pour révision.

 
Aleksey Vyazmikin:

J'ai été confronté à un problème, l'EA basé sur l'indicateur fonctionne correctement sur un compte réel, mais il ment dans le testeur, dans les modes de génération de tick à la fois par OHLC et par tous les ticks - le résultat est le même. Le résultat de cette erreur est le tampon vide de l'indicateur à la barre zéro (seulement quand il y a une nouvelle barre au TF supérieur, qui est utilisé pour le calcul de l'indicateur). Cependant, j'ai réussi à faire en sorte que l'indicateur soit calculé en ajoutant le Sleep à mon Expert Advisor. Mais j'ai découvert que selon le mode de génération des ticks, ce Sleep doit être différent - pour la génération à partir de tous les ticks, Sleep(15000) est suffisant, alors que pour OHLC Sleep(30000) est nécessaire.

La question se pose donc : la situation avec Sleep est-elle normale, car il s'avère logiquement que différents temps de retard y sont modélisés en fonction du mode de génération des ticks !

Chers développeurs, je vous demande d'expliquer la situation de l'indicateur, car je n'arrive pas à comprendre quelle en est la raison - un bug dans le code ou chez le testeur !

Je suis prêt à vous donner l'indicateur et le Conseiller Expert dans le PM, mais dites-moi à qui.

Si vous voulez copier le prix dans un tableau, vous devez vérifier si l'historique est disponible et vérifier si le prix n'a pas changé. Pour cela, nous devons vérifier si l'historique de TF est disponible, si non, nous devons essayer de le copier à nouveau et attendre qu'il soit chargé dans la boucle.

c'est une mauvaise main du programmeur s'il n'était pas au courant.

le glissement n'est pas normal
 
void OnChartEvent(            const int id,        // идентификатор события   
                              const long& lparam,  // параметр события типа long 
                              const double& dparam,// параметр события типа double 
                              const string& sparam // параметр события типа string 
                              )
   {
   Print(My_Name, " ---  ", id, "    lparam = ", lparam, "    dparam = ", dparam, "    sparam = ", sparam, "    ChartID() = ", ChartID() );        // <<|+|+|+<<  // 

   }                              

Veuillez expliquer...

J'appuie sur la touche = j'obtiens l'événement id = 0. Cette opération peut être répétée plusieurs fois. Le résultat est le même tant que la barre d'espacement n'est pas enfoncée.

J'ai appuyé sur la barre d'espacement = j'obtiens l'événement id = 0. Après cela, toutes les manipulations sur le clavier ne donnent lieu à aucun événement.

Pour sortir de la stupeur, j'appuie sur le bouton de la souris = j'obtiens l'événement id = 4. Après cela, vous pouvez cliquer à nouveau sur le clavier = des événements se produisent pour chaque clic. Tant qu'on n'appuie pas sur la barre d'espacement = avec le même résultat.

Question : suis-je un idiot qui ne comprend pas quelque chose ou cela ne devrait pas être comme ça ? Veuillez fournir un lien.

 
Nikita Chernyshov:

Bonjour chers collègues.

Question : Dans mql4, afin de calculer le nombre de positions, vous pouvez écrire la fonction comme ceci

Comment est-elle mise en œuvre dans mql5 ? Comment puis-je calculer les positions par numéro magique ou par type ?

Ajoutez cette ligne avant la fonction MQL4

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

et il fonctionnera dans MT5.

 
Maxim Dmitrievsky:

Le problème avec les indicateurs est que les séries temporelles ne sont peut-être pas encore prêtes, c'est-à-dire qu'elles ne peuvent pas copier le prix dans un tableau en une seule fois. Pour cela, il faut vérifier si l'historique de TF est disponible, sinon il faut essayer de le recopier et attendre qu'il soit chargé dans la boucle.

C'est une mauvaise main du programmeur s'il ne le sait pas.

le glissement n'est pas acceptable

Comment cela est-il possible dans le testeur ? Je comprends que si le problème est sur le réel ou dans le testeur, il n'y a pas d'historique... Cependant, à quoi doit ressembler ce test ?

Les développeurs ignorent mon message, c'est regrettable.

 
Aleksey Vyazmikin:

Comment cela est-il possible dans le testeur ? Je comprends que si le problème est sur le réel ou dans le testeur, il n'y a pas d'historique... Cependant, à quoi doit ressembler ce test ?

Les développeurs ignorent mon message, c'est regrettable.

vérifie si les prix sont copiés, si Copyclose ou autre renvoie -1 alors ils ne sont pas copiés.

 
Maxim Dmitrievsky:

vérifie si les prix sont copiés, si Copyclose ou autre renvoie -1 alors ils ne sont pas copiés.

L'indicateur est calculé une fois à l'apparition d'une nouvelle barre, ce qui est implémenté, si je comprends bien, de cette façon :

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static int counted_bars=0;
   if(rates_total==prev_calculated) return(rates_total);

elle est également confirmée par une simple empreinte.

C'est pourquoi la situation n'est pas claire, si nous supposons qu'il n'y a pas de prix à calculer, l'indicateur sera calculé 1 fois et le tampon restera non rempli, mais ce n'est pas le cas - il se remplira si nous ajoutons le sommeil à l'EA et attendons. Peut-être que l'indicateur est lent à calculer et que le testeur ne l'attend pas ? Mais comment le vérifier ?

 
Aleksey Vyazmikin:

L'indicateur est calculé 1 fois lorsqu'une nouvelle barre apparaît, ce qui est implémenté, si je comprends bien, de cette façon :

Ceci est également confirmé par une simple impression.

C'est pourquoi la situation n'est pas claire, si nous supposons qu'il n'y a pas de prix à calculer, l'indicateur sera calculé une fois et le tampon restera non rempli, mais ce n'est pas le cas - il se remplira si nous ajoutons le sommeil à l'EA et attendons. Peut-être que l'indicateur est lent à calculer et que le testeur ne l'attend pas ? Mais comment le vérifier ?

Peut-être que cela devrait être chronométré alors

 
Maxim Dmitrievsky:

On devrait peut-être utiliser un minuteur alors.

Oui, avec le timer dans l'EA, le test va un peu plus loin que sans le timer, mais moins bien qu'avec Sleep, et le timer est essentiellement le même que Sleep.

Je pense avoir compris le problème, l'indicateur est calculé en utilisant les données de deux autres indicateurs et le code demande le nombre de barres calculées des autres indicateurs.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel::BarsCalculated(void)
  {
   int upchbars=BarsCalculated(m_upch);
   int dnchbars=BarsCalculated(m_dnch);
   if(upchbars<=dnchbars) return(upchbars);
   return(dnchbars);
  }

et le nombre de barres calculé attendu

int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod));

Si ces deux valeurs ne coïncident pas, le tampon n'est pas rempli.

   if(!channel.CreateChannel() || barsch<=0 || barsch!=channel.BarsCalculated() || channel.FillChBuffers(rates_total,calculated,time)==0)
     {
      for(;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]=0.0;
         ZigzagStepBuffer[counted_bars]=0.0;
         UpChBuffer[counted_bars]=0.0;
         DnChBuffer[counted_bars]=0.0;
         InfoZigzagBuffer[counted_bars]=0.0;
         InfoUpChBuffer[counted_bars]=0.0;
         InfoDnChBuffer[counted_bars]=0.0;
         InfoDirectBuffer[counted_bars]=0.0;
         InfoBegPriceBuffer[counted_bars]=0.0;
         InfoEndPriceBuffer[counted_bars]=0.0;
         InfoBegTimeBuffer[counted_bars]=0.0;
         InfoEndTimeBuffer[counted_bars]=0.0;
         InfoStartPriceBuffer[counted_bars]=0.0;
         InfoStartTimeBuffer[counted_bars]=0.0;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars-1];
        }
      if(InpInfEnd) CopyInfoBuffers(rates_total-1,(int)InfoZigzagTotal[rates_total-1]);
      return(calculated);
     }

Si je comprends bien, les indicateurs sont exécutés dans un thread et leur priorité est distribuée par le moment de leur création, c'est-à-dire qu'il s'avère que l'indicateur que j'adresse depuis l'EA a la priorité la plus élevée et effectue son calcul en premier et ensuite il passe le thread aux indicateurs qui devraient effectuer le calcul (sur la base des données des buffers).

Dans l'impression je vois que si je mets Sleep d'une taille suffisante, le recalcul est effectué dans l'indicateur (je ne comprends pas encore comment) et pourquoi seulement après 13 secondes ?

2019.01.22 19:50:16.992 2019.01.21 23:45:00   barsch=6275
2019.01.22 19:50:16.992 2019.01.21 23:45:00   BarsCalculated=6274

2019.01.22 19:50:16.993 2019.01.21 23:45:13   barsch=6275
2019.01.22 19:50:16.993 2019.01.21 23:45:13   BarsCalculated=6275

Il n'y a pas de minuterie dans l'indicateur.

Et que dois-je faire pour obtenir un calcul correct, en essayant d'utiliser while dans l'EA avant d'attendre la valeur dans la mémoire tampon, cela n'aide pas - il y a des blocages.

 
Bonjour, je voulais implémenter un trailing stop avec step dans mon EA. Je n'ai rien trouvé d'autre que le modèle dans Kodobase et Macd Sample. Peut-être y a-t-il d'autres options ?
Raison: