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

Codage Trailingstop caché sur MT4

  • arcenciel

    Bonjour,

    Je suis à la recherche d'un code permettant de mettre en oeuvre un trailing stop caché (ou stop suiveur ) directement sur l'EA en evitant les "OrderModify" sur le serveur.
    J'en ai commencé le codage mais je voulais m'inspirer eventuellement d'autres systèmes existant.
    Merci d'avance
  • arcenciel — en réponse à arcenciel dans son message #90205

    Bonsoir,
    Je viens de terminer le codage de ma fonction "Trailingstop hidden", apparemment, les essais sont concluants, et comme ils s'effectuent sur l'EA, aucun problème de message surcharge coté serveur.
    Les variables globales du langage MQL4, sont utilisées pour mémoriser chaque valeur trailing stop,et permettent de par leur nom de differentier les stops sur plusieurs trades simultanés, elles sont ensuite effacées si la position est cloturée par la fonction.
    il convient donc de rajouter dans l'EA la ligne :
    if(OrdersTotal()==0)GlobalVariablesDeleteAll();
    lors de périodes sans trade, pour effacer les variables globales abandonnées par les autres clotures
    Attention GlobalVariablesDeleteAll() efface TOUTES les variables globales
    Le code est certainement à améliorer ...cependant, il fonctionne...

    Ce type de stop suiveur doit etre utilisé sur un serveur VPS, vu qu'il est généré et modifié par l'EA

    Code
    int TS; //Valeur Trailing stop int TS_Start; //Valeur seuil de départ void apply_hidden_trailingstop() { string nom_var_B, nom_var_S; for (int pos_0 = OrdersTotal() - 1; pos_0 >= 0; pos_0--) { OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY) { nom_var_B = StringConcatenate(DoubleToStr(OrderTicket(), 0), Symbol(), Period(), "B"); if (!GlobalVariableCheck(nom_var_B)) GlobalVariableSet(nom_var_B, 0); if (OrderStopLoss() < Bid - TS * pt && Bid > (OrderOpenPrice() + (TS + TS_Start) * pt) && GlobalVariableGet(nom_var_B) == 0) { GlobalVariableSet(nom_var_B, Bid - TS * pt); } if ((Bid - TS * pt) > GlobalVariableGet(nom_var_B) && GlobalVariableGet(nom_var_B) != 0) GlobalVariableSet(nom_var_B, Bid - TS * pt); if (GlobalVariableGet(nom_var_B) != 0 && Bid < GlobalVariableGet(nom_var_B) && (Bid - TS * pt) > OrderOpenPrice()) { OrderClose(OrderTicket(), OrderLots(), Bid, 3, Green); GlobalVariableDel(nom_var_B); } } if (OrderType() == OP_SELL) { nom_var_S = StringConcatenate(DoubleToStr(OrderTicket(), 0), Symbol(), Period(), "S"); if (!GlobalVariableCheck(nom_var_S)) GlobalVariableSet(nom_var_S, 0); if (OrderStopLoss() > Ask + TS * pt && Ask < (OrderOpenPrice() - (TS + TS_Start) * pt) && GlobalVariableGet(nom_var_S) == 0) { GlobalVariableSet(nom_var_S, Ask + TS * pt); } if ((Ask + TS * pt) < GlobalVariableGet(nom_var_S) && GlobalVariableGet(nom_var_S) != 0) GlobalVariableSet(nom_var_S, Ask + TS * pt); if (GlobalVariableGet(nom_var_S) != 0 && Ask > GlobalVariableGet(nom_var_S) && (Ask + TS * pt) < OrderOpenPrice()) { OrderClose(OrderTicket(), OrderLots(), Ask, 3, Green); GlobalVariableDel(nom_var_S); } } } } } //---------------------------------------------------------------------------------------------------------------------------------------


    Bon codage
    Modifié le 2014-01-20 23:01:03 par AliX
  • riden

    Salut,

    Parfois on peut se trouver avec au moins une position ouverte pendant plusieurs jours ou semaines et tu peux te trouver avec plein de variables globales donc il est mieux que tu supprimes chaque variable globale juste après la clôture de la position

    Code
    Orderselect....... if (OrderCloseTime()>0 for(int i=GlobalVariablesTotal().... // tu parcours les variables globales if( stringfind(GlobalVariableName(i),DoubleToStr(OrderTicket(), 0),0)!=-1) GlobalVariableDel(GlobalVariableName(i));

    c'est sûr qu'il y a plusieurs façon de faire ce genre de fonction
    Personnelement, j'utiliserais deux tableaux , si le nombre max de positions ouvertes en simultané sur la même paire est 5, un tableau int de 5 pour les orderticket et un tableau double de 5 équivalent pour les valeurs trailing et une fonction pour gérer les 2 tableaux sans passer par les variables globales
    Modifié le 2014-01-21 11:03:41 par riden
  • arcenciel

    Bjr
    Oui, tout à fait, c'est une solution qui de plus permet de cibler les variables globales utilisées par le trailingstop
    Ca évite de supprimer d'autres variables globales utlisées éventuellement par d'autres fonctions.
    Merci