RSI Bollinger Bands Стратегия TP/SL

Автор:Чао Чжан, Дата: 21-12-2023 11:17:19
Тэги:

img

I. Обзор стратегии

Стратегия называется RSI Bollinger Bands TP/SL Strategy. Она сочетает в себе индикатор RSI и Bollinger Bands для определения тенденций и торговых сигналов. Когда индикатор RSI показывает сигналы перекупа или перепродажи и цена касается или прорывается через Bollinger Bands, будут открыты длинные или короткие позиции. Кроме того, для контроля рисков устанавливаются точки получения прибыли и остановки потери.

II. Логика стратегии

Индикатор RSI для перемен

Индикатор RSI определяет, является ли акция перекупленной или перепроданной. Читание RSI выше перекупленной линии указывает на перекупленные условия, в то время как чтение ниже перепроданной линии указывает на перепроданные условия. Линия перекупления устанавливается на 50 и линия перепродажи устанавливается на 50 в этой стратегии.

2. полосы Боллинджера для тренда

Боллингерские полосы вывешивают стандартные отклонения выше и ниже простой скользящей средней. Верхняя полоса действует как сопротивление, а нижняя полоса действует как поддержка.

3. Комбинация RSI и полос Боллинджера

Когда индикатор RSI показывает нижний сигнал переворота и цена прорывается через нижнюю полосу полос Боллинджера, это рассматривается как восходящее перевороты, и, следовательно, длинный.

III. Преимущества

1. Улучшенная точность с помощью двойных индикаторов

RSI и Bollinger Bands используются для определения тенденций и переворотов.

Контроль рисков с использованием ТП/SL

Стратегия устанавливает точки получения прибыли (TP) и остановки потери (SL), чтобы зафиксировать прибыль и максимизировать снижение потерь.

3. Направления, которые можно настроить

Пользователи могут выбирать только длинный, короткий или оба направления в зависимости от рыночных условий, что позволяет гибко контролировать риск.

IV. Риски

1. Параметры чувствительных полос Боллинджера

Размер стандартного отклонения влияет на ширину полос и торговые сигналы.

2. Риски ТП/СЛ

V-образные перевороты могут вызвать ненужные потери с слишком агрессивными настройками TP / SL.

3. Чувствительные параметры RSI

Неправильные параметры RSI приводят к снижению точности сигналов обратного движения.

V. Направления оптимизации

1. Оптимизировать параметры RSI

Для поиска оптимальной комбинации параметров можно проверить больше значений длины RSI.

2. Оптимизировать параметры полос Боллинджера

Для поиска оптимальной комбинации параметров можно испытать больше длин и стандартных отклонений.

3. Испытать различные соотношения TP/SL

Обратное тестирование может помочь найти оптимальное соотношение TP/SL.

VI. Заключение

Эта стратегия использует RSI и полосы Боллинджера для выявления тенденций и перемен, и устанавливает TP / SL для контроля рисков. Она может автоматически обнаруживать торговые сигналы и управлять выходами.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BigCoinHunter

//@version=5
strategy(title="RSI_Boll-TP/SL", overlay=true, 
     pyramiding=0, default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, initial_capital=1000, 
     currency=currency.USD, commission_value=0.05, 
     commission_type=strategy.commission.percent, 
     process_orders_on_close=true)

//----------- get the user inputs --------------

//---------- RSI -------------
price = input(close, title="Source")

RSIlength = input.int(defval=6,title="RSI Length") 
RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1)
RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1)

//------- Bollinger Bands -----------
BBlength = input.int(defval=200, title="Bollinger Period Length", minval=1)
BBmult = input.float(defval=2.0, minval=0.001, maxval=50, step=0.1, title="Bollinger Bands Standard Deviation")
BBbasis = ta.sma(price, BBlength)
BBdev = BBmult * ta.stdev(price, BBlength)
BBupper = BBbasis + BBdev
BBlower = BBbasis - BBdev
source = close
buyEntry = ta.crossover(source, BBlower)
sellEntry = ta.crossunder(source, BBupper)
plot(BBbasis, color=color.aqua, title="Bollinger Bands SMA Basis Line")
p1 = plot(BBupper, color=color.silver, title="Bollinger Bands Upper Line")
p2 = plot(BBlower, color=color.silver, title="Bollinger Bands Lower Line")
fill(plot1=p1, plot2=p2, title="Bollinger BackGround", color=color.new(color.aqua,90), fillgaps=false, editable=true)

//---------- input TP/SL ---------------
tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss:  ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01

longEntry = input.bool(defval=true, title= 'Long Entry', inline="11")
shortEntry = input.bool(defval=true, title='Short Entry', inline="11")

//---------- backtest range setup ------------
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay     = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth   = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear    = input.int(defval = 2042, title = "To Year", minval = 2010)

//------------ time interval setup -----------
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

//------- define the global variables ------
var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false
//--------- Colors ---------------

TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na
//bgcolor(switch2?(color.new(TrendColor,50)):na)


//--------- calculate the input/output points -----------
longProfitPrice  = strategy.position_avg_price * (1 + tp)     // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl)        // sl -> stop loss percentage

shortProfitPrice  = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)


//---------- RSI + Bollinger Bands Strategy -------------
vrsi = ta.rsi(price, RSIlength)

rsiCrossOver = ta.crossover(vrsi, RSIoverSold)
rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought)

BBCrossOver = ta.crossover(source, BBlower)
BBCrossUnder = ta.crossunder(source, BBupper)

if (not na(vrsi))

    if rsiCrossOver and BBCrossOver
        long := true
        
    if rsiCrossUnder and BBCrossUnder
        long := false

//------------------- determine buy and sell points ---------------------
buySignall = window() and long  and (not stoppedOutLong)
sellSignall = window() and (not long)  and (not stoppedOutShort)

//---------- execute the strategy -----------------
if(longEntry and shortEntry)
    if long 
        strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG")
        stoppedOutLong := true
        stoppedOutShort := false
    else 
        strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT")
        stoppedOutLong  := false
        stoppedOutShort := true

else if(longEntry)
    strategy.entry("LONG", strategy.long,  when = buySignall)
    strategy.close("LONG", when = sellSignall)
    if long 
        stoppedOutLong := true
    else
        stoppedOutLong  := false

else if(shortEntry)
    strategy.entry("SHORT", strategy.short, when = sellSignall)
    strategy.close("SHORT", when = buySignall)
    if not long
        stoppedOutShort := true
    else
        stoppedOutShort := false
    

//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger")

else if(tp>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger")
        
else if(sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG",  stop=longStopPrice, comment="Long SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT",  stop=shortStopPrice, comment="Short SL Trigger")



















Больше