Logo

dev-resources.site

for different kinds of informations.

Multi-Indicator Adaptive Trading Strategy Based on RSI, MACD and Volume

Published at
1/10/2025
Categories
macd
trading
strategy
indicator
Author
fmzquant
Categories
4 categories in total
macd
open
trading
open
strategy
open
indicator
open
Author
8 person written this
fmzquant
open
Multi-Indicator Adaptive Trading Strategy Based on RSI, MACD and Volume

Image description

Overview
This strategy is a comprehensive trading system that combines the relative strength index (RSI), moving average convergence divergence (MACD), Bollinger Bands (BB) and volume analysis. The strategy uses the coordination of multi-dimensional technical indicators to conduct a comprehensive analysis of market trends, volatility and volume to find the best trading opportunities.

Strategy Principle
The core logic of the strategy is based on the following aspects:

  1. Use RSI (14) to determine the overbought or oversold state of the market. RSI below 30 is considered oversold.
  2. Use MACD (12, 26, 9) to determine the trend direction, and use MACD golden cross as a long signal
  3. Confirm the validity of price action by calculating the difference between up volume and down volume (Delta Volume)
  4. Combined with Bollinger Bands to assess price volatility and optimize entry timing
  5. When RSI is oversold, MACD is golden cross and Delta Volume is positive, the system will issue the best buy signal.
  6. When MACD crosses or RSI exceeds 60, the system will automatically close the position to control the risk

Strategy Advantages

  1. Multi-indicator cross-validation improves the reliability of trading signals
  2. Confirm the validity of price trends through volume analysis
  3. Includes adaptive moving average type selection to enhance strategy flexibility
  4. It has a complete risk control mechanism, including stop loss and stop profit settings
  5. Strategy parameters can be optimized and adjusted according to different market conditions

Strategy Risks

  1. Combining multiple indicators may cause signal lag
  2. False signals may be generated in a sideways market
  3. Excessive parameter optimization may lead to overfitting
  4. High-frequency trading may lead to higher transaction costs
  5. When the market fluctuates violently, it may cause a large retracement

Strategy Optimization Direction

  1. Introduce an adaptive parameter mechanism to dynamically adjust indicator parameters according to market conditions
  2. Added trend strength filter to reduce false signals in sideways markets
  3. Optimize the stop-loss and stop-profit mechanism to improve the efficiency of capital utilization
  4. Added volatility filtering mechanism to adjust positions in high volatility environment
  5. Develop intelligent fund management system to achieve dynamic position control

Summary
This is a composite trading strategy that integrates multiple technical indicators, capturing market opportunities through multi-dimensional analysis such as RSI, MACD, and trading volume. The strategy has strong adaptability and scalability, and also has a perfect risk control mechanism. Through continuous optimization and improvement, the strategy is expected to maintain stable performance in different market environments.

Strategy source code

/*backtest
start: 2024-11-12 00:00:00
end: 2024-12-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Liraz sh Strategy - RSI MACD Strategy with Bullish Engulfing and Net Volume", overlay=true, currency=currency.NONE, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3)

// Input parameters
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "RSI Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

fastLength = input.int(12, minval=1, title="MACD Fast Length")
slowLength = input.int(26, minval=1, title="MACD Slow Length")
signalLength = input.int(9, minval=1, title="MACD Signal Length")

startDate = input(timestamp("2018-01-01"), title="Start Date")
endDate = input(timestamp("2069-12-31"), title="End Date")

// Custom Up and Down Volume Calculation
var float upVolume = 0.0
var float downVolume = 0.0

if close > open
    upVolume += volume
else if close < open
    downVolume += volume

delta = upVolume - downVolume

plot(upVolume, "Up Volume", style=plot.style_columns, color=color.new(color.green, 60))
plot(downVolume, "Down Volume", style=plot.style_columns, color=color.new(color.red, 60))
plotchar(delta, "Delta", "—", location.absolute, color=delta > 0 ? color.green : color.red)

// MA function
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// RSI calculation
up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

// MACD calculation
fastMA = ta.ema(close, fastLength)
slowMA = ta.ema(close, slowLength)
macd = fastMA - slowMA
signalLine = ta.sma(macd, signalLength)
hist = macd - signalLine

// Bullish Engulfing Pattern Detection
bullishEngulfingSignal = open[1] > close[1] and close > open and close >= open[1] and close[1] >= open and (close - open) > (open[1] - close[1])
barcolor(bullishEngulfingSignal ? color.yellow : na)

// Plotting RSI and MACD
plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.yellow)
hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
hline(30, "RSI Lower Band", color=#787B86)

bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title="Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title="Lower Bollinger Band", color=color.green)

plot(macd, title="MACD", color=color.blue)
plot(signalLine, title="Signal Line", color=color.orange)
plot(hist, title="Histogram", style=plot.style_histogram, color=color.gray)

// Best time to buy condition
bestBuyCondition = rsi < 30 and ta.crossover(macd, signalLine) and delta > 0

// Plotting the best buy signal line
var line bestBuyLine = na
if (bestBuyCondition )
    bestBuyLine := line.new(bar_index[1], close[1], bar_index[0], close[0], color=color.white)

// Strategy logic
longCondition = (ta.crossover(macd, signalLine) or bullishEngulfingSignal) and rsi < 70 and delta > 0
if (longCondition )
    strategy.entry("Long", strategy.long)

// Reflexive exit condition: Exit if MACD crosses below its signal line or if RSI rises above 60
exitCondition = ta.crossunder(macd, signalLine) or (rsi > 60 and strategy.position_size > 0)
if (exitCondition )
    strategy.close("Long")
Enter fullscreen mode Exit fullscreen mode

Strategy parameters

Image description

The original address: https://www.fmz.com/strategy/474952

Featured ones: