Bonjour,
je cherche à créer un trailing stop qui est connu que dans l'EA (donc pas envoyé au broker).
Cela évite les erreurs 130 et permet d'être entièrement libre au niveau du TS :)
Je pense que pour réaliser ça il faut stocker tous les trades dans un tableau (indexé par le numéro de ticket) pour y placer le TS et pourquoi pas d'autres infos. Le problème c'est que j'ai du mal avec les tableaux MQL. Peut être qu'il y a une autre façon de faire, je ne sais pas je débute en MQL.
Peut être qu'un pro pourra m'aider, mon code est faux mais c'est pour montrer la logique :
je cherche à créer un trailing stop qui est connu que dans l'EA (donc pas envoyé au broker).
Cela évite les erreurs 130 et permet d'être entièrement libre au niveau du TS :)
Je pense que pour réaliser ça il faut stocker tous les trades dans un tableau (indexé par le numéro de ticket) pour y placer le TS et pourquoi pas d'autres infos. Le problème c'est que j'ai du mal avec les tableaux MQL. Peut être qu'il y a une autre façon de faire, je ne sais pas je débute en MQL.
Peut être qu'un pro pourra m'aider, mon code est faux mais c'est pour montrer la logique :
Code
// Le stop loss initial
sl = 40;
// La limite de pip à laquelle on envoi le stop loss au broker (par prudence au cas où la connexion entre l'EA et le broker plante, on sécurise de temps en temps)
ts_hidden_limit_pip = 40;
// Le TS
ts = 20;
// Ouverture de l'ordre
ticket = OrderSend(Symbol(),OP_BUY,lotSize,Ask,slippage,0,0,tradeComment,MagicNumber,Orange);
Sleep(400); // Je lui laisse le temps d'être traité par le broker
// Place TS et TP
OrderModify(ticket, 0, Bid - (sl * Point), OrderOpenPrice() + (tp * Point), 0, Orange);
// Ajoute le trade à notre tableau
// Je ne connais pas la syntaxe mais la logique est là
trades[ticket] = array('ts_hidden_value' => '', // la valeur du TS caché
// ... puis d'autres valeurs, pourquoi pas un TP caché, etc
);
// Liste les positions ouvertes
for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (MagicNumber == OrderMagicNumber())
{
RefreshRates();
if (OrderType() == OP_BUY)
{
ts_tmp = Bid-(Point*ts); // calcul trailing stop (achat)
// Si le cours est égal ou supérieur à notre TS caché
if(Bid >= trades[OrderTicket()]["ts_hidden_value"])
{
trades[OrderTicket()]["ts_hidden_value"] = ts_tmp; // On fait suivre le TS
// Si il est temps d'envoyer notre nouveau stop loss au broker
if(OrderStopLoss()+ts_hidden_limit_pip < trades[OrderTicket()]["ts_hidden_value"] )
OrderModify(OrderTicket(), 0, trades[OrderTicket()]["ts_hidden_value"] , OrderTakeProfit(), 0, White);
}else{
OrderClose( OrderTicket()); // Si le TS caché est touché on ferme la position
unset(trades[OrderTicket()]); // On retire le trade du tableau (connait pas la façon de faire)
}
}
// Si le cours est inférieur au prix d'aquisition, bingo on passe à la phase suivante
if (OrderType() == OP_SELL)
{
// ... idem pour les OP_SELL
}
}
}
}