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

 

do { ... code de remplissage du tampon

}

while(ces deux valeurs ne correspondent pas)

en bref, récupérer les valeurs dans la boucle jusqu'à ce qu'elles correspondent, seulement ensuite exécuter le code suivant
 
Maxim Dmitrievsky:

do { ... code de remplissage du tampon

}

while(ces deux valeurs ne sont pas les mêmes)

En bref, récupérez les valeurs dans la boucle, jusqu'à ce qu'elles soient identiques, puis exécutez seulement le code suivant

Le fait est que tant qu'un indicateur ne fonctionne pas, les données (flux) ne sont pas transmises à l'autre, c'est-à-dire que la boucle dans l'indicateur sansOnCalculate de cet indicateur ne servira à rien. Et dès que OnCalculate est terminé, les données sont transmises à l'Expert Advisor, et c'est faux.

Ou peut-être que je ne comprends pas votre idée.
 
Aleksey Vyazmikin:

Donc, le point est que jusqu'à ce qu'un indicateur fonctionne, les données (flux) ne sont pas transférées à un autre, c'est-à-dire que la boucle dans l'indicateur sans la terminaison de OnCalculate de cet indicateur ne sera pas utile.

vous recevez les valeurs des tampons des autres indicateurs une par une, si leur nombre n'est pas le même, vous les recevez à nouveau jusqu'à ce qu'il soit le même, oubliez les flux. Mais en général, personne ne procède de cette façon - c 'est très lent.

 
Aleksey Vyazmikin:

Donc, le point est que jusqu'à ce qu'un indicateur fonctionne, les données (flux) ne sont pas transmises à un autre, c'est-à-dire que la boucle dans l'indicateur sans OnCalculate de cet indicateur ne sera pas utile. Mais dès que OnCalculate est terminé, les données sont transmises à l'Expert Advisor, et elles sont erronées.

Ou je ne comprends pas votre idée.

il faut que la condition soit vraie, alors seuls les tampons seront remplis, si je comprends bien (le nombre de barres dans les tampons des autres indicateurs sera le même).

remplir de force toutes les conditions avant de remplir les tampons de l'indicateur actuel

ou le rendre au mauvais programmeur - pourquoi devrions-nous résoudre ses problèmes dans le mauvais domaine ?

 
Maxim Dmitrievsky:

vous récupérez les valeurs des tampons des autres indicateurs une par une, si leur nombre n'est pas le même, vous les récupérez à nouveau jusqu'à ce qu'il soit le même, oubliez les flux. mais en général, personne ne le fait, c'est une perversion des indicateurs à partir des indicateurs, très lente.

Maxim Dmitrievsky:

il faut que la condition soit remplie, alors seuls les tampons seront remplis, si je comprends bien (le nombre de barres dans les tampons des autres indicateurs sera le même).

Exécution forcée de toutes les conditions avant que les tampons de l'indicateur actuel ne soient remplis.

ou le rendre au programmeur qui a la main lourde, pourquoi devrions-nous résoudre ses problèmes au mauvais endroit ?

Si le calcul n'est pas prêt à partir d'autres indicateurs, les valeurs seront nulles, il n'y a donc aucun sens à forcer le remplissage ici, vous pouvez remplir les données passées, mais avec le même effet, vous pouvez demander à l'indicateur des données non pas pour la barre actuelle, mais pour la barre passée, et alors le code ne devrait pas être modifié du tout.

Pourquoi discutons-nous ici ? parce que la situation dans le testeur et dans le compte réel est différente, la simulation de Sleep fonctionne très bizarrement, et le recalcul de l'indicateur pour un glissement de 15 secondes ne se produit qu'une seule fois, alors qu'il doit se produire à chaque tick, ou à la demande, et il ne se produit pas en 15 secondes, mais en 13, selon le log.

En outre, le problème de la synchronisation est pertinent, et il serait bon d'ajouter pour de telles situations la possibilité d'informer l'indicateur de la nécessité de passer le flux de données à d'autres indicateurs, sans quoi il est impossible d'effectuer d'autres calculs - ce serait une solution - la commande de passer le flux à un autre indicateur sans avoir terminé le calcul.

Respectivement, le Conseiller Expert devrait attendre les données de l'indicateur et sauter des ticks jusqu'à ce que le calcul complet soit fait ; maintenant, quand on essaie d'utiliser l'instruction "while", le résultat du calcul se bloque (c'est-à-dire que rien ne se passe, le testeur reste là), et ce n'est pas correct non plus.

J'ai, bien sûr, informé le développeur, mais je n'ai pas eu de nouvelles de lui depuis plus d'un mois - c'est le coût du travail en free-lance.

 

la situation dans le testeur et dans le compte réel est différente, la simulation Sleep fonctionne très étrangement, et le recalcul de l'indicateur pour un glissement de 15 secondes ne se produit qu'une fois, alors qu'il devrait se produire à chaque tick, ou à la demande, mais il ne se produit pas en 15 secondes, mais en 13, selon le journal.

En outre, le problème de la synchronisation est pertinent, et il serait bon d'ajouter pour de telles situations la possibilité d'informer l'indicateur de la nécessité de passer le flux de données à d'autres indicateurs, sans quoi il est impossible d'effectuer d'autres calculs - ce serait une solution - la commande de passer le flux à un autre indicateur sans avoir terminé le calcul.

Respectivement, le conseiller expert devrait attendre les données de l'indicateur et sauter des ticks jusqu'à la fin du calcul complet, mais maintenant, lorsque l'on essaie d'utiliser l'instruction "while" pour attendre les résultats corrects du calcul, il se fige/se met en veilleuse (c'est-à-dire que rien ne se passe, le testeur reste là), ce qui n'est pas correct non plus.

 

CherArtyom Trishkin!

J'espère vraiment que, puisque vous avez déterminé que les questions ci-dessus s'adressent aux débutants, vous connaissez déjà la réponse et pouvez m'aider !

J'attends une réponse d'un professionnel.

 
Aleksey Vyazmikin:

CherArtyom Trishkin!

J'espère vraiment que, puisque vous avez déterminé que les questions ci-dessus s'adressent aux débutants, vous connaissez déjà la réponse et pouvez m'aider !

J'attends une réponse d'un professionnel.

Le seul conseil que je peux donner est le suivant : l'indicateur devrait quitter OnCalculate() s'il n'a pas reçu le nombre de barres requis pour le calcul : if(rates_total<number of_bars required) return 0 ;

Le Conseiller Expert doit vérifier les données reçues de l'indicateur, et si elles ne sont pas égales à la valeur vide de l'indicateur, alors seulement effectuer des calculs avec les données reçues.

  1. Dans l'indicateur, d'abord, les tampons sont initialisés avec une valeur vide (ce qui est - peut être défini dans l'indicateur).
  2. Dans l'indicateur (les tampons sont déjà remplis avec une valeur vide), vérifiez le nombre de barres disponibles (je l'ai décrit ci-dessus).
  3. Si le contrôle de la disponibilité des barres est passé, le cycle de calcul de l'indicateur est exécuté en remplissant les tampons avec les valeurs nécessaires.
    ... ... ...
  4. Dans le conseiller expert, vérifiez combien de barres sont calculées par l'indicateur (il existe une fonction standard BarsCalculated()).
  5. Obtenir les données de l'indicateur
  6. En fonction de ce que nous obtenons - cela dépend de la logique de votre TS
    1. Si l'indicateur est une ligne, sa valeur vide indique qu'il n'a pas encore été calculé - nous ne le prenons pas pour les calculs.
    2. Si l'indicateur - flèches, alors il y a une autre logique (parce que la valeur vide est aussi ses données de travail), par exemple, si c'est une fractale, alors nous vérifions la barre numéro 3, et à partir des valeurs obtenues repousser.
  7. Eh bien, incluez votre propre logique et n'accusez pas tout sur les Bugs du terminal.
  8. Tout d'abord, je vérifie les Bugs avec moi-même.
  9. Et vous ?
 
Artyom Trishkin:

Je ne peux que conseiller : l'indicateur devrait quitter OnCalculate() s'il n'a pas obtenu le bon nombre de barres pour le calcul : if(rates_total<number_of_bars required) return 0 ;

Merci pour le conseil, pas de problème avec la sortie, mais cela ne résout pas la situation, j'ai fait comme un calcul raté pour le moment.

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

Et d'une manière ou d'une autre, il remplit les tampons et obtient des données d'autres indicateurs et les données ne sont pas transmises à l'EA tant qu'une condition n'est pas remplie. Je n'ai pas encore vérifié l'exactitude des données, mais elles semblent correctes. Ou peut-être que je me trompe et que quelque chose ne va vraiment pas ?

Artyom Trishkin:

Le Conseiller Expert doit vérifier les données reçues de l'indicateur et si elles ne sont pas égales à la valeur vide de l'indicateur, alors seulement effectuer des calculs avec les données reçues.

Le Conseiller Expert effectue les calculs un à l'arrivée d'une nouvelle barre, et respectivement, la tentative d'attendre la valeur correcte de l'indicateur conduit à un arrêt du testeur.

Artyom Trishkin:
  1. Dans l'indicateur, les tampons sont d'abord initialisés avec une valeur vide (ce qu'il est - peut être défini dans l'indicateur).
  2. Dans l'indicateur (les tampons sont déjà remplis avec une valeur vide), vérifiez le nombre de barres disponibles (décrit ci-dessus).
  3. Si le contrôle de la disponibilité des barres est passé, le cycle de calcul de l'indicateur est effectué en remplissant les buffers avec les valeurs nécessaires.
    ... ... ...
  4. Dans le conseiller expert, vérifiez combien de barres sont calculées par l'indicateur (il existe une fonction standard BarsCalculated()).
  5. Obtenir les données de l'indicateur
  6. Selon ce que nous obtenons - cela dépend de la logique de votre TS
    1. Si l'indicateur est une ligne, sa valeur vide indique qu'il n'a pas encore été calculé - nous ne le prenons pas pour les calculs.
    2. Si l'indicateur - flèches, alors il y a une autre logique (parce que la valeur vide est aussi ses données de travail), par exemple, si c'est une fractale, alors nous vérifions la barre numéro 3, et à partir des valeurs obtenues nous commençons.
  7. Eh bien, incluez votre propre logique et n'accusez pas tout sur les Bugs du terminal.
  8. Tout d'abord, je vérifie les bugs avec moi-même.
  9. Et vous ?

1. c'est vrai.

2. Et c'est ce qui se passe. Ce calcul sera correct au prochain tick, mais je veux recevoir un calcul correct au premier tick, parce que l'Expert Advisor n'attend pas dans la boucle les autres ticks ou l'attente n'est pas commensurable avec ma patience, c'est-à-dire qu'elle n'est pas réaliste - il y a une erreur.

3.

4. Bien sûr.

5. Oui, nous le faisons, mais l'indicateur doit recevoir des données d'autres indicateurs et c'est là le problème !

6. 1-2. Il n'est pas correct de mettre délibérément de fausses données dans le tampon de l'indicateur, cela ne fera que compliquer la détection d'une erreur d'algorithme dans le code du conseiller expert.

7. Je décris tout logiquement, mais je n'ai pas écrit l'indicateur, donc il m'est difficile de comprendre quelle est la raison, j'ai décrit la manifestation raisonnable de l'indicateur, à savoir l'incapacité d'effectuer un calcul sans recevoir des valeurs tamponnées d'autres indicateurs, en raison du monopole du flux de données (les indicateurs sont calculés séquentiellement).

8. J'ai déjà noté ici et précédemment que je ne suis pas l'auteur, j'ai passé beaucoup de temps - presque une journée - à identifier les causes.

