// --- Variables ---
double FastMA, SlowMA, RSIValue;
int TradeMagicNumber = 202408001; // Numéro magique pour identifier les commandes
EA
int Slippage = 3; // Valeur de glissement autorisée
datetime lastTradeTime;
int currentTrades = 0; // Nombre de trades effectués aujourd'hui
datetime lastTradeTime = 0; // Temps du dernier trade
// --- OnInit ---
int OnInit()
{
lastTradeTime = 0;
currentTrades = 0;
return(INIT_SUCCEEDED);
}
// --- OnTick ---
void OnTick()
{
ManageTradesPerDay();
// Calculer les indicateurs
FastMA = iMA(Symbol(), PERIOD_CURRENT, FastMA_Period, 0, FastMA_Method,
PRICE_CLOSE, 0);
SlowMA = iMA(Symbol(), PERIOD_CURRENT, SlowMA_Period, 0, SlowMA_Method,
PRICE_CLOSE, 0);
RSIValue = iRSI(Symbol(), PERIOD_CURRENT, RSIPeriod, PRICE_CLOSE);
// Vérifier les conditions d'entrée
if (IsBuySignal() && currentTrades < MaxTradesPerDay && TimeCurrent() >
lastTradeTime + TradeCooldown)
PlaceBuyOrder();
else if (IsSellSignal() && currentTrades < MaxTradesPerDay && TimeCurrent() >
lastTradeTime + TradeCooldown)
PlaceSellOrder();
// Gestion des trades ouverts
CheckOpenTrades();
}
// --- Fonctions d'entrée ---
bool IsBuySignal()
{
// Conditions d'achat :
// 1. La moyenne mobile rapide croise la moyenne mobile lente à la hausse
// 2. Le RSI est en dessous du niveau de survente
return (FastMA > SlowMA && FastMA[1] < SlowMA[1] && RSIValue < RSIOversold);
}
bool IsSellSignal()
{
// Conditions de vente :
// 1. La moyenne mobile rapide croise la moyenne mobile lente à la baisse
// 2. Le RSI est au-dessus du niveau de surachat
return (FastMA < SlowMA && FastMA[1] > SlowMA[1] && RSIValue > RSIOverbought);
}
// --- Fonctions de passation des ordres ---
void PlaceBuyOrder()
{
// Calculer le volume
double lots = AccountEquity()*RiskPercentage/100;
// Calculer le Stop Loss
double StopLoss = Ask - (Ask - Bid) * RiskRewardRatio;
// Calculer le Take Profit
double TakeProfit = Ask + (Ask - Bid) * RiskRewardRatio;
// Passer l'ordre d'achat
OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, StopLoss, TakeProfit, "Buy
Order", TradeMagicNumber, 0, 0);
// Augmenter le compteur de trades
currentTrades++;
lastTradeTime = TimeCurrent(); // Mettre à jour le temps du dernier trade
}
void PlaceSellOrder()
{
// Calculer le volume
double lots = AccountEquity()*RiskPercentage/100;
// Calculer le Stop Loss
double StopLoss = Bid + (Ask - Bid) * RiskRewardRatio;
// Calculer le Take Profit
double TakeProfit = Bid - (Ask - Bid) * RiskRewardRatio;
// Passer l'ordre de vente
OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, StopLoss, TakeProfit, "Sell
Order", TradeMagicNumber, 0, 0);
// Augmenter le compteur de trades
currentTrades++;
lastTradeTime = TimeCurrent(); // Mettre à jour le temps du dernier trade
}
// --- Fonction pour réinitialiser le compteur de trades ---
void ResetTradeCounter()
{
currentTrades = 0;
lastTradeTime = TimeCurrent();
}
// --- Fonction pour gérer les trades par jour ---
void ManageTradesPerDay()
{
if (TimeCurrent() > lastTradeTime + 86400) // 86400 secondes dans un jour
ResetTradeCounter();
}
// --- Fonction pour gérer les trades ouverts ---
void CheckOpenTrades()
{
for(int i = OrdersTotal()-1; i >= 0; i--) {
if(OrderMagicNumber() == TradeMagicNumber && OrderSymbol() == Symbol() &&
OrderType() == OP_BUY) {
if (Low[0] < OrderStopLoss()) {
// Fermer la position si le Stop Loss est atteint
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, 0);
}
} else if(OrderMagicNumber() == TradeMagicNumber && OrderSymbol() == Symbol()
&& OrderType() == OP_SELL) {
if (High[0] > OrderStopLoss()) {
// Fermer la position si le Stop Loss est atteint
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, 0);
}
}
}
}
`//+------------------------------------------------------------------+
//| TwoMovingAverageRSIBot.mq5 |
//| Copyright 2024, Your Name |
//| (Your Website) |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Your Name"
#property link "(Your Website)"
#property version "1.00"
#property strict
`mql5
// --- Inputs ---
extern int FastMA_Period = 1; // Période de la première moyenne mobile (rapide)
extern int FastMA_Method = MODE_EMA; // Méthode de la première moyenne mobile
(exponentielle)
extern int SlowMA_Period = 50; // Période de la deuxième moyenne mobile (lente)
extern int SlowMA_Method = MODE_EMA; // Méthode de la deuxième moyenne mobile
(exponentielle)
extern int RSIPeriod = 1; // Période du RSI
extern int RSIOversold = 15; // Niveau de survente du RSI
extern int RSIOverbought = 85; // Niveau de surachat du RSI
extern double RiskPercentage = 5; // Pourcentage de risque par transaction
extern double RiskRewardRatio = 5.0; // Ratio risque-récompense (1:5)
extern int MaxTradesPerDay = 10; // Nombre maximum de trades par jour
extern int TradeCooldown = 5; // Temps de pause entre les trades (en secondes)