Эта стратегия использует стохастический RSI и индикатор изменения курса цен для определения направления тренда для входа и координации скользящего стоп-лосса для управления рисками.
Во-первых, стратегия рассчитывает стохастический RSI с использованием индикатора RSI длиной 5 и стохастического индикатора длиной 7. Когда значение стохастического RSI K выше значения D, это бычий сигнал. Когда K ниже D, это медвежий сигнал.
Во-вторых, стратегия рассчитывает показатель изменения курса цен EMA ROC. Когда EMA ROC превышает половину порога или ниже минусной половины порога, она определяет активное движение цен.
Затем, комбинируя сигналы стохастического RSI и скорость изменения цен, он определяет направление тренда. Когда стохастический RSI является бычьим и цена активно движется, идти длинный. Когда стохастический RSI медленный и цена активно движется, идти короткий.
Наконец, стратегия использует для управления рисками координатные скользящие стоп-лосс. После открытия позиции она продолжает обновлять самую высокую / самую низкую цену и использует определенное процентное расстояние от самой высокой / самой низкой цены в качестве уровня стоп-лосса.
Преимущества этой стратегии:
Стохастический индикатор RSI эффективно определяет тенденции и ситуации перекупки/перепродажи.
Коэффициент изменения цены фильтрует рынок, чтобы избежать ложных сигналов.
Координированное скольжение стоп-лосса может обеспечить максимальную прибыль при одновременном контроле риска.
Стратегия имеет большое пространство оптимизации для настройки параметров на основе различных продуктов.
Логика стратегии проста и понятна, легко понять и реализовать.
Риски этой стратегии:
Стохастический RSI может генерировать ложные сигналы, требует подтверждения с другими факторами.
Координативное скольжение может быть слишком агрессивным, может быть остановлено пробелами за ночь.
Краткосрочная реверсия может привести к прекращению потерь.
Параметры должны быть оптимизированы для различных продуктов, иначе производительность может быть плохой.
Стоимость торговли влияет на прибыльность стратегии, необходима разумная частота торговли.
Стратегия может быть дополнительно оптимизирована в следующих аспектах:
Оптимизировать параметры стохастического RSI для уменьшения ложных сигналов.
Оптимизировать скорость изменения параметров цены для улучшения эффекта фильтрации.
Добавьте индикатор тренда, чтобы избежать отклонений, таких как скользящие средние.
Оптимизировать процент стоп-лосса, чтобы уменьшить риск попадания в ловушку.
Добавьте управление размером позиции для контроля риска одной сделки, например, фиксированную сумму стоп-лосса или динамически корректируйте размер позиции на основе капитала счета.
Проверка параметров на различных продуктах для улучшения адаптивности.
В общем, эта стратегия имеет четкую и простую логику, определяет направление тренда с помощью стохастического 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)