0bps

Strategy vault / Mean reversion

RSI Indicator Based Stock Trading Pyramiding Strategy

This article mainly introduces a stock trading pyramiding strategy designed based on the Relative Strength Index (RSI) indicator. The strategy uses the RSI indicator to determine overbought and oversold areas of…

Author
ChaoZhang
Complexity
Intermediate · 107 lines
Parameters
5
Backtest bar
1h · intraday
Tested on
BTC/USDT · futures

IMG

Overview

This article mainly introduces a stock trading pyramiding strategy designed based on the Relative Strength Index (RSI) indicator. The strategy uses the RSI indicator to determine overbought and oversold areas of stocks and implements profit making through pyramiding principles.

Strategy Principle

  • Use the RSI indicator to judge whether the stock has entered the overbought or oversold area. RSI below 25 is oversold, and above 80 is overbought.
  • When the RSI enters the oversold area, start going long. When the RSI enters the overbought area, start going short.
  • Adopt the pyramiding method, with up to 7 additional purchases. Set take profit and stop loss points after each additional purchase.

Advantage Analysis

  • Using the RSI indicator to determine the overbought and oversold areas can capture larger price reversal opportunities.
  • The pyramiding method can obtain relatively better returns when the market moves correctly.
  • Setting take profit and stop loss after each additional purchase can control risks.

Risk Analysis

  • The effect of RSI indicator to determine overbought and oversold areas is unstable, and wrong signals may occur.
  • The number of additional purchases needs to be set reasonably, too many additional purchases will increase risks.
  • The setting of stop loss points needs to consider volatility, cannot be set too small.

Optimization Directions

  • Consider combining other indicators to filter RSI signals and improve the accuracy of determining overbought and oversold statuses. Such as KDJ, BOLL and other indicators.
  • Can set floating stop loss to track price. Adjust dynamically according to volatility and risk control requirements.
  • Consider using adaptive parameters based on market conditions (bull market, bear market, etc.).

Summary

This strategy combines the RSI indicator with the pyramiding strategy. While judging the overbought and oversold statuses, it can obtain more returns through additional purchases. Although the accuracy of RSI judgment needs to be improved, through reasonable parameter optimization and combination with other indicators, it can form an effective trading strategy. This strategy has some universality and is a relatively simple and straightforward quantitative trading method.

Parameters

NameDefaultWhat it controls
v_input_180OverBought
v_input_225OverSold
v_input_35RSI Length
v_input_43ProfitTarget_Percent
v_input_510LossTarget_Percent

Source Pine Script

/*backtest
start: 2023-12-30 00:00:00
end: 2024-01-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RafaelZioni

strategy(title='Simple RSI strategy', overlay=false)

SWperiod = 1
look = 0
OverBought = input(80, minval=50)
OverSold = input(25, maxval=50)

bandmx = hline(100)
bandmn = hline(0)

band1 = hline(OverBought)
band0 = hline(OverSold)
//band50 = hline(50, color=black, linewidth=1)
fill(band1, band0, color=color.purple, transp=98)


src = close
len = input(5, minval=1, title="RSI Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)

p = 100

//scale
hh = highest(high, p)
ll = lowest(low, p)
scale = hh - ll

//dynamic OHLC
dyno = (open - ll) / scale * 100
dynl = (low - ll) / scale * 100
dynh = (high - ll) / scale * 100
dync = (close - ll) / scale * 100

//candle color
color_1 = close > open ? 1 : 0

//drawcandle
hline(78.6)
hline(61.8)
hline(50)
hline(38.2)
hline(23.6)
plotcandle(dyno, dynh, dynl, dync, title="Candle", color=color_1 == 1 ? color.green : color.red)
plot(10, color=color.green)
plot(55, color=color.black)
plot(80, color=color.black)
plot(90, color=color.red)

long = rsi <= OverSold ? 5 : na

//Strategy
golong = rsi <= OverSold ? 5 : na

longsignal = golong  
//based on https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
//set take profit

ProfitTarget_Percent = input(3)
Profit_Ticks = close * (ProfitTarget_Percent / 100) / syminfo.mintick

//set take profit

LossTarget_Percent = input(10)
Loss_Ticks = close * (LossTarget_Percent / 100) / syminfo.mintick


//Order Placing

strategy.entry("Entry 1", strategy.long, when=strategy.opentrades == 0 and longsignal)

strategy.entry("Entry 2", strategy.long, when=strategy.opentrades == 1 and longsignal)

strategy.entry("Entry 3", strategy.long, when=strategy.opentrades == 2 and longsignal)

strategy.entry("Entry 4", strategy.long, when=strategy.opentrades == 3 and longsignal)

strategy.entry("Entry 5", strategy.long, when=strategy.opentrades == 4 and longsignal)

strategy.entry("Entry 6", strategy.long, when=strategy.opentrades == 5 and longsignal)

strategy.entry("Entry 7", strategy.long, when=strategy.opentrades == 6 and longsignal)



if strategy.position_size > 0
    strategy.exit(id="Exit 1", from_entry="Entry 1", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 2", from_entry="Entry 2", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 3", from_entry="Entry 3", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 4", from_entry="Entry 4", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 5", from_entry="Entry 5", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 6", from_entry="Entry 6", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 7", from_entry="Entry 7", profit=Profit_Ticks, loss=Loss_Ticks)

Published by ChaoZhang on the FMZ strategy square · last modified 2024-01-30. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/RSI-Indicator-Based-Stock-Trading-Pyramiding-Strategy.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open