Стратегия торговли с изменением показателя повышенного риска

Автор:Чао Чжан, Дата: 2024-01-30 17:06:45
Тэги:

img

Обзор

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

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

Торговые сигналы этой стратегии генерируются на основе бычьего/медвежьего перекрестков индикатора RSI. Индикатор RSI обычно использует 30 как линию перепродажи и 70 как линию перекупки. Когда линия RSI пересекает линию перепродажи, генерируется сигнал покупки. Когда линия RSI пересекает линию перекупки, генерируется сигнал продажи. На основе этой логики стратегия определяет зоны перекупки и перепродажи и генерирует соответствующие длинные/короткие сигналы.

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

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

Преимущества этой стратегии включают:

  1. Использование RSI для выявления уровней перекупленности/перепроданности является зрелой торговой техникой для надежного определения поворотных моментов на рынке.

  2. Использование кроссоверов "бычий" и "медвежий" фильтрует некоторые ложные сигналы и делает торговлю более надежной.

  3. Тенденционные остановки блокируют прибыль как можно больше, в то же время имея быстрые остановки для сдерживания потерь на торговле.

  4. Фиксированные уровни TP/SL также эффективно контролируют риск по торговле.

  5. В целом простая и понятная логика, легкая для понимания и реализации, подходящая для новичков.

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

Риски этой стратегии включают:

  1. Сигналы RSI могут быть ложными, с высокой вероятностью сбоя паттерна, что приводит к триггеру стоп-лосса.

  2. Фиксированная TP/SL не может адаптироваться к волатильности рынка, может сократить прибыль или допустить потери.

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

  4. Оптимизировать риск перенастройки как параметры можно только для исторических данных.

  5. Высокая частота торговли увеличивает затраты на транзакции и скольжение.

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

Возможные способы улучшения стратегии:

  1. Оптимизируйте параметры RSI для достижения наилучших результатов.

  2. Добавьте индикаторы фильтров для повышения точности сигнала.

  3. Адаптивные остановки/прибыли на основе волатильности рынка.

  4. Ограничьте частоту торговли, чтобы снизить затраты на транзакции.

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

  6. Проверка на более длительное время для проверки устойчивости.

Заключение

Подводя итог, это типичная стратегия обратного движения, использующая RSI для выявления перекупленности / перепроданности, с кроссоверами быка / медведя в качестве сигналов. Тенденционные остановки и фиксированные TP / SL управляют рисками. Логика проста и проста в реализации, подходит для новичков. Но риски, такие как ложные сигналы и настройка кривой, необходимо решать путем дальнейшей проверки и оптимизации перед живой торговлей.


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

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Author: © JoshuaMcGowan
// Taken from https://www.tradingview.com/script/GbZGYi6l-Adding-some-essential-components-to-a-prebuilt-RSI-strategy/
// Just updated to compile in version 4. 

//@version=4

strategy("Adding some essential components to a prebuilt RSI strategy", overlay=true)

/////////////// Component Code Start ///////////////

testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2100, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
    
/////////////// Component Code Stop ///////////////

// Replace RSI Component, Long/Short, and Long Signal/Short Signal conditions with your trade setup components.
///////////// RSI component /////////////

length = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close

vrsi = rsi(price, length)
notna = not na(vrsi)

/////////////// STRATEGY ///////////////

ts = input(99999, "Trailing Stop") / 100
tp = input(99999, "Take Profit") / 100
sl = input(99999, "Stop Loss") / 100

// Update this with your setup. 
long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

last_long = 0
last_short = 0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

// Update this to reflect your setup. 
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

float last_open_long_signal = 0
float last_open_short_signal = 0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0
last_short_signal = 0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

float last_high = 0
float last_low = 0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(200, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=long_signal)
    strategy.entry("Short", strategy.short, when=short_signal)

    // plot(long_call, color=color.red)
    // plot(short_call, color=color.green)
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)







Больше