Смешивание полосы Боллинджера и RSI со стратегией DCA

Автор:Чао Чжан, Дата: 2024-01-18 11:23:15
Тэги:

img

Обзор

Стратегия называется Bollinger Band and RSI Mixing with DCA. Она создает торговые сигналы на основе индикаторов Bollinger Band и Relative Strength Index (RSI) и управляет рисками с использованием прогрессивного среднего расхода долларов (DCA).

Принцип стратегии

Стратегия объединяет индикаторы Bollinger Band и RSI. Bollinger Band четко определяет тенденцию, когда выше средней полосы означает бычий рынок, а ниже - медвежий рынок. RSI указывает на ситуации с перекупкой и перепродажей. Стратегия создает индикатор MIX путем взвешивания отклонения полосы Боллинджера и значения K RSI. Долгий сигнал генерируется, когда индикатор MIX пробивается через 20 снизу.

Для прогрессивной части DCA первоначальная позиция открывается, когда MIX пробивается через 20. Дополнительные позиции добавляются по фиксированной сумме каждый раз, когда цена падает на фиксированный процент. Это продолжается до достижения максимальных позиций или запуска остановки потери / получения прибыли. Прибавляя позиции на рыночных минимумах несколько раз, средняя стоимость может быть постепенно снижена.

Преимущества стратегии

  1. Сочетание двух индикаторов повышает точность сигнала за счет более четкого суждения о тренде.

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

  3. Условия получения прибыли и остановки убытков оперативно контролируют риски и блокируют частичную прибыль.

  4. Добавленный фильтр диапазона дат позволяет проводить сфокусированные обратные тесты и оптимизацию конкретных периодов.

Риски и решения

  1. И полоса Боллинджера, и RSI могут испытывать сбои. Различные комбинации параметров могут быть проверены для наилучшей точности сигнала.

  2. Прогрессивный DCA может увеличить убытки во время крупных крахов путем непрерывного добавления позиций. Максимальные записи могут быть установлены вместе с надлежащим уровнем остановки убытков для лучшего контроля риска.

  3. Невозможно предвидеть события черного лебедя и ненормальные движения цен.

Руководство по оптимизации

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

  2. Оптимизируйте стоп-лосс, параметры получения прибыли для лучшего соотношения прибыли/убытка.

  3. Испытывайте разные размеры и частоты позиций добавления, чтобы найти оптимальные комбинации.

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

Резюме

Bollinger Band и RSI Mixing with DCA Strategy сочетает в себе множество количественных методов и методов. Он создает четкий индикатор оценки тренда и снижает стоимость путем прогрессивных дополнений. Строгие методы контроля риска, включая стоп-лосс и получение прибыли, делают его практичным. Дальнейшие испытания и оптимизации могут раскрыть его уникальные преимущества в прибыльной торговой системе.


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

// © lagobrian23
//@version=4
strategy(title = 'Bollinger Bands and RSI mix with DCA', shorttitle = 'BB/RSI with DCA',pyramiding = 20, calc_on_every_tick = true, overlay = false )
source=close
smoothK = input(3, "K", minval=1)
smoothD = input(3, "D", minval=1)
lengthRSI = input(14, "RSI Length", minval=1)
lengthStoch = input(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

// Bollinger Band

length = input(20,title = 'BB lookback length', minval=1)
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
BBval = (src - basis)/dev*30+50
offset = input(0, title = "Offset", type = input.integer, minval = -500, maxval = 500)
mix=(d + BBval)/2

//plot
//plot(k, "K", color=#606060)
plot(BBval, "BBval", color=#872323, offset = offset)
plot(d, "D", color=#FF6A00)
h0 = hline(80, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
plot(mix, "MIX", color=#888888, linewidth=3)

//background MIX
bgcolor(mix < 20 ? color.green : color.white, transp=50)
bgcolor(mix > 80 ? color.red : color.white, transp=50)

// Choosing the date range
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
toMonth = input(defval = 1,    title = "To Month",      type = input.integer, minval = 1, maxval = 12)
toDay   = input(defval = 1,    title = "To Day",        type = input.integer, minval = 1, maxval = 31)
toYear  = input(defval = 2112, title = "To Year",       type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true

// Initializing the strategy paraeters

P = input(defval = 1, title = 'Amount (P)' , type = input.integer, minval = 1, maxval = 100)
X = input(defval = 2, title = '% Price drop for consecutive entries(X)', type = input.float, minval = 1, maxval = 100)
B_tp = input(defval = 10, title = '% Level for Take Profit (B)', type = input.float , minval = 1, maxval = 100)
D_sl = input(defval = 10, title = '% Level for Stop Loss (D)', type = input.float, minval = 1, maxval = 100)
A = input(defval = 5, title = 'Max consecutive entries (A)', type = input.integer, minval = 2, maxval = 20)
Z = input(defval = 0.5, title = 'Z', type = input.float , minval = 0, maxval = 10)

// Declaring key DCA variables
entry_price = 0.0
entry_price := na(entry_price[1]) ? na : entry_price[1]
new_entry = 0.0
consec_entryCondition = false
// Implementing the strategy
longEntry = crossover(mix,20)
exitLongs = crossunder(mix, 80)

if(longEntry)
    entry_price := close
    strategy.entry('main_LE', strategy.long , P, when = window() and longEntry)

// Exiting conditions
stoploss = strategy.position_avg_price*(1-(D_sl/100))
takeprofit = strategy.position_avg_price*(1+(B_tp/100))
slCondition = crossunder(close, stoploss)
tpCondition = crossover(close, takeprofit)

// We want to exit if the 'mix' indicator crosses 80, take profit is attained or stop loss is tagged.
exitConditions = exitLongs or slCondition or tpCondition

// Consecutive entries upto A times
// strategy.risk.max_intraday_filled_orders(A)

//Dollar-Cost-Averaging
// Enter long whenever price goes down X%: amount set to (P+Y)*Z
newAmount = (P+X)*Z
// If we haven't reached max open trades, buy newAmount immediately price crosses under X% lower the previous entry price
new_entry := entry_price - ((X/100)*entry_price)
consec_entryCondition := crossunder(close, new_entry)
if(consec_entryCondition and strategy.opentrades != A)
    strategy.entry('consec_LE', strategy.long, newAmount, oca_name = 'consecLongs', when = window() and consec_entryCondition)
    entry_price := close
    
// Exiting
// The main trade is closed only when the  main exit conditions are satisfied
strategy.close('main_LE', comment = 'Main Long Closed', when = window() and exitConditions)

// A consective long is closed only when tp or sl is tagged
strategy.exit('ext a consec', 'consec_LE', loss = D_sl*strategy.position_avg_price , profit = B_tp*strategy.position_avg_price, oca_name =  'consecLongs')


Больше