Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1213

 

Salud ! Aide :)

A partir de l'indicateur (mt5), un historique des tics est copié pour un traitement ultérieur. J'ai copié l'algorithme du livre de référence, je l'ai seulement un peu modifié :

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

Mais j'ai reçu un avertissement, l'historique des tics n'est pas synchronisé :

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

Et dans le manuel, il est dit :

ERR_HISTORY_TIMEOUT

4403

Dépassement du délai d'attente pour la demande d'historique

L'intuition du capitaine me dit de synchroniser les tics... Est-ce le point que j'essaie de faire ? Comment faire ? Ou est-il possible de travailler sans trop de dommages, même sans synchronisation, en supprimant simplement le contrôle de réussite ?

 
Yevhenii Levchenko:

Salud ! Aide :)

Un historique de ticks est copié à partir d'un indicateur (mt5) pour un traitement ultérieur.

Les indicateurs ont un accès asynchrone aux données de l'historique, tandis que les conseillers experts et les scripts ont un accès synchrone, ou du moins c'est ainsi que les développeurs des programmes MQL appellent le comportement lorsqu'ils travaillent avec des données.

Si nous parlons en langage humain, alors lorsque vous accédez aux données historiques dans l'indicateur, vous devez sortir du cycle de calcul avec une erreur, et après un certain temps, vous devez réappliquer à l'historique...

Et cela n'a pas de sens d'appeler l'historique dans l'indicateur plusieurs fois dans une boucle - cette méthode ne fonctionne que dans les conseillers experts et les scripts.

 
Igor Makanu:

Dans les indicateurs, l'accès asynchrone aux données historiques, dans les conseillers experts et les scripts, l'accès synchrone, ou du moins c'est ainsi que les développeurs appellent le comportement des programmes MQL lorsqu'ils travaillent avec des données.

en langage humain, lorsqu'on accède aux données de l'historique dans l'indicateur, il faut sortir du cycle de calcul avec une erreur, et après un certain temps, il faut réappliquer à l'historique.

et cela n'a pas de sens d'appeler l'historique plusieurs fois dans l'indicateur - cette méthode ne fonctionne que dans les Expert Advisors et les scripts.

Merci !

Le synchrone est-il lié au multithreading ? "Les ticks ne sont pas encore synchronisés" - il s'agit plutôt d'un avertissement ?

 
ANDREY:

C'est absurde... Vous n'êtes pas bon en logique, vous n'êtes pas bon en maths ..... et en même temps vous avez longtemps et avec succès modéré un forum dont le thème est imprégné à la fois de logique et de maths.

Où ai-je dit que je ne suis pas bon en logique ?

 
ANDREY:

Je pense que les connaissances détenues par un groupe de spécialistes n'étaient pas celles de Ford lui-même et ne le sont jamais devenues. De plus - il n'avait pas besoin de ces connaissances, car il les a qualifiées d'inutiles. Et si ces experts essayaient de transmettre leurs connaissances à Ford, il ne serait pas en mesure de les assimiler et de les utiliser à des fins pratiques. Il est nécessaire d'avoir plus qu'une idée générale du sujet, qui est associé à une nouvelle connaissance, afin de l'absorber. Dans l'exemple donné ci-dessus, les experts n'ont pas fourni des connaissances à Ford, mais à des avocats.

Et dans votre cerveau, comme il me semble, vous avez une quantité suffisante de connaissances systématisées en mathématiques et en logique et ce kit vous permet de formuler rapidement et correctement une requête de recherche d'informations nouvelles et manquantes et de les interpréter rapidement et correctement. Je suis sûr que dans votre cerveau ne peut pas être aucune de ces informations, puisque chaque jour pour de nombreuses heures passées sur ce forum et a passé à travers son cerveau un grand nombre d'informations associées spécifiquement avec les mathématiques et la logique. C'est comme apprendre une langue étrangère par immersion. Elle est apprise automatiquement, spontanément et peut-être même contre la volonté de l'apprenant.

Si 100 académiciens commencent à m'expliquer les règles de calcul des équations intégrales, je n'apprendrai pas comment le faire tant qu'ils ne me rempliront pas la tête de tous les manuels de mathématiques et d'algèbre que j'ai dû étudier à l'école avant que le professeur ne commence à expliquer les équations intégrales.

Si vous ne comprenez pas ce qu'est une variable et à quoi elle sert, il est difficile de comprendre même en sachant ce qu'est une variable, sans parler d'autres concepts qui ne sont même pas très compliqués.

Ford n'a pas dit qu'on lui apprendrait ce qu'il faut faire dans son domaine d'intérêt. Il a dit qu'il était entouré de tant de spécialistes dans différents domaines qu'il pouvait obtenir à tout moment les réponses aux questions dont il avait besoin. Pourquoi un manager doit-il savoir ce que 200 spécialistes peuvent savoir, chacun d'entre eux donnant la bonne réponse dans son domaine ? Il est impossible de tout savoir en principe. Mais pour obtenir rapidement les réponses aux problèmes dont vous avez besoin avec l'aide de spécialistes - c'est ce dont parlait Ford, c'est ce que je disais à propos des livres de référence et de l'utilisation des bonnes informations. Et c'est dans une zone étroite que cette ressource fournit sous la forme d'une CodeBase et d'un forum.

 
Yevhenii Levchenko:

Merci !

La synchronisation est-elle liée au multithreading ? "Les tics ne sont pas encore synchronisés" s'avère être plutôt un avertissement ?

pas de

Les développeurs laissent entendre que le terme "synchrone" signifie une sorte de traitement garanti des données historiques lors de l'appel des fonctions d' historique, mais il ne garantit pas que les données soient nécessairement renvoyées lorsque des requêtes sont effectuées.

... voici le langage non-humain ))))


Après une erreur, la synchronisation commence, mais l'heure de fin de la synchronisation (ou de la construction du TF) est inconnue et, en raison de la haute performance de MT5, vous obtenez une erreur à chaque fois au lieu de données synchronisées.

ZS : dans MT5 tout est compliqué .... il y a un serveur, un terminal et enfin notre programme MQL. Lorsque vous demandez l'historique, vous devez synchroniser le serveur - le terminal et ensuite le terminal - le programme MQL, quelqu'un peut ne pas avoir de délais ou de données tick prêts.

 
Igor Makanu:

pas de

Les développeurs laissent entendre que la synchronisation est une sorte de traitement garanti des données historiques lors de l'appel des fonctions d' historique, mais elle ne garantit pas nécessairement le retour des données lorsqu'elles sont interrogées...

... voici le langage non-humain ))))


Après une erreur, la synchronisation commence, mais l'heure de fin de la synchronisation (ou de la construction du TF) est inconnue et, en raison de la haute performance de MT5, vous obtenez une erreur à chaque fois au lieu de données synchronisées.

ZS : dans MT5 tout est compliqué .... il y a un serveur, un terminal et enfin notre programme MQL. Lorsque vous demandez l'historique, vous devez synchroniser le serveur - terminal et ensuite le terminal - programme MQL, quelqu'un peut ne pas avoir de délais ou de données tick prêts.

La réponse la plus simple est quelque chose comme ça :

Pour attendre la synchronisation dans l'indicateur, vous devez simplement quitter OnCalculate() avec le retour 0 après avoir reçu une erreur ;

Dans ce cas, le premier accès aux données historiques lance le processus de synchronisation des données et il ne reste plus qu'à vérifier son achèvement. S'il y a une erreur dans la réception des données, alors on renvoie zéro - car zéro indique la quantité de données déjà calculées lors de l'appel précédent (prev_calculated), et lors de l'appel actuel et du chargement réussi des données historiques, OnCalculate() sera calculé sur toute la profondeur de l'historique (puisqu'en renvoyant 0, nous avons ainsi indiqué lors de l'appel précédent que rien n'a été calculé).

 
a.lxrn:

Bonjour à tous, pouvez-vous s'il vous plaît m'aider à résoudre ce problème, le problème est en logique, je me suis cassé le cerveau aujourd'hui et je suis arrivé au point où je suis dans le désordre.

J'ai écrit un exemple de code élémentaire, il y a un signal si la clôture de la bougie est supérieure au wagon, un ordre est ouvert.

Le signal restera et restera vrai pendant longtemps. Je suis sûr que vous voyez ce que je veux dire,

Je suis sûr que vous comprenez ce que je veux dire. En fait, comment faire pour qu'un signal d'achat ouvre un ordre et c'est tout, jusqu'à ce que la situation change et que le prix de clôture soit inférieur au prix de la vague.

Je peux utiliser des drapeaux, mais ils ne sauvegardent pas l'ordre lorsqu'il se ferme et qu'il s'ouvre ou est retardé de 15 minutes. C'est encore plus cool lorsque les conditions pour les ordres d'ouverture et de fermeture sont vraies en même temps. A chaque tic, un ordre)))) Si le signal d'ouverture de l'ordre est vrai et que le drapeau indiquant que l'ordre est ouvert est faux, alors nous ouvrons l'ordre. Et si le drapeau indiquant que l'ordre est ouvert est vrai, l'ordre ne sera pas ouvert). Un délai est plus facile et plus efficace. Après la clôture de l'ordre, nous fixons un délai.

 
Igor Makanu:

asynchrone est une requête et des données ou une erreur, et après une erreur la synchronisation commence, mais le temps de la fin de la synchronisation (ou de la construction du TF) est inconnu et en raison de la haute performance de MT5 vous obtenez une erreur chaque fois que vous appelez à nouveau au lieu des données synchronisées

ZS : dans MT5 tout est compliqué .... Lorsque vous demandez l'historique, vous devez synchroniser le serveur - le terminal et ensuite le terminal - le programme MQL, quelqu'un peut avoir des délais ou des données de tick non prêts.


C'est à peu près ça... Merci :)

Artyom Trishkin:

C'était plus facile de répondre approximativement comme ça :

Pour attendre la synchronisation dans un indicateur, vous devez quitter OnCalculate() avec le retour 0 après avoir reçu une erreur ;

Dans ce cas, le premier accès aux données historiques lance le processus de synchronisation des données et il ne reste plus qu'à vérifier son achèvement. S'il y a une erreur dans la réception des données, alors on renvoie zéro - car zéro indique la quantité de données déjà calculées lors de l'appel précédent (prev_calculated), et lors de l'appel actuel et du chargement réussi des données historiques, OnCalculate() sera calculé sur toute la profondeur de l'historique (puisqu'en renvoyant 0, nous avons ainsi indiqué lors de l'appel précédent que rien n'a été calculé).

Plus simple ne veut pas dire plus clair :)

Je suis passé aux instruments de série et je n'ai vu qu'une seule fois qu'ils n'étaient pas synchronisés. Les requêtes ultérieures n'ont rien montré de tel.

Pouvez-vous me dire pourquoi le testeur ne montre pas les volumes ?
 
Yevhenii Levchenko:

Grosso modo... Merci :)

Plus simple ne veut pas dire plus clair :)

Je suis passé aux instruments de série et il n'y a eu qu'un seul message indiquant qu'ils n'étaient pas synchronisés. Les requêtes ultérieures n'ont rien montré de tel.

Pouvez-vous me dire pourquoi le testeur ne montre pas les volumes ?

Pour maintenir les données historiques dans un état "chaud", vous devez accéder à ces données toutes les deux minutes en utilisant l'une des fonctions CopyXXX, iXXX, par exemple CopyTime(), iTime(), etc...

Je ne sais pas quels volumes vous n'avez pas dans le testeur. Il existe des volumes réels et des volumes fictifs. Sans code, il est impossible de répondre en substance.