Caractéristiques du langage mql4, subtilités et techniques - page 35

 
fxsaber #:

Alors maintenant, je me demande comment passer en revue TOUTES les commandes en UNE seule fois.

Je ne sais pas trop quoi faire, mais j'essaie de l'écrire de manière à ce que de tels dérapages n'entraînent pas de conséquences critiques.

La probabilité diminuera, mais sans la diversification et la complication de la gestion des comptes.

 
Andrei Trukhanovich #:

Vous pouvez aussi répartir les robots sur différents comptes.

Puis interdire, par exemple, l'expiration des ordres de mise à l'écart. En général, une béquille.

Une nécessité de base avec une particularité aussi malheureuse. Apparemment, pour le faire par le biais d'instantanés en quelque sorte.

 
fxsaber #:

Merci pour cette réponse détaillée ! Maintenant, je me demande comment passer en revue TOUTES les commandes en une seule fois.

Pourquoi ne pas se souvenir de la première et de la dernière commande (ticket) ?

et une fois le cycle terminé, vérifiez que le premier et le dernier ordre ont les mêmes tickets qu'avant le comptage.

   int n  = OrdersTotal();
   
   if(n == 0) return(0.0);
   else if(n == 1 && OrderSelect(0, SELECT_BY_POS)) return(OrderLots());
   
   int t_last = OrderSelect(n - 1, SELECT_BY_POS) ? OrderTicket() : -1;
   int t_first = OrderSelect(0, SELECT_BY_POS) ? OrderTicket() : -1;


SZY : assez logiquement, OrderSelect() devrait être responsable de cette collision - il devrait retourner false dans le cas où la table des commandes a changé, mais je ne me souviens pas avoir lu quelque part sur le forum que OrderSelect() a retourné false, je n'ai pas non plus rencontré de gestionnaires d'erreurs pour OrderSelect().

 
Igor Makanu #:

peut se souvenir de la première et de la dernière commande (ticket) ?

Sans une mémorisation complète de la séquence des tickets, une telle solution est vouée à l'échec.

 
fxsaber #:

Si vous ne vous souvenez pas complètement de la séquence des billets, cette solution échouera.

Et la sauvegarde complète des tickets entraînera également des échecs car, pendant que nous tournons en boucle, l'état des commandes déjà traitées peut changer.


bien sûr, je ne suis pas sûr, mais si un ordre est fermé lorsque nous sommes dans le cycle, le OrderTotal() changera

si l'ordre est fermé et qu'un nouvel ordre s'ouvre, alors le ticket et/ou OrderSelect(0) ou OrderSelect(OrderTotal()-1) seront modifiés


et à votre avis, quelle situation pourrait se produire, de sorte que les "ordres extrêmes" précédents et l'OrderTotal() lui-même restent ?

 
Igor Makanu #:

et à votre avis, quelle situation pourrait se produire pour garder les mêmes "ordres extrêmes" et le OrderTotal() lui-même ?

Il est fort probable que le OrdersTotal change lorsque la table des commandes est secouée.

Et puis il est possible que les limiteurs soient rechargés et qu'un poste supplémentaire soit créé.

 
Igor Makanu #:

peut-on mémoriser le premier et le dernier ordre (ticket) ?

se souvenir du premier ne fait rien

 
fxsaber 'appel de la fonction? Ou bien cela comptera-t-il deux fois.

En d'autres termes, qu'advient-il de l'indexation lorsqu'un ordre est supprimé ou apparaît pendant l'énumération ?

Je collecte un ensemble de billets et je travaille avec.
Si le total des commandes, le solde ou la marge ont changé, la liste doit être recréée.

Ainsi, EA ne travaille toujours qu'avec ses propres billets sélectionnés.

 
Andrei Trukhanovich #:

se souvenir que le premier ne fait rien

il s'agit de particularités de la mise en œuvre de l'architecture, qui ne sont pas documentées et que personne ne peut garantir à l'avenir...

Notez OrderTotal() etOrdersHistoryTotal(), et les tickets des dernières commandes

si ces valeurs changent après les calculs de la boucle, alors on traite


Mais il ne peut y avoir de solution universelle et fiable - il s'agit ici de deviner ce qui va se passer sur le serveur, comment les données sont transmises par le réseau et ce qui se passe dans les graphiques adjacents du terminal )))).


La seule chose à espérer est la vitesse de OrderSelect() - si je me souviens bien, c'est plus d'un million d'appels par seconde

 
fxsaber #:

Sans une mémoire complète de la séquence de billetterie, une telle solution est vouée à l'échec.

Il n'est peut-être pas coûteux de s'en souvenir, mais il peut être coûteux de suivre l'état complet. Je suis d'accord avec les précédents, réduisez la charge par une logique de vraisemblance et de priorités.

Le monde asynchrone dans lequel nous vivons ne garantit pas l'ordre des réponses à l'ordre des demandes, ni même l'ordre tout court.