EA_Gold_Rebond/Scalping-m1.mq5
123 lines
4.7 KiB
MQL5
//+------------------------------------------------------------------+
//| M1_Frequent_Scalper.mq5|
//| Copyright 2026, Personal AI |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//--- Inclure la bibliothèque de trading standard
#include <Trade\Trade.mqh>
CTrade trade;
//--- Paramètres d'entrées (Inputs)
input group "=== Paramètres de Gestion des Risques =="
input double InpLotSize = 0.1; // Taille du lot
input int InpStopLoss = 150; // Stop Loss (en points)
input int InpTakeProfit = 300; // Take Profit (en points)
input int InpMaxSpread = 30; // Spread maximum autorisé (en points)
input group "=== Paramètres des Indicateurs (EMA) =="
input int InpFastEMAPeriod = 9; // Période EMA Rapide
input int InpSlowEMAPeriod = 21; // Période EMA Lente
//--- Variables globales
int fastEMAHandle;
int slowEMAHandle;
datetime lastBarTime;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Configuration du Magic Number pour identifier les ordres du robot
trade.SetExpertMagicNumber(123456);
// Création des handles des indicateurs EMA
fastEMAHandle = iMA(_Symbol, _Period, InpFastEMAPeriod, 0, MODE_EMA, PRICE_CLOSE);
slowEMAHandle = iMA(_Symbol, _Period, InpSlowEMAPeriod, 0, MODE_EMA, PRICE_CLOSE);
if(fastEMAHandle == INVALID_HANDLE || slowEMAHandle == INVALID_HANDLE)
{
Print("Erreur : Impossible de créer les handles des indicateurs EMA.");
return(INIT_FAILED);
}
lastBarTime = 0;
Print("EA M1 Scalper initialisé avec succès !");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Libération des handles d'indicateurs pour éviter les fuites mémoire
IndicatorRelease(fastEMAHandle);
IndicatorRelease(slowEMAHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 1. Vérification d'une nouvelle barre sur M1
datetime currentBarTime = iTime(_Symbol, _Period, 0);
if(currentBarTime == lastBarTime) return; // Attendre la bougie suivante
// 2. Vérification du spread
long currentSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
if(currentSpread > InpMaxSpread) return;
// 3. Récupération des valeurs des EMA ([1] = bougie fermée, [2] = bougie précédente)
double fastEMA[], slowEMA[];
ArraySetAsSeries(fastEMA, true);
ArraySetAsSeries(slowEMA, true);
if(CopyBuffer(fastEMAHandle, 0, 0, 3, fastEMA) <= 0 || CopyBuffer(slowEMAHandle, 0, 0, 3, slowEMA) <= 0)
{
Print("Erreur lors de la copie des buffers des indicateurs.");
return;
}
// 4. Logique de trading (si aucune position n'est ouverte)
if(PositionsTotal() == 0)
{
// Croisement haussier : EMA rapide passe au-dessus de l'EMA lente
bool buySignal = (fastEMA[1] > slowEMA[1]) && (fastEMA[2] <= slowEMA[2]);
// Croisement baissier : EMA rapide passe en dessous de l'EMA lente
bool sellSignal = (fastEMA[1] < slowEMA[1]) && (fastEMA[2] >= slowEMA[2]);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if(buySignal)
{
double sl = (InpStopLoss > 0) ? ask - InpStopLoss * _Point : 0;
double tp = (InpTakeProfit > 0) ? ask + InpTakeProfit * _Point : 0;
if(trade.Buy(InpLotSize, _Symbol, ask, sl, tp, "M1 Scalper Buy"))
{
lastBarTime = currentBarTime;
Print("Ordre d'ACHAT exécuté avec succès à ", ask);
}
}
else if(sellSignal)
{
double sl = (InpStopLoss > 0) ? bid + InpStopLoss * _Point : 0;
double tp = (InpTakeProfit > 0) ? bid - InpTakeProfit * _Point : 0;
if(trade.Sell(InpLotSize, _Symbol, bid, sl, tp, "M1 Scalper Sell"))
{
lastBarTime = currentBarTime;
Print("Ordre de VENTE exécuté avec succès à ", bid);
}
}
}
}