9. Et je suis à la recherche d'une solution au problème, en outre, si quelqu'un a été confronté à ce problème, peut rapidement m'aider. Je répète, dans ce fil, j'ai commencé à écrire en raison de Sleep, et puis est sorti les autres caractéristiques du testeur, que je crois aussi l'erreur.

Merci pour la réponse.

 
Aleksey Vyazmikin:

Merci pour le conseil, pas de problème avec la sortie, mais cela ne résout pas la situation, j'ai fait autant de calculs ratés jusqu'à présent.

Et d'une manière ou d'une autre, il remplit les tampons et obtient des données d'autres indicateurs, les données ne sont pas transmises à l'EA tant que la condition n'est pas remplie. Je n'ai pas encore vérifié l'exactitude des données, mais cela semble correct. Ou peut-être que je me trompe et que quelque chose ne va vraiment pas ?

L'Expert Advisor effectue le calcul seul lorsqu'une nouvelle barre arrive et donc, en essayant d'attendre la valeur correcte de l'indicateur, cela conduit à un arrêt du testeur.

1. C'est le cas.

Et c'est ainsi. 2. Ce calcul sera correct au prochain tick, mais j'ai besoin d'obtenir un calcul correct au premier tick, parce que mon conseiller expert n'attend pas dans la boucle d'autres ticks ou que l'attente n'est pas commensurable avec ma patience, c'est-à-dire qu'elle n'est pas réaliste - il y a une erreur.

3.

4. Bien sûr.

5. Oui, nous le faisons, mais l'indicateur doit recevoir des données d'autres indicateurs et c'est là le problème !

6. 1-2. Il n'est pas correct de mettre délibérément de fausses données dans le tampon de l'indicateur, cela ne fera que compliquer la détection d'une erreur d'algorithme dans le code du conseiller expert.

7. Je décris tout logiquement, mais je n'ai pas écrit l'indicateur, donc il m'est difficile de comprendre quelle est la raison, j'ai décrit la manifestation raisonnable de l'indicateur, à savoir l'incapacité d'effectuer un calcul sans recevoir des valeurs tamponnées d'autres indicateurs, en raison du monopole du flux de données (les indicateurs sont calculés séquentiellement).

8. J'ai déjà noté ici et précédemment que je ne suis pas l'auteur, j'ai passé beaucoup de temps - presque une journée - à identifier les causes.

9. Et je suis à la recherche d'une solution au problème, en outre, si quelqu'un a été confronté à ce problème, peut rapidement m'aider. Je répète, dans ce fil, j'ai commencé à écrire en raison de Sleep, et puis est sorti les autres caractéristiques du testeur, que je crois aussi l'erreur.

Merci pour la réponse.

Dans OnInit() appelez la série temporelle du symbole : iTime(Symbol,Timeframe,1) ;

Au tout début, dans OnTick(), demandez la barre requise de la série temporelle requise en utilisant le iFunc() correspondant, ou if( iTime(Symbol,Timeframe,10)==0) return ;

Dans ce cas, le conseiller expert ne détectera pas de nouvelle barre et attendra le prochain tick.

Dans OnInit(), nous avons demandé les données de la série chronologique, activant ainsi la pagination des données.

Dans OnTick() nous vérifions si l'historique minimum requis est disponible pour l'EA et s'il n'est pas encore disponible, nous attendons le prochain tick.

Et jusqu'à ce que toutes les données requises par le conseiller expert soient reçues, il attendra le prochain tick.

Dès que toutes les données nécessaires sont pompées et obtenues, le conseiller expert commence à travailler avec la nouvelle barre et l'historique requis.

Pour que les données de série restent à jour, il est impératif d'y accéder au moins une fois toutes les deux minutes. Créez une deuxième minuterie d'environ une minute et demie (90 secondes) et faites-y simplement référence à n'importe quelle série temporelle du symbole souhaité, par exemple iTime(Symbol,Timeframe,1) ; Sans vérifier les données reçues - il suffit de "remuer" l'historique. Ainsi, toutes les données du symbole seront toujours à jour.

Raison: