Erreurs, bugs, questions - page 1520

 
Alexey Kozitsyn:
C'est dommage. Oui, un exit() comme en C++ serait bien. De nos jours, l'intégration de la réponse des fonctions imbriquées dans la fonction appelante est plutôt problématique. Et il n'y a pas de bibliothèque universelle.
Une autre solution consiste à créer une fonction qui supprime tous les objets d'un programme séparément et à l'appeler lorsque la condition de suppression du programme du terminal est remplie, suivie deExpertRemove(), dans ce cas tout devrait se terminer plus rapidement... bien que ce ne soit pas sûr :)
 
coderex:
Vous pouvez également créer une fonction distincte pour supprimer tous les objets du programme et l'appeler lorsque la condition de suppression du programme du terminal est remplie, suivie deExpertRemove(), dans ce cas, tout devrait se terminer plus rapidement... mais pas de façon certaine :)

Comme je l'ai déjà écrit, et comme cela a été suggéré dans un article sur ce site, en cas d'erreur dans une fonction imbriquée profonde, vous pouvez appeler la division par 0 ou quitter le tableau. Mais ce n'est pas agréable.

Oui, et il ne s'agit pas seulement de la POO (d'après ce que j'ai compris, vous le pensez). Tout simplement - si une erreur ne peut être corrigée, le programme sera interrompu.

 
Slawa:
S'arrête, mais pas immédiatement
Je ne comprends pas, est-ce que ExpertRemove() est correct pour travailler avec les indicateurs ou non ?
 
Alexey Kozitsyn:
Je ne comprends pas, est-il correct de travailler avec ExpertRemove() dans les indicateurs ou pas ?

Je pense qu'il existe une fonction pour les indicateurs, ou bien elle n'est plus pertinente.

ChartIndicatorDelete();
 
Alexey Kozitsyn:
Je ne comprends pas, est-il correct de travailler avec ExpertRemove() dans les indicateurs ou pas ?

Non. ExpertRemove() est superposé dans les indicateurs.

"S'arrête, mais pas immédiatement", dit-on à propos d'ExpertRemove en général. Cette fonction n'interrompt pas le fonctionnement du programme.

 
Slawa:

Non. ExpertRemove() est superposé dans les indicateurs.

"S'arrête, mais pas immédiatement", dit-on à propos d'ExpertRemove en général. Cette fonction n'interrompt pas le fonctionnement du programme.

En général, existe-t-il un plan pour résoudre le problème avec exit() ? Ou les utilisateurs le résolvent-ils à l'aide de béquilles) ?
 
Slawa:
Veuillez donner un exemple. Donnez le code source de l'indicateur pour illustrer le problème.
Insérez le texte dans le OnCalculate de l'indicateur par défaut créé dans le rédacteur. Placez-le sur n'importe quel tableau. Vous verrez le fonctionnement de l'indicateur dans le coin supérieur gauche de la fenêtre du graphique. Après avoir sélectionné "Supprimer" dans la liste des indicateurs, il ne cessera pas de fonctionner, vous le verrez dans le coin supérieur gauche. Elle se poursuit même après la fermeture de la fenêtre. Après avoir ouvert une nouvelle fenêtre, il se poursuivra dans la nouvelle fenêtre. De plus, cette fenêtre n'a pas nécessairement le même symbole que celle que vous aviez au début :)
Le travail de l'indicateur ne s'arrête que lorsque le terminal est fermé. Et je ne sais pas s'il s'arrête ou non - j'ai juste dû supprimer manuellement le terminal via le gestionnaire des tâches pour le redémarrer...

En même temps, l'aide de la fonction IsStopped indique que le fonctionnement du programme est interrompu de force après 3 secondes s'il y a une commande pour terminer le programme mql.

   int i=0;
   while(true){
      Comment(i++);
      Sleep(100);
   }

Et si while(true) est remplacé par while(!IsStopped()), l'indicateur se termine avec succès lorsqu'il est retiré du graphique.

 

Une raison amusante pour l'erreur interne du compilateur (fonction utilisée dans l'indicateur) :

void SaveData ( uint handle_, int wrdata_, int interv_, string dpath_, int tmode_, int tmult_, long ctime_, long& ltime_ )
{
int ierr, wrtint ;
// ----
if ( interv_ > 0 ) // mode travail
{
si ( MQLInfoInteger ( MQL_TESTER ) == 0 ) { wrtint = interv_ ; } // n'a pas de signification
sinon{ wrtint = interv_ * tmult_ ; } // n'a pas d'importance
//
si ( ( ctime_ - ltime_ ) >= ( wrtint * 60 ) ) // si cette ligne est commentée, l'erreur disparaîtra.
{
// un peu de code pour sauvegarder les données ... n'a pas de sens - testé
//
ltime_ = ctime_ ; // en général, cela ne compte pas non plus
} // si ( ( ctime_ - ltime_ ) >= ( wrtint * 60 )
} // si ( interv_ > 0 )
// ----
retour ;

} // void SaveData

(Désolé, je n'ai pas utilisé le bouton SRC intentionnellement, car je ne peux pas sélectionner les parties nécessaires du texte avec ce bouton).

Le remède est évident, mais vous devriez convenir que c'est un problème plutôt amusant. :)))

 

Une société de courtage a une commission de 16x2 dollars pour un chiffre d'affaires d'un million. Elle a apparemment fixé une commission de 16 dollars dans les paramètres du serveur. Et maintenant, pendant le test sur leur commission serveur, 16x2 est déduit de chaque transaction quelle que soit la taille du lot, c'est-à-dire que le test adéquat ne peut être fait qu'avec 10 lots.

Est-ce leur manque de compétence dans la configuration des serveurs ou une réelle limitation de MT5 ? Que puis-je leur conseiller de faire exactement sur les serveurs, pour que la commission soit traitée correctement dans le testeur ?

 
Ilya Malev:
Insérez le texte dans le OnCalculate de l'indicateur par défaut créé dans le rédacteur. Placez-le sur n'importe quel tableau. Vous verrez le fonctionnement de l'indicateur dans le coin supérieur gauche de la fenêtre du graphique. Après avoir sélectionné "Supprimer" dans la liste des indicateurs, il ne cessera pas de fonctionner, vous le verrez dans le coin supérieur gauche. Elle se poursuit même après la fermeture de la fenêtre. Après avoir ouvert une nouvelle fenêtre, il se poursuivra dans la nouvelle fenêtre. De plus, cette fenêtre n'a pas nécessairement le même symbole que celle que vous aviez au début :)
Le travail de l'indicateur ne s'arrête que lorsque le terminal est fermé. Et je ne sais pas s'il s'arrête ou non - j'ai juste dû supprimer manuellement le terminal via le gestionnaire des tâches pour le redémarrer...

En même temps, l'aide de la fonction IsStopped indique que le fonctionnement du programme est interrompu de force après 3 secondes s'il y a une commande pour terminer le programme mql.

Et si while(true) est remplacé par while(!IsStopped()), l'indicateur se termine avec succès lorsqu'il est retiré du graphique.

Tout est clair. Nous avons fait une indulgence pour la suppression normale.

Quand le terminal fermera, ce sera dur. Pas plus de 3 secondes.

Et je ne suis pas sûr que nous allons écrire cela dans la documentation, 1. pour ne pas se laisser aller à écrire des indicateurs aussi imprudents (avez-vous écrit cela pour vérifier ?) 2. Aussi relâché, aussi serré.

Raison: