Moving average

Replies
1
Voices
2
user

How do I code a simple moving average crossover strategy in MetaTrader 4?

One response to “Moving average”

  1. Leslie Chan Avatar

    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! 🚀

Latest Posts