Bogue MQL5 lors du travail avec l'accès aux séries chronologiques iClose/iOpen, etc. - page 4

 
Renat Fatkhullin:

Tout de suite sur le code et le travail :

  1. La fonction CopyXXX des indicateurs n'attend pas le téléchargement synchrone complet des données, mais donne ce qui est disponible. Sinon, les indicateurs ralentiraient vraiment.

  2. Il semble y avoir un problème avec le suivi, si toutes les données n'ont pas été synchronisées la première fois.
    Il est nécessaire de passer à un mode doux "Je vais attendre avec attention que le téléchargement soit réussi". Par exemple, OnCalculate n'est pas appelé.

  3. La mauvaise chose est qu'une initialisation globale avec la charge maximale est placée dans OnInit où l'indicateur compte et attend pendant un temps très long.
    Dans ce cas, la mise à jour des graphiques de ce symbole est bloquée et de nombreux autres participants doivent attendre et ne pas recevoir de nouvelles données. L'indicateur ne doit pas prendre de ressources pendant une longue période. Il est préférable d'étirer l'initialisation longue étape par étape/initialisation du symbole dans OnCalculate, en comptant étape par étape.

  4. J'ai demandé à cet indicateur de pomper environ 800 Mo de données historiques sur le réseau pour la synchronisation.

  5. L'indicateur possède 512 lignes de dessin pour lesquelles de la mémoire est explicitement allouée. C'est extrêmement coûteux. Seules 100 lignes sont utilisées.

  6. Le code est peu lisible

1. oui, c'est pourquoi je dois les appeler plusieurs fois avec une pause, ou relancer l'indicateur manuellement plusieurs fois, mais même cela n'aide pas toujours et l'indicateur arrête de calculer après un certain temps

2. j'admets que la version actuelle n'est pas optimale ; j'ai essayé différentes variantes, y compris la fonction recommandée dans la documentation (section "organiser l'accès aux données") ; dans la dernière version je l'ai un peu simplifiée, et il n'est probablement pas non plus optimal d'appeler plusieurs fois les fonctions iBarShift, mais d'un autre côté si on les rejette, il faut créer une fonction spéciale pour préparer les données synchronisées que je ne peux pas encore écrire, c'est très lourd, et il n'y a pas de fonction standard, de plus si la langue a une fonction standard pour demander le temps n

3. OnInit définit seulement les combinaisons de portefeuilles et assigne les buffers, pas de requêtes dans OnInit. Optionnellement, j'ai essayé d'ouvrir les graphiques de tous les instruments M1 en arrière-plan pour éviter la disparition du cache, et cela semble aider, bien sûr à la charge maximale tout est terrible, 28 graphiques... La première demande de données se fait dans OpsCalculate où j'appelle CopyClose en boucle avec une pause (fonction RequestData) pour que les données soient mises en cache et les séries pour que tous les instruments soient rassemblés, puis viennent les appels (SetupIntervals, CalculateEquity et autres). Je pensais que de cette façon, toutes les données seraient prêtes et que tous les appels de iBarShift et iClose et autres fonctions utiles renverraient les données mises en cache, mais cela ne fonctionne pas toujours.

4. cela doit représenter 800 mb de données de tics... ? Mais je ne sais pas comment je pourrais former un tas de portefeuilles avec 28 instruments, ils devraient être demandés de toute façon, dans mt4 il n'y avait aucun problème avec cela (probablement parce que tous les délais existent séparément dans mt4).

5. le truc c'est que l'indicateur suppose que beaucoup de combinaisons de portefeuilles peuvent être impliquées, maintenant il y a une combinaison prédéfinie avec 420 lignes + lignes de service (toutes sortes de baguettes, canaux, etc.), théoriquement l'utilisateur peut demander les 512 lignes, le nombre de tampons ne peut pas être limité à l'avance en utilisant #property indicators_buffers, parce qu'on ne sait pas combien seront demandés par l'utilisateur, dans mt4 c'est décalé à la charge maximale, mais ça marche

6. je la commenterai si nécessaire.


P.S. Je pensais que vous aviez peut-être téléchargé la mauvaise version, car j'ai fait une erreur la première fois et j'ai posté une version différente, puis j'ai corrigé la pièce jointe.

P.P.S. Je veux profiter de l'occasion pour clarifier la fonctionnalité des graphiques synthétiques, cette fonctionnalité sera-t-elle développée d'une manière ou d'une autre ? Par exemple, je ne veux pas seulement faire la formule des indices, mais aussi simuler la position d'achat/de vente d'un groupe d'instruments, maintenant c'est difficile à faire parce que je dois écrire une formule encombrante pour la valeur du point et la taille du contrat, et la valeur du point ne change pas dans l'historique ...

 

Renat Fatkhullin:

L'indicateur ne doit pas occuper les ressources pendant une longue période. Il est préférable d'étirer uniformément la longue initialisation vers une initialisation par étapes/caractères dans OnCalculate, en calculant par morceaux.

C'est clair, pour ne pas ralentir d'autres programmes dans le terminal, mais il y a une contradiction : lors du calcul du modèle du portefeuille, l'indicateur a besoin de toutes les lignes de données en même temps, parce que l'équité du portefeuille est calculée par elles, c'est-à-dire qu'il ne peut rien calculer sans les données prêtes, et le portefeuille a besoin de tous les composants en même temps, et s'il y a plusieurs portefeuilles et si la comparaison ou la somme des portefeuilles est faite, alors il a besoin de tous les portefeuilles en même temps, et alors ce n'est pas beaucoup d'extension - ce n'est pas une fenêtre glissante qui peut être calculée en parties, ici le calcul est fait en premier. - C'est pourquoi j'ai soulevé la question d'une fonction standard universelle qui préparerait correctement un tableau de données synchronisées pour le calcul.

 
Vladimir Karputov:

