Стратегия колебаний цены среднего отклонения от RSI

Автор:Чао Чжан, Дата: 2023-09-26 19:55:03
Тэги:

Обзор

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

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

Стратегия сначала рассчитывает индикатор RSI, чтобы определить, является ли рынок перепроданным. Когда RSI ниже 30, он сигнализирует о возможности перепроданности. В этом случае, если цена ниже 100-периодной скользящей средней, будет открыта длинная позиция.

После открытия позиции стратегия устанавливает 6 средних уровней обратной цены на 98%, 97%, 95%, 90%, 84% и 70% текущей цены. Когда цена достигнет этих уровней, будет добавлено больше позиций. Постоянным снижением средней стоимости позиции можно снизить.

Кроме того, рассчитывается средняя цена позиции. Приобретение прибыли начинается, когда цена повышается более чем на 5% выше средней цены. Кроме того, если цена продолжает повышаться выше 5% приобретения прибыли от средней цены, все позиции будут закрыты.

Наконец, в стратегию включен механизм DCA. Каждый понедельник, если есть открытые позиции и цена ниже средней цены, к позиции будет добавлена фиксированная сумма. Это еще больше снижает стоимость.

Анализ преимуществ

Наибольшее преимущество этой стратегии заключается в использовании механизмов снижения среднего и DCA для контроля рисков.

  1. Принятие позиций в паре диверсифицирует риск открытия и не позволяет пропустить самую низкую точку.

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

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

  4. Применение DCA еще больше снижает стоимость и контролирует риск.

  5. Использование индикатора RSI предотвращает открытие позиций на вершинах.

  6. Фильтр скользящей средней избегает обратных сделок.

Анализ рисков

Стратегия также сопряжена с некоторыми рисками:

  1. Стратегия не может определить точки переворота рынка.

  2. Не существует механизма остановки потерь для эффективного контроля потерь на одной сделке.

  3. Количество позиций не ограничено, что может привести к увеличению количества, если рынок резко рухнет.

  4. DCA несет в себе риски сроков и не гарантирует открытие позиций в самом низком уровне.

Возможные решения:

  1. Включить другие показатели для оценки структуры рынка вместо того, чтобы полагаться только на RSI.

  2. Добавьте движущуюся или сдвинутую стоп-лосс.

  3. Ограничьте количество дополнений позиций.

  4. Оптимизировать логику входа DCA на более стабильный механизм.

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

Стратегия может быть улучшена следующими способами:

  1. Оптимизируйте алгоритм среднего реверсия на более научный подход.

  2. Улучшить механизмы получения прибыли, такие как остановка или слоистое получение прибыли.

  3. Добавьте стоп-лосс для лучшего контроля риска одной сделки.

  4. Включить другие показатели для анализа структуры рынка вместо чисто RSI.

  5. Оптимизировать логику DCA, чтобы избежать рисков фиксированного времени входа.

  6. Добавьте размеры позиций для оптимизации общего размера позиций.

  7. Оптимизировать параметры в соответствии со статистическими характеристиками рынка.

  8. Добавьте логику переключения для адаптации к различным рыночным режимам.

Заключение

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


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 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/
//@version=4
// © A3Sh

// RSI Strategy that buys the dips, works with Price Averaging and has a Dollar Cost Average option.
// When the price drops below specified percentages of the price (6 PA layers), new entries are openend to average the price of the assets.
// Open entries are closed by a specified take profit.
// Entries can be reopened, after closing and consequently crossing a PA layer again.
// The idea is to lower the average position price to a point that when the market rises, the current price crosses over the average position price.
// When the current price crosses the average position size and reaches the specified take profit, all entries are closed at once.
// In case the market drops significantly, there is an option to activate DCA to lower the average price further.

// RSI code adapted from the Optimized RSI Buy the Dips strategy, by Coinrule
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/
// Pyramiding entries code adapted from Pyramiding Entries on Early Trends startegy, by Coinrule
// https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
// Plot entry layers code adapted from HOWTO Plot Entry Price by vitvlkv
// https://www.tradingview.com/script/bHTnipgY-HOWTO-Plot-Entry-Price/
// Buy every week code based on the following question in Stack Overflow
// https://stackoverflow.com/questions/59870411/in-pine-script-how-can-you-do-something-once-per-day-or-keep-track-if-somethin


strategy(title = "RSI+PA+DCA", pyramiding = 16, overlay = true, initial_capital = 400, default_qty_type = strategy.percent_of_equity, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.075)

