How do I code a simple moving average crossover strategy in MetaTrader 4?
Moving average
Latest Posts
Scholarship Program 2024
【Forex Forest】Scholarship Program is a quarterly program. We will select up to 3 outstanding traders…
Algo Forest Unveils Latest AI-Driven Trading Program Enhancements of 2024
Algo Forest launches new AI-driven trading enhancements for 2024, designed to optimize trading performance and…
FF Cup Battle for Supremacy
Welcome to WordPress. sais your first post. Edit or delete it, then start writing!
Follow us




One response to “Moving average”
Here’s a step-by-step guide to coding a Simple Moving Average (SMA) Crossover strategy in MetaTrader 4 (MT4) using MQL4. This strategy generates buy/sell signals when a fast SMA crosses above/below a slow SMA.
1. Strategy Logic
Buy Signal: Fast SMA (e.g., 10-period) crosses above Slow SMA (e.g., 50-period).
Sell Signal: Fast SMA crosses below Slow SMA.
Exit Trades: When the opposite crossover occurs.
2. Full MQL4 Code
mql4
复制
//+——————————————————————+
//| Simple SMA Crossover Strategy |
//| Usage: Attach to a chart in MetaTrader 4 |
//+——————————————————————+
//— Input Parameters (Editable in MT4 UI)
input int FastMAPeriod = 10; // Fast SMA period
input int SlowMAPeriod = 50; // Slow SMA period
input double LotSize = 0.1; // Trade volume
input int MagicNumber = 12345; // Unique ID for trades
input int Slippage = 3; // Allowed slippage (points)
//+——————————————————————+
//| Expert initialization function |
//+——————————————————————+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| Expert tick function (runs on every price update) |
//+——————————————————————+
void OnTick()
{
//— Check for open positions
bool hasBuyTrade = false;
bool hasSellTrade = false;
for (int i = OrdersTotal() – 1; i >= 0; i–)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUY) hasBuyTrade = true;
if (OrderType() == OP_SELL) hasSellTrade = true;
}
}
}
//— Get SMA values
double fastMA = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double slowMA = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
//— Buy Signal (Fast MA crosses above Slow MA)
if (fastMA > slowMA && !hasBuyTrade)
{
// Close any sell trades first
if (hasSellTrade) CloseAllSellTrades();
// Open buy trade
OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, “SMA Crossover Buy”, MagicNumber, 0, clrGreen);
}
//— Sell Signal (Fast MA crosses below Slow MA)
else if (fastMA < slowMA && !hasSellTrade) { // Close any buy trades first if (hasBuyTrade) CloseAllBuyTrades(); // Open sell trade OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, "SMA Crossover Sell", MagicNumber, 0, clrRed); } } //+------------------------------------------------------------------+ //| Close all buy trades | //+------------------------------------------------------------------+ void CloseAllBuyTrades() { for (int i = OrdersTotal() - 1; i >= 0; i–)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY)
{
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clrRed);
}
}
}
}
//+——————————————————————+
//| Close all sell trades |
//+——————————————————————+
void CloseAllSellTrades()
{
for (int i = OrdersTotal() – 1; i >= 0; i–)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clrGreen);
}
}
}
}
//+——————————————————————+
3. How to Install & Use
Open MetaEditor in MT4 (Ctrl + N or Tools > MetaQuotes Language Editor).
Create a new Expert Advisor (EA):
Click File > New > Expert Advisor.
Paste the code above.
Save as SMACrossover.mq4.
Compile the EA (Press Compile or F7).
Attach to a Chart:
Drag the EA from the Navigator panel onto a chart.
Enable AutoTrading (green button on top).
Adjust parameters (FastMAPeriod, SlowMAPeriod, LotSize) as needed.
4. Key Notes
Works on any timeframe (M1, H1, D1, etc.).
No stop-loss/take-profit in this example (add them in OrderSend if needed).
Test in a demo account first before live trading.
Optimize SMA periods (FastMAPeriod, SlowMAPeriod) for better results.
5. Enhancements (Optional)
Add trailing stops.
Use exponential moving averages (EMA) instead of SMA.
Filter trades with additional indicators (e.g., RSI for overbought/oversold).
This is a basic but fully functional SMA crossover EA. Let me know if you’d like modifications! 🚀