[Les indicateurs ne sont pas correctement instanciés lorsqu'ils sont appelés/créés à partir d'un indicateur d'une période de travail différente. - page 2

 
Alain Verleyen:

Vous répétez "failing to instantiate", mais ce n'est pas exact. L'indicateur est instancié dans tous les cas.

Le problème est que les données ne sont pas disponibles de manière synchrone, vous devez faire avec. Ce n'est PAS un bug de MT5, c'est une FONCTION.

Je propose d'arrêter la discussion et d'attendre la réponse de SD.

Peut-être n'ai-je pas bien formulé le fait que, quel que soit le nombre de boucles et d'attentes, vous ne pourrez pas accéder aux données de l'indicateur (de différents TF) avant le premier passage de (*edit) OnCalculate() ;

Je suis parfaitement disposé à accepter que je puisse avoir tort, c'est pourquoi j'ai une prime de 10 $ si vous pouvez démontrer le contraire. S'il vous plaît... prouvez-moi que j'ai tort. J'ai besoin d'une solution de contournement pour ce stupide bug, pardon, je veux dire "fonctionnalité".

 
nicholishen:

Peut-être n'ai-je pas bien formulé le fait que, quel que soit le nombre de boucles et d'attentes, vous ne pourrez pas accéder aux données de l'indicateur (des différents TF) avant le premier passage de (*edit) OnCalculate() ;

Je suis parfaitement disposé à accepter que je puisse avoir tort, c'est pourquoi j'ai une prime de 10 $ si vous pouvez démontrer le contraire. S'il vous plaît... prouvez-moi que j'ai tort. J'ai besoin d'une solution de contournement pour ce bug stupide, désolé, je veux dire "fonctionnalité".

Pourquoi en avez-vous besoin dès la première "passe" ? Si les données nécessaires ne sont pas disponibles, attendez qu'elles le soient, c'est tout.
 
Alain Verleyen:
Pourquoi en avez-vous besoin lors de la première "passe" ? Si les données nécessaires ne sont pas disponibles, attendez qu'elles le soient, c'est tout.

Parce que je suis en train de développer un indicateur qui nécessite l'accès aux données du même indicateur (même symbole) sur une trame temporelle différente. Comme il ne sera pas traité avant le deuxième tick, cela signifie que l'indicateur ne fonctionnera pas hors ligne, et ne fonctionnera que lorsque le deuxième tick arrivera.

Pourquoi devrions-nous faire des compromis à cause de ce bogue ? Qu'est-ce qui vous pousse à le défendre aussi furieusement ?

 
nicholishen:

Parce que je suis en train de développer un indicateur qui nécessite l'accès aux données du même indicateur (même symbole) sur une trame temporelle différente. Comme il ne sera pas traité avant le deuxième tick, cela signifie que l'indicateur ne fonctionnera pas hors ligne, et ne fonctionnera que lorsque le deuxième tick arrivera.

Pourquoi devrions-nous faire des compromis à cause de ce bogue ? Qu'est-ce qui vous pousse à le défendre avec autant de ferveur ?

? ??

Je ne défends rien, et certainement pas "furieusement". Restez cool, s'il vous plaît.

 
Alain Verleyen:

? ??

Je ne défends rien, et certainement pas "furieusement". Restez cool, s'il vous plaît.

OK.

J'ai posté ce travail au cas où quelqu'un serait intéressé pour s'y essayer.

https://www.mql5.com/en/job/57516

 
nicholishen:

Cela signifie que si les données sont immédiatement disponibles pour un script ou un EA, elles seront également disponibles pour l'indicateur (ce n'est donc pas un problème de disponibilité des données). L'indicateur ne parvient tout simplement pas à s'instancier avant le deuxième passage de OnCalculate() (c'est-à-dire le premier tick).

Vous comprenez le mot "disponibilité" trop littéralement. Bien que certaines données puissent exister dans la mémoire du terminal, le terminal lui-même peut contenir une logique de synchronisation qui bloque les mises à jour pour toutes les périodes pendant que les données sous-jacentes sont vérifiées pour une période (probablement une autre). Ou ils peuvent bloquer les demandes de données d'un indicateur jusqu'à ce qu'il ait terminé sa propre création (n'oubliez pas que les indicateurs sont gérés par des "handles", alors que les experts et les scripts ne le sont pas), ce qui me semble logique. Ce ne sont que des suppositions, que j'ai faites du point de vue des développeurs MQ. Vous pouvez leur demander directement via le service desk.

Votre travail est impossible à réaliser en raison du point 3 :

3. Doit accéder au tampon à l'initialisation

C'est tout simplement contre l'architecture et la documentation du terminal :

Vous ne pouvez pas vous référer aux données de l'indicateur juste après sa création, car le calcul des valeurs de l'indicateur prend un certain temps.

Veuillez également lire la fonction CopyBuffer:

Note

Lorsque vous demandez des données à l'indicateur, si les séries temporelles demandées ne sont pas encore construites ou si elles doivent être téléchargées du serveur, la fonction renvoie immédiatement-1, mais le processus de téléchargement/construction est lancé.

Lors de la demande de données à partir d'un Expert Advisor ou d'un script, letéléchargement à partir du serveur sera lancé, si le terminal ne dispose pas de ces données localement, ou la construction d'une série temporelle requise commencera, si les données peuvent être construites à partir de l'historique local, mais qu'elles ne sont pas encore prêtes. La fonction renvoie la quantité de données qui seront prêtes au moment de l'expiration du délai.

Ainsi, les experts et les scripts sont traités de manière synchrone jusqu'à un délai prédéfini, mais les indicateurs - de manière asynchrone.

Documentation on MQL5: Technical Indicators
Documentation on MQL5: Technical Indicators
  • www.mql5.com
Technical Indicators - Reference on algorithmic/automated trading language for MetaTrader 5
 
Quant à votre tâche spécifique, elle peut être facilement réalisée d'une autre manière. Vous n'êtes pas le premier à construire un indicateur sur un indicateur et à vouloir qu'il fonctionne hors ligne. Utilisez une minuterie.
 
Stanislav Korotky:
Quant à votre tâche spécifique, elle peut être facilement réalisée d'une autre manière. Vous n'êtes pas le premier à construire un indicateur sur un indicateur et à vouloir qu'il fonctionne hors ligne. Utilisez une minuterie.
J'ai essayé. Ça n'a pas marché.
 
nicholishen:
Je l'ai essayé. Cela n'a pas fonctionné.
Poser une question plus spécifique avec un exemple de code. Il peut y avoir des bogues. L'approche fonctionne pour moi.
 
Stanislav Korotky:
Postez une question plus spécifique avec un exemple de code. Il peut y avoir des bogues. L'approche fonctionne pour moi.
Je ne comprends pas comment je peux être plus spécifique que je ne l'ai déjà fait...

Aucune quantité de timers ou de boucles ne peut surmonter le fait que l'indicateur ne sera pas instancié avant que Oncalculate ne renvoie au moins une fois. La récursion ne fonctionne pas non plus.