Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Veuillez utiliser le bouton </> pour insérer votre code.
Mes excuses... Voici le format correct...
OrdersTotal() pas correct...
J'ai été surpris par une séquence de code en boucle qui utilise OrdersTotal() ne donnant pas des résultats corrects (observé avec deux brokers différents).
J'utilise MT4 version 1090 sur un ordinateur de bureau Linux Ubuntu-MATE 16.04, avec WINE 3.0.
Voici ce que j'ai utilisé...
Voici la situation :
J'ai remarqué avec deux courtiers différents que la valeur OrdersTotal() ne correspond pas toujours à ce qui est affiché dans l'onglet 'Trade' du courtier MT4. Au départ, j'ai pensé que c'était le courtier qui empêchait OrdersTotal() de fonctionner correctement. Lorsque j'ai remarqué sur le deuxième courtier, j'ai commencé à me demander si MT4 avait un 'problème' interne, ou si mon code était erroné OU si c'était un problème de synchronisation de MT4 avec le serveur.... ?
Après avoir lu ce fil de discussion du forum, je me demande si j'obtiendrais de meilleurs résultats en modifiant la boucle for..loop pour lire :
OU, existe-t-il un drapeau ou une ligne de code permettant de s'assurer que la fonction OrdersTotal() est correctement synchronisée pendant un événement OnTick() ?Toute clarification à ce sujet serait très utile et serait grandement appréciée !
C'est l'une des erreurs les plus courantes que je vois, probablement due en partie à des déchets tels que Expert Advisor Builder. J'ai donc pensé qu'il était temps de consacrer un fil de discussion à ce sujet afin de pouvoir y faire référence à l'avenir.
Le problème
Prenons un exemple simple ; nous voulons une fonction pour fermer tous les ordres ouverts pour notre EA, il y a beaucoup d'exemples mais créons-en un à partir de zéro.
Nous avons besoin d'une boucle parce que nous voulons fermer tous nos ordres pour un EA spécifique, dans cette boucle nous aurons du code pour sélectionner l'ordre, du code pour vérifier que le symbole et le numéro magique sont corrects et enfin du code pour fermer l'ordre :
Ce code est mauvais. . . NE L'UTILISEZ PAS. . . Je vais vous expliquer pourquoi dans la section suivante...
L'explication
Travaillons à travers le code ci-dessus... ligne par ligne, ordre par ordre....
Supposons que nous avons les ordres suivants que nous voulons clôturer, ils ont tous le même numéro magique et le même symbole que notre EA, donc nous voulons que notre code les clôture tous :
1er passage dans la boucle :
la valeur initiale de PositionIndex est 0 donc l'ordre en position 0 est sélectionné, le ticket numéro 111, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit :
2ème passage dans la boucle :
maintenant la valeur de PositionIndex est 1 donc l'ordre en position 1 est sélectionné, le ticket numéro 333, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit:
3ème passage dans la boucle :
maintenant la valeur de PositionIndex est 2 donc l'ordre en position 2 est sélectionné, le ticket numéro 555, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit:
4ème exécution de la boucle :
maintenant la valeur de PositionIndex est 3 OrderSelect() essaie de sélectionner l'ordre à la position 3 et échoue, le continue prend l'exécution du code à la valeur suivante dans la boucle ...
5e et dernière exécution de la boucle :
maintenant la valeur de PositionIndex est 4 OrderSelect() essaie de sélectionner l'Ordre à la position 4 et échoue, le continue prend l'exécution du code à la valeur suivante dans la boucle ... la boucle est terminée.
Nous nous retrouvons avec deux commandes, les tickets 222 et 444, qui auraient dû être fermés mais ne l'ont pas été... Comment résoudre ce problème ?
La solution
Le code suivant est l'approche correcte pour fermer des ordres ouverts ou supprimer des ordres en attente...
La différence essentielle est que la boucle décrémente de ( TotalNumberOfOrders - 1 ) à 0
.
Reprenons le code ci-dessus... ligne par ligne, ordre par ordre...
Nous avons les mêmes ordres que précédemment :
1er passage dans la boucle :
la valeur initiale de PositionIndex est TotalNumberOfOrders - 1 qui est égal à 5 - 1 = 4, donc l'ordre en position 4 est sélectionné, ticket numéro 555, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit :
2ème passage dans la boucle :
maintenant la valeur de PositionIndex est 3 donc l'ordre en position 3 est sélectionné, le ticket numéro 444, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit:
3ème passage dans la boucle :
maintenant la valeur de PositionIndex est 2 donc l'ordre en position 2 est sélectionné, le ticket numéro 333, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit:
4ème passage dans la boucle :
maintenant la valeur de PositionIndex est 1 donc l'ordre en position 1 est sélectionné, le ticket numéro 222, cet ordre est supprimé avec succès et les ordres restants changent de position comme suit:
5ème et dernière exécution de la boucle :
maintenant la valeur de PositionIndex est 0 donc l'ordre en position 0 est sélectionné, ticket numéro 111, cet ordre est supprimé avec succès, la valeur 0 est la dernière valeur valide pour la boucle ... la boucle est terminée.
Nous avons supprimé avec succès tous nos ordres correspondants....
Lien vers cette discussion : Boucles et fermeture ou suppression d'ordres
J'ai parcouru ce fil de discussion en lisant sur la sélection des ordres. En effet, j'ai un code où je pense avoir fait les choses correctement mais la sélection ne fonctionne pas pour moi car je ne peux pas lire le OpenPrice de l'ordre sélectionné. Tout le reste fonctionne bien, juste cette partie du code fournie. Je ne sais pas pourquoi.
L'ensemble du code comporte 4 sections où je dois appeler le OrderOpenPrice juste après l'envoi de l'ordre... OrderSend fonctionne bien, OrderSelect ne me donne pas les résultats dont j'ai besoin. Référez-vous à une section du code si vous pouvez m'aider.
Merci.
Merci, cherSimon Gniadkowski,
Votre article m'a vraiment fait gagner du temps.
Voici le code que je propose pour la fermeture des ordres de marché.
Et je suggère que c'est la manière correcte d'utiliser une boucle forward for (pour se conformer aux règles FIFO des courtiers américains).
Dans la boucle avant,
Boucles et fermeture ou suppression d'ordres - Forum de programmation MQL4
Pour le FIFO ( courtiers américains,)et que vous traitez (potentiellement) plusieurs ordres par symbole, vous devez Trouver l'ordre le plus ancien, le fermer, et sur une opération réussie, retraiter toutes les positions restantes.
CloseOrders by FIFO Rules - Strategy Tester - MQL4 programming forum - Page 2 #16
Quelles sont les valeurs de retour des fonctions ? Comment les utiliser ? - Forum de programmation MQL4
Erreurs courantes dans les programmes MQL4 et comment les éviter - MQL4 Articles
Vous savez à quel point cela m'a aidé. Pas seulement avec le code sur lequel je travaillais, mais avec ma compréhension totale. Il fonctionne parfaitement maintenant et j'ai la possibilité de le mettre en œuvre de différentes manières.
J'apprécie vraiment cette information.