134 lines
5.5 KiB
MQL5
134 lines
5.5 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Supertrend_200EMA_Strategy.mq5 |
| |||
//| Copyright 2026, AutoTrader EA |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------>
| |||
#property copyright "Copyright 2026"
| |||
#property link "https://www.mql5.com"
| |||
#property version "1.00"
| |||
| |||
//--- Include Trade library
| |||
#include <Trade\Trade.mqh>
| |||
CTrade trade;
| |||
| |||
//--- Input Parameters
| |||
input group "=== Strategy Parameters ==="
| |||
input int InpSupertrendATR = 10; // Supertrend ATR Length
| |||
input double InpSupertrendFactor = 5.0; // Supertrend Factor
| |||
input int InpEMAPeriod = 200; // EMA Period (1-min)
| |||
input double InpRiskRewardRatio = 2.0; // Risk to Reward Ratio (1:2)
| |||
input double InpLotSize = 0.1; // Lot Size
| |||
input ulong InpMagicNumber = 123456; // Magic Number
| |||
| |||
//--- Global Variables
| |||
int hEMA1Min;
| |||
int hSupertrend5Min;
| |||
datetime lastBarTime1Min;
| |||
datetime lastBarTime5Min;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Expert initialization function |
| |||
//+------------------------------------------------------------------+
| |||
int OnInit()
| |||
{
| |||
trade.SetExpertMagicNumber(InpMagicNumber);
| |||
| |||
// Create 200 EMA handle for 1-Minute timeframe
| |||
hEMA1Min = iMA(_Symbol, PERIOD_M1, InpEMAPeriod, 0, MODE_EMA, PRICE_CLOSE);
| |||
if(hEMA1Min == INVALID_HANDLE)
| |||
{
| |||
Print("Error creating 200 EMA handle.");
| |||
return(INIT_FAILED);
| |||
}
| |||
| |||
// Note: Standard Supertrend indicator handle setup.
| |||
// Ensure your MT5 has a custom Supertrend indicator or use built-in equivalent.
| |||
hSupertrend5Min = iCustom(_Symbol, PERIOD_M5, "Examples\\Supertrend", InpSupertrendATR, InpSupertrendFactor);
| |||
// If you use a custom Supertrend indicator name, replace "Examples\\Supertrend" with your exact indicator file name.
| |||
| |||
lastBarTime1Min = 0;
| |||
lastBarTime5Min = 0;
| |||
| |||
Print("EA Initialized Successfully.");
| |||
return(INIT_SUCCEEDED);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Expert deinitialization function |
| |||
//+------------------------------------------------------------------+
| |||
void OnDeinit(const int reason)
| |||
{
| |||
IndicatorRelease(hEMA1Min);
| |||
IndicatorRelease(hSupertrend5Min);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Expert tick function |
| |||
//+------------------------------------------------------------------+
| |||
void OnTick()
| |||
{
| |||
// Check if an open position already exists (Only one trade at a time rule)
| |||
if(PositionsTotal() > 0) return;
| |||
| |||
// Check for a new 1-minute bar to avoid multiple triggers on the same candle
| |||
datetime currentBarTime1Min = iTime(_Symbol, PERIOD_M1, 0);
| |||
if(currentBarTime1Min == lastBarTime1Min) return;
| |||
| |||
// --- Get Indicator Values ---
| |||
double emaVal[], closeVal1[], closeVal2[];
| |||
ArraySetAsSeries(emaVal, true);
| |||
ArraySetAsSeries(closeVal1, true);
| |||
ArraySetAsSeries(closeVal2, true);
| |||
| |||
if(CopyBuffer(hEMA1Min, 0, 0, 3, emaVal) <= 0) return;
| |||
if(CopyClose(_Symbol, PERIOD_M1, 0, 3, closeVal1) <= 0) return;
| |||
| |||
// Get Supertrend direction on 5-Minute timeframe
| |||
// (Assuming buffer convention: Buffer returns trend direction or price line. Usually buffer 0 or line check)
| |||
double supertrendVal[];
| |||
ArraySetAsSeries(supertrendVal, true);
| |||
if(CopyBuffer(hSupertrend5Min, 0, 0, 2, supertrendVal) <= 0) return;
| |||
| |||
// Let's assume Supertrend value compared with close price or specific buffer defines Bullish/Bearish.
| |||
// Simplified trend condition: If Close > Supertrend value -> Bullish, else Bearish.
| |||
double close5Min = iClose(_Symbol, PERIOD_M5, 0);
| |||
bool isSupertrendBullish = (close5Min > supertrendVal[0]);
| |||
bool isSupertrendBearish = (close5Min < supertrendVal[0]);
| |||
| |||
// --- Crossover Logic on 1-Min Chart ---
| |||
// Bullish Crossover: Previous close below EMA, Current close above EMA
| |||
bool crossedAbove = (closeVal1[1] <= emaVal[1] && closeVal1[0] > emaVal[0]);
| |||
| |||
// Bearish Crossover: Previous close above EMA, Current close below EMA
| |||
bool crossedBelow = (closeVal1[1] >= emaVal[1] && closeVal1[0] < emaVal[0]);
| |||
| |||
// --- Execution Logic ---
| |||
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
| |||
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
| |||
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
| |||
| |||
// 1. Bearish Condition (Short Trade)
| |||
if(isSupertrendBearish && crossedBelow)
| |||
{
| |||
// Find recent swing high for Stop Loss calculation
| |||
double stopLoss = iHigh(_Symbol, PERIOD_M1, iHighest(_Symbol, PERIOD_M1, MODE_HIGH, 5, 1));
| |||
double risk = stopLoss - bid;
| |||
double takeProfit = bid - (risk * InpRiskRewardRatio);
| |||
| |||
trade.Sell(InpLotSize, _Symbol, bid, stopLoss, takeProfit, "Supertrend Bearish Short");
| |||
lastBarTime1Min = currentBarTime1Min;
| |||
}
| |||
| |||
// 2. Bullish Condition (Long Trade)
| |||
else if(isSupertrendBullish && crossedAbove)
| |||
{
| |||
// Find recent swing low for Stop Loss calculation
| |||
double stopLoss = iLow(_Symbol, PERIOD_M1, iLowest(_Symbol, PERIOD_M1, MODE_LOW, 5, 1));
| |||
double risk = ask - stopLoss;
| |||
double takeProfit = ask + (risk * InpRiskRewardRatio);
| |||
| |||
trade.Buy(InpLotSize, _Symbol, ask, stopLoss, takeProfit, "Supertrend Bullish Long");
| |||
lastBarTime1Min = currentBarTime1Min;
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
|