Multi-Indicator Strategies in Algorithmic Trading: Combining Indicators for Signal Optimisation

In algorithmic trading, combining multiple indicators can improve the accuracy and reliability of trading signals. While a single indicator may perform well in certain conditions, using multiple indicators can provide additional confirmation and filter out false signals. This article covers the essentials of multi-indicator strategies, how to combine indicators effectively, and the importance of signal optimisation. We’ll also provide an MQL4 example of a strategy that combines trend and momentum indicators for a more refined approach.

Why Use Multi-Indicator Strategies?

Using multiple indicators allows traders to validate signals across different aspects of market analysis:

  1. Confirmation: Multiple indicators confirm each other’s signals, making it less likely to enter on weak or false signals.
  2. Adaptability: Combining indicators enables traders to handle different market conditions, as some indicators work better in trending markets and others in range-bound markets.
  3. Divergence and Confluence: Divergence between indicators can provide warnings, while confluence (agreement between indicators) strengthens signals.

Common Multi-Indicator Combinations

1. Trend and Momentum:

  • Example: Combining a Moving Average (MA) with the Relative Strength Index (RSI).
  • Strategy: Use the MA to identify trend direction and RSI to gauge the momentum, entering only when both indicators align.

2. Volume and Trend:

  • Example: Using On-Balance Volume (OBV) with an Exponential Moving Average (EMA).
  • Strategy: OBV confirms trend strength, while the EMA indicates trend direction. Enter trades when both the OBV and EMA show trend alignment.

3. Volatility and Mean Reversion:

  • Example: Combining Bollinger Bands with the Stochastic Oscillator.
  • Strategy: Use Bollinger Bands to identify volatility and the Stochastic Oscillator to identify overbought/oversold conditions, entering trades when both indicators suggest mean reversion.

Optimising Signals in Multi-Indicator Strategies

1. Backtesting and Parameter Tuning:

  • Test different settings for each indicator to find optimal configurations. Backtesting helps you refine parameters based on historical data.

2. Avoiding Overfitting:

  • While it’s tempting to optimise parameters for maximum performance, overfitting can make strategies less adaptable to real-market conditions. Balance optimisation with simplicity to improve robustness.

3. Filter Weak Signals:

  • Use multiple indicators to filter out weak signals, ensuring trades align with both trend and momentum indicators, for instance.

4. Signal Weighting:

  • Some traders assign different weights to indicators, favouring certain signals over others. For example, prioritise trend indicators in trending markets and mean reversion indicators in range-bound markets.

Multi-Indicator Strategy Example in MQL4

This MQL4 example demonstrates a strategy that combines a Moving Average (MA) for trend direction and the Relative Strength Index (RSI) for momentum confirmation. The strategy initiates a buy order when the price is above the MA and RSI is below 30, indicating an upward trend with oversold momentum. Conversely, it sells when the price is below the MA and RSI is above 70.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Multi-Indicator Strategy: Combining MA and RSI in MQL4
input int MAPeriod = 50;               // Period for Moving Average
input int RSIPeriod = 14;              // Period for RSI
input double OverboughtLevel = 70.0;   // RSI level for overbought
input double OversoldLevel = 30.0;     // RSI level for oversold
input double LotSize = 0.1;            // Lot size for orders
 
// Global variables to track trade status
bool buyTradeOpen = false;
bool sellTradeOpen = false;
 
void OnTick() {
   double ma = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double rsi = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0);
   double closePrice = iClose(NULL, 0, 0);
 
   // Buy signal: Price above MA and RSI below oversold level
   if (closePrice > ma && rsi < OversoldLevel && !buyTradeOpen) {
       if (sellTradeOpen) CloseSell();
       OpenBuy();
   }
   // Sell signal: Price below MA and RSI above overbought level
   else if (closePrice < ma && rsi > OverboughtLevel && !sellTradeOpen) {
       if (buyTradeOpen) CloseBuy();
       OpenSell();
   }
}
 
// Function to open a buy position
void OpenBuy() {
   int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, 0, "MA + RSI Buy", 0, 0, clrGreen);
   if (ticket > 0) {
       buyTradeOpen = true;
       sellTradeOpen = false;
       Print("Buy order opened with MA and RSI confirmation.");
   } else {
       Print("Error opening buy order: ", GetLastError());
   }
}
 
// Function to open a sell position
void OpenSell() {
   int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, 0, 0, "MA + RSI Sell", 0, 0, clrRed);
   if (ticket > 0) {
       sellTradeOpen = true;
       buyTradeOpen = false;
       Print("Sell order opened with MA and RSI confirmation.");
   } else {
       Print("Error opening sell order: ", GetLastError());
   }
}
 
// Function to close any open buy position
void CloseBuy() {
   for (int i = OrdersTotal() - 1; i >= 0; i--) {
       if (OrderSelect(i, SELECT_BY_POS) && OrderType() == OP_BUY) {
           OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrGreen);
           buyTradeOpen = false;
           Print("Buy order closed.");
       }
   }
}
 
// Function to close any open sell position
void CloseSell() {
   for (int i = OrdersTotal() - 1; i >= 0; i--) {
       if (OrderSelect(i, SELECT_BY_POS) && OrderType() == OP_SELL) {
           OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrRed);
           sellTradeOpen = false;
           Print("Sell order closed.");
       }
   }
}

Explanation of the Multi-Indicator Strategy

1. Parameters:

  • MAPeriod and RSIPeriod control the period settings for the MA and RSI indicators.
  • OverboughtLevel and OversoldLevel set RSI thresholds for overbought and oversold conditions.
  • LotSize defines the trade size.

2. Trade Execution:

  • A buy signal occurs when the price is above the MA (indicating an uptrend) and RSI is below 30 (indicating oversold conditions).
  • A sell signal occurs when the price is below the MA (indicating a downtrend) and RSI is above 70 (indicating overbought conditions).

3. Functions:

  • OpenBuy() and OpenSell() open buy and sell trades when both indicators align.
  • CloseBuy() and CloseSell() close trades if an opposite signal appears.

This strategy combines trend and momentum signals to confirm trades, increasing the reliability of entries and exits.

Tips for Optimising Multi-Indicator Strategies

  1. Test Different Combinations: Experiment with different indicator combinations to find pairs that work well together.
  2. Optimise Indicator Periods: Adjust the periods for each indicator to suit the asset’s volatility and time frame.
  3. Backtest Regularly: Backtesting multi-indicator strategies is essential to determine their effectiveness in different market conditions.
  4. Avoid Overfitting: Keep the strategy straightforward and avoid excessive adjustments, as overfitting can reduce the algorithm’s robustness.

Conclusion

Multi-indicator strategies in algo trading provide more reliable signals by combining the strengths of different indicators. This MQL4 example demonstrates how combining a trend indicator with a momentum indicator can filter out weak signals and improve trade accuracy. In the next article, we’ll cover Backtesting and Optimising Trading Algorithms, guiding you through the process of testing, refining, and optimising algo trading strategies for consistent performance.