Bonjour j'ai fait un robot qui fait du micro trading mais le problème c'est que il ne faut aucun profit j'aimerais si possible que vous m'aidiez a l'améliorer svp
Voici le code :
//+------------------------------------------------------------------+
//| PredictiveCandleEA.mq5 |
//| Prédiction et trading avant une nouvelle bougie M1 |
//+------------------------------------------------------------------+
// Paramètres d'entrée personnalisés
input double LotSize = 0.01; // Taille du lot pour les trades
input double MaxProfit = 0.50; // Gain maximum par trade en euros (50 centimes)
input double MaxLoss = 0.20; // Perte maximum par trade en euros (20 centimes)
input int LookBackCandles = 5; // Nombre de bougies à analyser pour prédiction
input int Slippage = 2; // Slippage acceptable en points
// Variables globales
double pointValue; // Valeur d'un point pour le symbole courant
datetime lastCandleTime; // Heure de la dernière bougie traitée
bool tradeOpen = false; // Indique si un trade est ouvert
ulong openedTicket = 0; // Ticket de la position ouverte
//+------------------------------------------------------------------+
//| Initialisation de l'Expert |
//+------------------------------------------------------------------+
int OnInit()
{
// Initialiser l'heure de la dernière bougie
lastCandleTime = iTime(_Symbol, PERIOD_M1, 0);
// Calcul de la valeur d'un point en fonction du symbole
pointValue = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
Print("EA démarré avec les paramètres suivants : LotSize = ", DoubleToString(LotSize, 2), ", MaxProfit = ", DoubleToString(MaxProfit, 2), " euros, MaxLoss = ", DoubleToString(MaxLoss, 2), " euros, LookBackCandles = ", LookBackCandles);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Fonction principale OnTick |
//+------------------------------------------------------------------+
void OnTick()
{
// Vérifier si la bougie en cours est différente de la dernière bougie traitée
datetime currentCandleTime = iTime(_Symbol, PERIOD_M1, 0);
if(currentCandleTime != lastCandleTime)
{
// Mettre à jour la dernière bougie traitée
lastCandleTime = currentCandleTime;
// Fermer le trade actuel s'il est ouvert et profitable
if(tradeOpen && IsTradeProfitable())
{
CloseTrade();
}
// Prédire la direction de la prochaine bougie et ouvrir un trade
PredictAndTrade();
}
}
//+------------------------------------------------------------------+
//| Fonction qui prédit la direction de la prochaine bougie |
//+------------------------------------------------------------------+
void PredictAndTrade()
{
double momentum = 0;
// Analyser les dernières bougies pour calculer le momentum
for(int i = 1; i <= LookBackCandles; i++)
{
double openPrice = iOpen(_Symbol, PERIOD_M1, i);
double closePrice = iClose(_Symbol, PERIOD_M1, i);
momentum += (closePrice - openPrice); // Calcul du momentum
}
// Ouvrir un trade en fonction de la prédiction du momentum
if(momentum > 0)
{
// Prédiction : La prochaine bougie sera haussière, on ouvre un trade BUY
OpenBuyTrade();
}
else if(momentum < 0)
{
// Prédiction : La prochaine bougie sera baissière, on ouvre un trade SELL
OpenSellTrade();
}
else
{
Print("Momentum neutre, aucun trade ouvert.");
}
}
//+------------------------------------------------------------------+
//| Fonction qui ouvre un trade BUY |
//+------------------------------------------------------------------+
void OpenBuyTrade()
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
// Calculer le TP et SL en fonction du profit maximal et de la perte maximale
double tpPoints = (MaxProfit / (LotSize * pointValue));
double slPoints = (MaxLoss / (LotSize * pointValue));
double tpLevel = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + tpPoints * pointValue;
double slLevel = SymbolInfoDouble(_Symbol, SYMBOL_BID) - slPoints * pointValue;
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = slLevel;
request.tp = tpLevel;
request.symbol = _Symbol;
request.volume = LotSize;
request.deviation = Slippage;
request.type_filling = ORDER_FILLING_IOC;
if(OrderSend(request, result))
{
tradeOpen = true;
openedTicket = result.order;
Print("Trade BUY ouvert à ", request.price, " avec SL: ", request.sl, " et TP: ", request.tp);
}
else
{
Print("Erreur lors de l'ouverture du trade BUY : ", result.retcode);
}
}
//+------------------------------------------------------------------+
//| Fonction qui ouvre un trade SELL |
//+------------------------------------------------------------------+
void OpenSellTrade()
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
// Calculer le TP et SL en fonction du profit maximal et de la perte maximale
double tpPoints = (MaxProfit / (LotSize * pointValue));
double slPoints = (MaxLoss / (LotSize * pointValue));
double tpLevel = SymbolInfoDouble(_Symbol, SYMBOL_BID) - tpPoints * pointValue;
double slLevel = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + slPoints * pointValue;
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_SELL;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.sl = slLevel;
request.tp = tpLevel;
request.symbol = _Symbol;
request.volume = LotSize;
request.deviation = Slippage;
request.type_filling = ORDER_FILLING_IOC;
if(OrderSend(request, result))
{
tradeOpen = true;
openedTicket = result.order;
Print("Trade SELL ouvert à ", request.price, " avec SL: ", request.sl, " et TP: ", request.tp);
}
else
{
Print("Erreur lors de l'ouverture du trade SELL : ", result.retcode);
}
}
//+------------------------------------------------------------------+
//| Fonction qui vérifie si le trade est profitable |
//+------------------------------------------------------------------+
bool IsTradeProfitable()
{
if(PositionSelectByTicket(openedTicket))
{
double profit = PositionGetDouble(POSITION_PROFIT);
return profit > 0;
}
return false;
}
//+------------------------------------------------------------------+
//| Fonction pour fermer un trade |
//+------------------------------------------------------------------+
void CloseTrade()
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
if(PositionSelectByTicket(openedTicket))
{
ulong ticket = PositionGetInteger(POSITION_TICKET);
request.action = TRADE_ACTION_DEAL;
request.position = ticket;
request.symbol = _Symbol;
request.volume = PositionGetDouble(POSITION_VOLUME);
request.type = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? ORDER_TYPE_SELL : ORDER_TYPE_BUY;
request.price = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_BID) : SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation = Slippage;
request.type_filling = ORDER_FILLING_IOC;
if(OrderSend(request, result))
{
Print("Position fermée avec succès : ", result.price);
tradeOpen = false;
}
else
{
Print("Erreur lors de la fermeture de la position : ", result.retcode);
}
}
}
J'ai crée un EA
Erreurs, bugs, questions
Comment ouvrir correctement un
![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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