Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

AccountBalance - Bug ou incompréhension ?

  • Echo

    Bonjour à tous,

    Je trade et je développe depuis plus de 5 ans mes propres EA sur MT4. Je suis très à l'aise en programmation et MT4 n'a pas vraiment de secrets pour moi. Cependant, (et pour la premier fois) j'ai le sentiment que la fonction AccountBalance n'est pas vraiment en mesure de donner une information juste.

    Corriger si je me trompe... car je suis en train de devenir zinzin à un point que je remet tout en doute.

    AccountBalance se met à jour à chaque trade clôturé !!! Si c'est le cas, comment peut-il garder la même valeur consécutive alors qu'un nombre important de position ont été clôturé avec des sommes (positive ou négative) différents.

    J'ai loupé un épisode ???

    Merci d'avance pour vos témoignage :)

    Franco
  • Echo

    Toute la nuit à faire des tests. J'affirme et je confirme ... Accountbalance NE se met PAS toujours à jour à chaque clôture de position....

    Encore un bug à contourner :(
  • liva

    Heu c' est étrange oui, il devrait se mettre à jour quand un trade se clôture, tu peux envoyer ton code ?
  • Echo

    Il se met à jour oui et non, j'ai la réponse, mais c'est pas évident à expliquer. Ce soir, j'apporterai une explication.

    En gros, il s'agit d'un problème d'approche concernant la gestion d'un Return, à savoir, dans la façon dont l'EA lit un Return.

    1 - Lecture du Return...
    2 options ....
    A ) On lit le Return sur la POSITION.
    B ) On lit le Return sur la BALANCE.

    2 - Traitement en fonction du Return...
    A ) Return positif : blabla1...
    B ) Return négatif : blabla2...

    Dans mon cas, et je suppose la plus pars d'entre vous. Une position se ferme (TP ou SL) et l'EA agit alors en fonction de cette position fermée..
    ... On a ici une une lecture du Return sur la position et non sur la balance.

    Lorsque vous analyser une série de position fermé "simultanément", cette lecture est, elle, séquentielle.
    Après analyse de la position fermé (dans le sens de la lecture séquentielle), l'EA analyse et prend les décisions au moment de cette lecture. Logique sauf que la balance a été plus vite et si vous devez utiliser cette balance pour définir une action à suivre, c'est pas top.

    Exemple : Imaginons X positions fermées "simultanément" et lecture séquentielle pour P2, P3, P4
    Position 1... time = 10h45.30
    Position 2... time = 10h45.32
    Position 3... time = 10h45.32
    Position 4... time = 10h45.32
    Position 5... time = 10h45.33
    Position 6... time = 10h45.34
    ....
    La lecture de la balance sur P2, P3 et P4 est le même montant alors que les RETURN sont différents.
    Sur ces positions, j'ai constaté que le time était identique (en théorie car MT4 ne va pas au delà de la seconde).
    C'est la le problème. A une lecture P+x, la balance ne correspond pas aux donnée qui lui sont associé.
  • Echo

    Image fichier LOG
    Echo a joint une image
    accountbalance-bug-ou-incomprehension-8342
  • liva

    Comme je n' ai pas ton code sous les yeux, je ne peux rien affirmer avec certitude.
    Mais il semblerait que tu sois trop pressé, ton "simultanément" me fait un peu peur.
    La question est simple, attends-tu le callback de l' OrderSend() avant de relever le BalanceAccount() et d' envoyer l' OrderSend() suivant ?
    Car la fonction OrderSend() prend un "certain" temps à s' exécuter, elle peut même renvoyer un requote si l' exécution est trop longue.

    Autrement dit, il est fort probable que tu sois entrain d' envoyer plusieurs OrderSend() "simultanément" et que tu ne laisses pas le temps au serveur du broker de répondre entre deux : "OK, position fermée, la balance est maintenant de TANT" .
    Il finit par exécuter tous tes ordres, la finalité est la même, mais entre temps la maj. de la fonction AccountBalance() n' a pas suivie de manière synchronisée comme tu le voulais.

    Utiliser l' AccountBalance() comme une variable importante dans ton code est une mauvaise idée.
    Entre toi et les variables relatives à l' account, il y' a le réseau ...
    Tu devrais plutôt appuyer ton code sur des fonctions persos qui te retournent les profits pour tel ou tel marché.
  • liva

    Pardon dans ton exemple, c' est l' OrderClose() qui est concerné.
    Mais OrderSend(), OrderClose(),OrderModify() -> même combat.
  • forexensemble

    Salut,

    Comme l'explique liva, le décalage vient de l'exécution de la requête client/serveur.
    Ce n'est pas un bug ; c'est juste le fait que ton 2ème OrderClose() est exécuté avant que le résultat du premier ne soit revenu.

    Une solution pourrait être quelque chose comme ça :
    Code
    double dBalance=AccountBalance(); OrderClose(); While(dBalance==AccountBalance()} { Sleep(100);//pause de 100 ms }
    Ce code doit bien entendu tenir compte du cas ou OrderProfit()==0 au moment du OrderClose().
    Il faut aussi implémenter un compteur pour sortir de la boucle au cas ou la connexion Internet est coupée.

    J'espère que cette idée te donne une piste.

    Dans mes EA, je stocke AccountBalance() dans une variable globale pour pouvoir comparer à tout moment l'état avant et après un OrderClose() si j'ai besoin de le faire.
    Modifié le 2013-12-13 13:17:27 par forexensemble
  • Echo

    Merci Liva pour ton retour,
    Je connais ce problème lié à l'envoi d'une position ou d'une modification.
    Mon code est truffé de fonctions de contrôle pour éviter ce genre (et bien d'autres) problème.
    D'ailleurs, dans mon cas, un traitement ne peux avoir lieu sans que les résultats de la fonction précédente ne soit validées.
    Et c'est dans le cadre du développement d'une nouvelle stratégie/setup, que je découvre le coté obscur de AccountBalance.
    Il était logique pour moi que si le résultat de Orderclose est OK, AccountBalance est lui à jour.
    Mon EA vérifie la condition (Orderclose = True) avant de passer à l'étape suivante.
    Si maintenant je ne peux me fier à ce retour, je vais devoir adapter. Je vais donc revoir certaines fonctions.

    Mon EA pèse pas loin des 480Ko non compilé, et un nombre important de fonctions. Donc pour la lecture, c'est chaud.

    ( Tiens ta photo me rappelle Chipeur sur un autre forum :) )

    Merci aussi à toi ForexoMatic,

    J'allais justement dans cette direction. Week-End en mode programmation.
    Je ne manquerais pas de vous informer sur une solution.

    Franco.
  • forexensemble — en réponse à Echo dans son message #88231

    Echo, le 13/12/2013 dit :
    Et c'est dans le cadre du développement d'une nouvelle stratégie/setup, que je découvre le coté obscur de AccountBalance. Il était logique pour moi que si le résultat de Orderclose est OK, AccountBalance est lui à jour.

    En fait, un process client/serveur n'a pas de "coté obscure". Cela ne peut simplement pas fonctionner autrement. Simplement, il manque dans mt4 une fonction du genre AccountUpdated() qui renverrait le statut de la requête. Comme ça n'existe pas, faut "bricoler" une solution soi-même.