Erreurs, bugs, questions - page 2243

 

J'ai essayé de télécharger une nouvelle version de l'indicateur sur le marché. Le test s'est terminé avec des erreurs. Rapport d'erreur comme sur l'image en annexe avec le contenu suivant :

test sur EURUSD,H1 (netting) test sur XAUUSD,D1 (netting) test sur GBPUSD,M30 (netting) test sur EURUSD,M1 (netting) 2016.05.31 21:45:00 Violation d'accès à 0x00007FF7FD1CA04B lu à 0xFFFFFFFFFFFFFF 2016.05.31 21:45:00 00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA015 53 push rbx 2016.05.31 21:45:00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016.05.31 21:45:00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00007FF7FD1CA033 E88852CAFF call 0x7ff7fce6f2c0 ; #2504 (metatester64.exe) 2016.05.31 21:45:00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 2016.05.31 21:45:00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016.05.31 21:45:00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
Peut-être que le problème se trouve dans le testeur ?
Dossiers :
 
Artyom Trishkin:

Pourquoi avez-vous mélangé les deux styles ? Si vous utilisez la première ligne pour définir le code de la flèche, utilisez la deuxième ligne dans le même style :

Merci, ça m'a aidé.

2 styles ? Je ne savais pas pour les styles. C'est juste qu'auparavant vous ne pouviez faire cette section que de cette façon. Il y a eu un changement. Je programme en MQL4 depuis plus de 10 ans. Et maintenant les développeurs ont changé le langage et beaucoup de mes codes ne fonctionnent plus. Je suis très déçu. Les changements n'étaient pas pour le mieux. Cela signifie que je dois refaire une énorme quantité de codes. Même s'ils sont vieux, ils ont été beaucoup utilisés.

 
Gennadiy Stanilevych:

J'ai essayé de télécharger une nouvelle version de l'indicateur sur le marché. Le test s'est terminé avec des erreurs. Rapport d'erreur tel que présenté dans l'image en annexe avec le contenu suivant :

Peut-être le problème se situe-t-il au niveau du testeur ?

Veuillez créer une demande auprès de servicedesk, nous allons trouver une solution.


UPD : J'ai trouvé votre demande.
 
Artyom Trishkin:

Libère le tampon de tout tableau dynamique et fixe la taille de la dimension zéro à 0.

Lors de l'écriture de scripts et d'indicateurs, la nécessité d'utiliser la fonction ArrayFree() peut se présenter rarement, car toute la mémoire utilisée est immédiatement libérée, et dans les indicateurs personnalisés, le travail principal avec les tableaux est représenté par l'accès aux tampons des indicateurs, dont les tailles sont automatiquement gérées par le sous-système exécutif du terminal.

Si vous devez gérer la mémoire dans des conditions dynamiques complexes dans votre programme, la fonction ArrayFree() vous permettra de libérer explicitement et immédiatement la mémoire occupée par un tableau dynamique qui n'est plus nécessaire.

Vous voyez ? Inutile.

Naturellement, une fois que la mémoire est libérée, et que vous l'allouez à nouveau en assignant une taille au tableau, personne ne peut garantir son contenu.

Utiliser l'initialisation du tableau : ArrayInitialize()

Que voulez-vous dire, personne ne garantit le contenu ? Si la mémoire a été libérée, elle a disparu, alors comment faire pour y mettre des déchets ? Ou est-ce que le fait d'effacer la mémoire implique de donner la permission à cette mémoire d'être utilisée par une autre partie du programme, sans pour autant l'effacer ?

 
Aleksey Vyazmikin:

Comment ça, personne ne garantit le contenu ? Si la mémoire a été effacée, elle n'est plus là, alors comment se fait-il qu'elle contienne des déchets ? Ou est-ce que le fait d'effacer la mémoire implique de donner la permission à cette mémoire d'être utilisée par une autre partie du programme, sans pour autant l'effacer ?

ArrayResize ne nettoie pas la mémoire, c'est pourquoi elle contient des déchets, provenant du "consommateur" précédent.

Ceci est fait pour la rapidité, car une fois la mémoire allouée à un tableau, dans 99,99(9)% des cas, l'utilisateur va le "remplir" avec ses données.


 
Vitaly Murlenko:

Merci, ça m'a aidé.

Deux styles ? Je ne savais pas pour les styles. C'est juste qu'auparavant vous ne pouviez faire cette section que de cette façon. Il y a eu un changement. Je programme en MQL4 depuis plus de 10 ans. Et maintenant les développeurs ont changé le langage et beaucoup de mes codes ne fonctionnent plus. Je suis très déçu. Les changements n'étaient pas pour le mieux. Cela signifie que je dois refaire une énorme quantité de codes. Ils sont peut-être vieux, mais ils étaient bien plus utiles.

N'est-ce pas ainsi que le code de flèche était défini avant l'introduction des fonctions ObjectSetXXX de mql4 ?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

J'écris également en mql depuis environ 10 ans (peut-être plus - comme le temps passe vite...) - je commence à oublier les fonctions strictement quaternaires - j'écris du code multiplateforme quand c'est possible.

 
Ilyas:

ArrayResize ne vide pas la mémoire, c'est pourquoi elle contient des déchets du "consommateur" précédent.

Ceci est fait pour la rapidité, car après l'allocation de mémoire à un tableau, dans 99,99(9)% des cas, l'utilisateur va le "remplir" avec ses données.


Alors pourquoi les valeurs numériques sont-elles des constantes "poubelles", même après le redémarrage du terminal ?

Personnellement, je me suis retrouvé coincé avec la simple addition du contenu des cellules d'un autre tableau, et je me suis longtemps posé le problème.

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

Alors pourquoi les valeurs numériques sont-elles des constantes "poubelles", même après le redémarrage du terminal ?

Personnellement, je me suis fait griller sur une simple sommation du contenu des cellules d'un autre tableau, et je me suis longtemps demandé ce qui n'allait pas.

Peu importe le type de données contenues dans le tableau non initialisé, à tout moment, les données peuvent changer, personne ne garantit leur valeur.
C'est pourquoi l'utilisation de variables non initialisées (mémoire de lecture) conduit parfois à des situations où il faut beaucoup de temps pour trouver la cause :

  1. Fonctionne sur un ordinateur, pas sur l'autre
  2. Fonctionne dans le terminal, pas dans le testeur
  3. Le terminal/OS a été mis à jour et le programme se comporte différemment
  4. L'impression ajoutée a cessé de fonctionner.
  5. etc.

Je ne peux que donner quelques conseils.
Vous devriez prendre l'habitude de toujours initialiser les données, afin de ne pas perdre beaucoup de temps à l'avenir à rechercher des erreurs liées à l'absence d'initialisation.

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

Comment ça, personne ne garantit le contenu ? Si la mémoire a été effacée, elle n'est plus là, alors comment se fait-il qu'elle contienne des déchets ? Ou est-ce que le fait d'effacer la mémoire implique de donner la permission à cette mémoire d'être utilisée par une autre partie du programme, sans pour autant l'effacer ?

Que voulez-vous dire par "non" ? Vous ne retirez pas la carte mémoire de la fente de la carte mère. Et si la mémoire est présente et qu'elle est libérée (pas initialisée avec une valeur, mais libérée), alors elle commence à être utilisée pour d'autres besoins du programme.

 
Ilyas:

Peu importe les données contenues dans un tableau non initialisé, à tout moment, les données peuvent changer, personne ne garantit leur valeur.
C'est pourquoi l'utilisation de variables non initialisées (mémoire de lecture) conduit parfois à des situations, avec une longue recherche de la cause :

  1. Fonctionne sur un ordinateur, pas sur l'autre
  2. Fonctionne dans le terminal, pas dans le testeur
  3. Après la mise à jour, le programme terminal/OS se comporte différemment.
  4. J'ai ajouté Imprimer, ça ne marche plus.
  5. etc.

Je ne peux que donner quelques conseils.
Vous devriez prendre l'habitude de toujours initialiser les données, afin de ne pas perdre beaucoup de temps à l'avenir à rechercher des erreurs liées à l'absence d'initialisation.

Merci pour les précisions et les conseils.