В процессе загрузки ресурсов... загрузка...

Координация сдвижной стратегии остановки потерь

Автор:Чао Чжан, Дата: 2023-11-02 16:28:55
Тэги:

img

Обзор

Эта стратегия использует стохастический RSI и индикатор изменения курса цен для определения направления тренда для входа и координации скользящего стоп-лосса для управления рисками.

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

Во-первых, стратегия рассчитывает стохастический RSI с использованием индикатора RSI длиной 5 и стохастического индикатора длиной 7. Когда значение стохастического RSI K выше значения D, это бычий сигнал. Когда K ниже D, это медвежий сигнал.

Во-вторых, стратегия рассчитывает показатель изменения курса цен EMA ROC. Когда EMA ROC превышает половину порога или ниже минусной половины порога, она определяет активное движение цен.

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

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

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

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

  1. Стохастический индикатор RSI эффективно определяет тенденции и ситуации перекупки/перепродажи.

  2. Коэффициент изменения цены фильтрует рынок, чтобы избежать ложных сигналов.

  3. Координированное скольжение стоп-лосса может обеспечить максимальную прибыль при одновременном контроле риска.

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

  5. Логика стратегии проста и понятна, легко понять и реализовать.

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

Риски этой стратегии:

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

  2. Координативное скольжение может быть слишком агрессивным, может быть остановлено пробелами за ночь.

  3. Краткосрочная реверсия может привести к прекращению потерь.

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

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

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

Стратегия может быть дополнительно оптимизирована в следующих аспектах:

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

  2. Оптимизировать скорость изменения параметров цены для улучшения эффекта фильтрации.

  3. Добавьте индикатор тренда, чтобы избежать отклонений, таких как скользящие средние.

  4. Оптимизировать процент стоп-лосса, чтобы уменьшить риск попадания в ловушку.

  5. Добавьте управление размером позиции для контроля риска одной сделки, например, фиксированную сумму стоп-лосса или динамически корректируйте размер позиции на основе капитала счета.

  6. Проверка параметров на различных продуктах для улучшения адаптивности.

Резюме

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


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Sto2", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true
    
///////////// Stochastic calc /////////////
smoothK = input(1, minval=1)
smoothD = input(7, minval=1)
lengthRSI = input(5, minval=1)
lengthStoch = input(7, minval=1)
src = input(close, title="RSI Source")

up = sma(max(change(src), 0), lengthRSI) 
down = sma(-min(change(src), 0), lengthRSI)
rsi1 = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

///////////// Rate Of Change ///////////// 
source = close, roclength = input(14, minval=1), pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// STRATEGY ///////////////
long = k > d and isMoving()
short = k < d and isMoving()

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

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.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.0
last_short_signal = 0.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

last_high = 0.0
last_low = 0.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])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(9.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long)
    strategy.entry("Short Entry", strategy.short, when=short)
    strategy.exit("Long Ex", "Long Entry", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short Entry", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
p1 = plot(k, color=color.gray, linewidth=0)
p2 = plot(d, color=color.gray, linewidth=0)
h0 = hline(100)
h1 = hline(50)
h3 = hline(0)
fill(p1, p2, color = k > d ? color.lime : color.red, transp=70)

Больше