Стратегия возврата к среднему значению RSI и волатильности цен


Дата создания: 2023-09-26 19:55:03 Последнее изменение: 2023-09-26 19:55:03
Копировать: 2 Количество просмотров: 749
1
Подписаться
1617
Подписчики

Обзор

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

Стратегический принцип

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

После открытия позиции, стратегия устанавливает шесть средних цен возвращения, соответственно, 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()