Téléchargé à partir de

C'est la 18.10 maintenant et tout fonctionne.


Je vous félicite, vous avez eu de la chance et vous n'avez pas le bon processeur, la bonne mémoire, le bon système d'exploitation ou quoi que ce soit d'autre... mais cela ne signifie pas que le bug n'est pas réel.

C'est réel et ça ne m'arrive pas qu'à moi.

 
transcendreamer:

Ceci est compréhensible, afin de ne pas ralentir les autres programmes dans le terminal, mais il y a une contradiction : lors du calcul du modèle de portefeuille, l'indicateur aura besoin de toutes les lignes de données à la fois, parce que l'équité du portefeuille est calculée en les utilisant, c'est-à-dire, sans données prêtes il est impossible de calculer quoi que ce soit, et le portefeuille a besoin de tous les composants à la fois, et s'il ya plusieurs portefeuilles et s'il ya une comparaison ou une somme entre les portefeuilles, alors pour plusieurs portefeuilles, et alors il ne peut pas s'étirer, parce qu'il n'est pas une fenêtre coulissante qui peut être calculé en parties, ici d'abord le calcul est fait - C'est pourquoi j'ai posé la question d'une fonction standard universelle qui préparerait correctement un tableau de données synchronisées pour le calcul.

C'est le principal défaut. J'ai le même problème.

Le calcul et l'affichage fonctionnent instantanément dans mt4, mais il n'y a aucun problème avec les indicateurs dans mt5, alors que tous les graphiques dont j'ai besoin pour obtenir les prix sont toujours ouverts. Il s'avère que je ne peux écrire que des indicateurs simples, comme des MA à tampon unique(

 

Il y a définitivement un bug :

1) Server 2012 (build 9200) sur Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Mémoire : 3033 / 3839 Mb, Disque : 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, version virtuelle QEMU (cpu64-rhel6), Mémoire : 1340 / 2047 Mb, Disque : 15 / 28 Gb, GMT+2


 
Stanislav Dray:

Il y a définitivement un bug :

1) Server 2012 (build 9200) sur Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Mémoire : 3033 / 3839 Mb, Disque : 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, version virtuelle QEMU (cpu64-rhel6), Mémoire : 1340 / 2047 Mb, Disque : 15 / 28 Gb, GMT+2

J'en ai :

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400 @ 3.10GHz, Mémoire : 469 / 8182 Mb, Disque : 96 / 148 Gb, GMT+2

 
transcendreamer:

Ceci est compréhensible, afin de ne pas ralentir les autres programmes dans le terminal, mais il y a une contradiction : lors du calcul du modèle de portefeuille, l'indicateur aura besoin de toutes les lignes de données à la fois, parce que l'équité du portefeuille est calculée en les utilisant, c'est-à-dire, sans données prêtes il est impossible de calculer quoi que ce soit, et le portefeuille a besoin de tous les composants à la fois, et s'il ya plusieurs portefeuilles et s'il ya une comparaison ou une somme entre les portefeuilles, alors pour plusieurs portefeuilles, et alors il ne peut pas s'étirer, parce qu'il n'est pas une fenêtre coulissante qui peut être calculé en parties, ici d'abord le calcul est fait - C'est pourquoi j'ai posé la question d'une fonction standard universelle qui préparerait correctement un tableau de données synchronisées pour le calcul.

Vous devez rédiger l'indicateur en sachant clairement que vous ne recevrez pas tout en même temps.

Dans OnInit vous devriez stimuler le chargement de l'historique des instruments requis par des appels uniques de CopyXXX, mais vous devez attendre l'initialisation complète dans OnCalculate.

Votre phase d'initialisation semble avoir une erreur - vous attendez incorrectement des données et bloquez.

 
Renat Fatkhullin:

Mettez le code au travail. Jusqu'à présent, tout va bien.

Dossier sans corps, d'ailleurs.

Dans 2 heures tout va bien, la minuterie fait tic-tac dans les commentaires avec la bonne date.
 
Vitaly Muzichenko:

C'est le principal défaut. J'ai le même problème.

Dans mt4 le calcul et l'affichage fonctionnent instantanément, mais dans mt5 il y a un problème complet avec les indicateurs, bien que tous les graphiques à partir desquels vous voulez obtenir les prix soient toujours ouverts. Il s'avère que je ne peux écrire que des indicateurs simples, comme des MA à tampon unique(

Je ne vois pas de moyen universel et confortable de le faire. Je comprends que tout est fait pour accélérer le terminal et les programmes qui s'y trouvent.

 
Vitaly Muzichenko:

C'est le principal défaut. J'ai le même problème.

Dans mt4 le calcul et l'affichage fonctionnent instantanément, mais dans mt5 il y a un problème complet avec les indicateurs, bien que tous les graphiques à partir desquels vous voulez recevoir les prix soient toujours ouverts. Il s'avère que je ne peux écrire que des indicateurs simples, comme des MA à tampon unique(

Je dois regarder le code.

Dans le code ci-dessus, il y a clairement un tas de problèmes de logique et de ressources.

Raison: