Erreur numéro 6 - page 29

 
journaux envoyés. <br / translate="no">Où dois-je mettre ce code ?
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000) ; GlobalVariableSet(strTradeSemaphore, 0.0) ;


à la sortie de la fonction de démarrage
 
Essayé Sleep()
Jusqu'à 100000 sans amélioration visible

Remplacé par
if(!IsTesting()) { Sleep(1000) ; GlobalVariableSet(strTradeSemaphore, 0.0) ; }


à l'adresse

while(!IsStopped() && !IsTradeAllowed()) Sleep(1000) ; GlobalVariableSet(strTradeSemaphore, 0.0) ;



Même poivre.
Erreur 146.

 
Après un certain temps, en y réfléchissant, il s'est avéré qu'il existe une méthode exacte. Je vais essayer de la formuler<br/ translate="no">
while(!IsStopped() && !IsTradeAllowed()) Sleep(1000) ; GlobalVariableSet(strTradeSemaphore, 0.0) ;


c'est-à-dire que nous attendons nous-mêmes que notre propre contexte de transaction soit libéré

et en général, c'est une situation extrêmement étrange. après avoir effectué une opération de transaction, le contexte est libéré instantanément. sinon, il serait impossible de fermer des positions en boucle.



Encore une fois.

Le code ci-dessus fera en sorte que le conseiller expert se bloque, si le drapeau de transaction a été désactivé.
Cela entraînera l'arrêt complet du commerce, car personne ne signalera le sémaphore. Cette situation est au moins quelque peu contrôlable, car le drapeau ne peut être retiré que manuellement.
Le cas du sémaphore est encore pire. GlobalVariableSet peut tomber sur un autre EA, lorsque ce dernier ferme le sémaphore. Par conséquent, plusieurs EA tenteront de négocier en même temps.
Comme nous le voyons, les développeurs ne comprennent pas ce que sont les processus asynchrones qui se déroulent dans le terminal. Et ce malentendu s'exporte dans le forum.
Il n'est pas étonnant que des erreurs fatales, comme celle dont il est question ici, apparaissent et que ces erreurs ne puissent être corrigées.

Pourquoi donner des conseils préjudiciables?
 
Pourquoi donner des conseils à вредные?

L'hypothèse est que si le conseiller a atteint ce point, alors le drapeau de négociation est maintenu !
 
Зачем давать вредные советы?

l'hypothèse est que si l'EA a atteint ce point, alors le drapeau de trading est levé !

Sur quoi repose cette hypothèse ? Lorsque les hypothèses ne correspondent pas à la réalité, des erreurs inattendues se produisent.
Le drapeau n'est rien.
Synchronisation, mutex, ressources partagées - le problème est réel. Il est absurde de suggérer de résoudre ce problème avec des variables globales au niveau de l'utilisateur. D'autant plus que l'exemple est irréalisable.
 
Depuis minuit hier soir, les experts travaillent sur la démo MQ et la démo Alpari. Pendant tout ce temps, il n'y avait pas d'erreur 128 non plus, sur Alpari il y avait une erreur 6 (erreur de ping), et sur les deux - plusieurs vieux tics. Les commandes ont fonctionné sans erreur. Build 1.8.3 du 05.10. Peut-être est-ce quelque chose d'autre ? Par exemple, les particularités de la connexion par le port 443 chez différents fournisseurs d'accès à Internet ? MT3 avait des erreurs, mais pas autant.


Hélas. "Depuis minuit le soir" n'est pas une statistique. Pour des raisons inconnues, les problèmes arrivent par vagues, puis aucun, puis plusieurs à la fois...
 
<br / translate="no">Quark, ayez une conscience, ne postez pas de tels journaux sur le forum =)))))


J'ai pensé - qui s'en soucie (ton de violoniste de Kindzadz) :)))


En ce qui concerne la réalité de la fermeture/ouverture - j'ai des contrôles dans toutes les fonctions f et des erreurs apparaissent, mais ce sont des erreurs FALSE. J'ai vérifié les journaux et l'historique des ordres, toutes les positions étaient fermées. L'ordre n'a tout simplement pas eu le temps de se déplacer dans l'histoire. J'ai fait un délai d'une seconde avant de vérifier - mais ce n'est pas suffisant... Quand j'ai demandé, ils ne m'ont pas donné de réponse.


Bon point. Mais j'ai eu des cas où, même une heure plus tard, la commande n'a pas avancé, c'est-à-dire que parfois, elle n'est pas fausse.
J'ai aussi un délai de 10 secondes.
 
C'est un bon point. Mais j'ai eu des cas où, même une heure plus tard, la commande n'était toujours pas passée, c'est-à-dire qu'elle n'était parfois pas fausse. <br / translate="no">J'ai également un retard de 10 secondes chacun.

Toutes mes erreurs, comme il s'est avéré, étaient dans le code =) c'est-à-dire que j'ai fait la mauvaise vérification après la fermeture de l'ordre.
Après l'avoir corrigé - il n'y en a pas. C'est vrai que peu de temps s'est écoulé, nous devons attendre...
 
<br / translate="no">toutes mes erreurs semblaient être dans le code =) c'est-à-dire que j'ai fait la mauvaise vérification après orderclose.
Après l'avoir corrigé - il n'y en a pas. C'est vrai qu'il ne s'est pas passé beaucoup de temps, il faudra attendre...


Comment se présente le code corrigé ?
 
A quoi ressemble le code corrigé ?

pour l'ordreclaus :
//---- vérifier si la position a été fermée et si ce n'est pas le cas, sortir l'information et sortir en retournant -5 for ( int x = 0 ; x < 5 ; x ++ ) { Sleep(1000) ;
		if ( OrderSelect( Close_OrderTicket, SELECT_BY_TICKET ) { if ( OrderCloseTime() <= 0 ) { Processing_Error ( 0, "OrderClose" ) ; _Return_ ( 3, "Error", 0, "Position was not closed", "OrderClose(...)", "La position n'a pas été fermée" ) ; return(-5) ; } else { break ; } } Close_GetLastError = GetLastError() ; _Print_ ( 3, "OrderSelect( " + Close_OrderTicket + ", SELECT_BY_TICKET )", "Error #" + Close_GetLastError + " ( " + ErrorDescription( Close_GetLastError ) + " )" ; } ; }.


pour ordersand - juste une 5x tentative de sélectionner un ordre avec une seconde pause,
pour modifiersand - comparer les anciennes valeurs avec les valeurs actuelles