port = input(15, title = "Portfolio %", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
q = (strategy.equity / 100 * port) / open

// Long position entry layers. Percentage from the entry price of the the first long
PositionInputs = input("++++", title = "+++++ Long Positions VA Layers +++++")

ps2 = input(2,  title = "2nd Long Entry %", step = 0.1)
ps3 = input(3,  title = "3rd Long Entry %", step = 0.1)
ps4 = input(5,  title = "4th Long Entry %", step = 0.1)
ps5 = input(10, title = "5th Long Entry %", step = 0.1)
ps6 = input(16, title = "6th Long Entry %", step = 0.1)


// Calculate Moving Averages
maInput = input("++++", title = "+++++ Moving Average Filter +++++")

plotMA = input(title = "Plot Moving Average", defval = false)
movingaverage_signal = sma(close, input(100))
plot (plotMA ? movingaverage_signal : na, color = color.white)

// RSI inputs and calculations
rsiInput = input( "++++", title = "+++++ RSI Inputs +++++" )

length =     input( 14 )
overSold =   input( 30, title = "oversold, entry trigger long position" )
overBought = input( 70, title = "overbought, has no specific function")
price = close
vrsi = rsi(price, length)

// Long trigger (co)
co = crossover(vrsi, overSold) and close < movingaverage_signal

// Take profit
takeprofit = input("++++", title = "+++++ Take Profit +++++")

ProfitTarget_Percent = input(5)


// Store values to create and plot the different DCA layers
long1 = valuewhen(co, close, 0)
long2 = valuewhen(co, close - (close / 100 * ps2), 0)
long3 = valuewhen(co, close - (close / 100 * ps3), 0)
long4 = valuewhen(co, close - (close / 100 * ps4), 0)
long5 = valuewhen(co, close - (close / 100 * ps5), 0)
long6 = valuewhen(co, close - (close / 100 * ps6), 0)

eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]

eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]

eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]

eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]

eps5 = 0.00
eps5 := na(eps5[1]) ? na : eps5[1]

eps6 = 0.00
eps6 := na(eps6[1]) ? na : eps6[1]

plot (strategy.position_size > 0 ? eps1 : na, title = "Long entry 1", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long entry 2", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long entry 3", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long entry 4", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps5 : na, title = "Long entry 5", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps6 : na, title = "Long entry 6", style = plot.style_linebr)


// Plot position average price
plot (strategy.position_avg_price, title = "Average price", style = plot.style_linebr, color = color.red, linewidth = 2)


// Take profit and exit all on take profit above position average price
tpv = strategy.position_avg_price + (strategy.position_avg_price / 100 * ProfitTarget_Percent)

tpl1 = close < tpv ? eps1 + close * (ProfitTarget_Percent / 100) : tpv
tpl2 = close < tpv ? eps2 + close * (ProfitTarget_Percent / 100) : tpv
tpl3 = close < tpv ? eps3 + close * (ProfitTarget_Percent / 100) : tpv
tpl4 = close < tpv ? eps4 + close * (ProfitTarget_Percent / 100) : tpv
tpl5 = close < tpv ? eps5 + close * (ProfitTarget_Percent / 100) : tpv
tpl6 = close < tpv ? eps6 + close * (ProfitTarget_Percent / 100) : tpv


// Open DCA order once at the start of the week
dcaWeek = input("++++", title = "+++++ Open DCA order once every week +++++")

newWeek = change(time("W"))
dcatime = input(title = "Buy a fixed amount every Monday", defval = false)
fixedAmount = input(40, title = "Fixed amount currency for DCA orders", step = 0.1)
dcaq = fixedAmount / open
plotchar (dcatime ? newWeek : na, "buy at Week start", "▼", location.top, size = size.tiny, color = color.white)
bgcolor (dcatime and newWeek ? color.white : na, transp = 50)

// Submit entry orders
if (co and strategy.opentrades == 0)
    eps1 := long1
    eps2 := long2
    eps3 := long3
    eps4 := long4
    eps5 := long5
    eps6 := long6

    strategy.entry("Long1", strategy.long, q)

if (strategy.opentrades == 1)
    strategy.entry("Long2", strategy.long, q, limit = eps2)

    
if (strategy.opentrades == 2)
    strategy.entry("Long3", strategy.long, q, limit = eps3)


if (strategy.opentrades == 3)
    strategy.entry("Long4", strategy.long, q, limit = eps4)


if (strategy.opentrades == 4)
    strategy.entry("Long5", strategy.long, q, limit = eps5)

    
if (strategy.opentrades == 5) 
    strategy.entry("Long6", strategy.long, q, limit = eps6)
    
// Submit Weekly DCA order, only when price is below position average price and when a position is open
if (dcatime and newWeek and strategy.position_size > 0 and close < strategy.position_avg_price) 
    strategy.entry("DCA", strategy.long, dcaq)


// Exit orders
if (strategy.position_size > 0)
    strategy.exit(id = "Exit 1", from_entry = "Long1", limit = tpl1)
    strategy.exit(id = "Exit 2", from_entry = "Long2", limit = tpl2)
    strategy.exit(id = "Exit 3", from_entry = "Long3", limit = tpl3)
    strategy.exit(id = "Exit 4", from_entry = "Long4", limit = tpl4)
    strategy.exit(id = "Exit 5", from_entry = "Long5", limit = tpl5)
    strategy.exit(id = "Exit 6", from_entry = "Long6", limit = tpl6)
    strategy.exit(id = "Exit DCA", from_entry = "DCA", limit = tpv)
 

// Make sure that all open limit orders are canceled after exiting all the positions 
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0   
if longClose
    strategy.cancel_all()





Больше