Стратегия следования за трендом на основе индикатора Stochastic и индикатора CCI


Дата создания: 2023-11-22 16:23:31 Последнее изменение: 2023-11-22 16:23:31
Копировать: 1 Количество просмотров: 844
1
Подписаться
1617
Подписчики

Стратегия следования за трендом на основе индикатора Stochastic и индикатора CCI

Обзор

Стратегия сочетает в себе Stochastic и CCI для определения направления тренда, а также использует Rate of Change, чтобы отфильтровать шокирующие тренды и отслеживать их.

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

  1. Стохастический индикатор определяет пустоту
    Стохастический индикатор - это сигнал к покупке, когда он пересекает последний бар, и сигнал к продаже, когда он пересекает последний бар.
  2. Показатели CCI определяют направление тенденции
    CCI больше 0 для многоголового рынка, меньше 0 для пустого рынка
  3. Показатель Rate of Change отражает тенденцию к колебаниям в фильтре
    Настройка параметров Rate of Change, чтобы определить, находится ли цена в активном тренде
  4. Правила входа и выхода
    Сигнал покупки: Stochastic на последнем бар и CCI больше 0 и ценовой тренд активен
    Сигнал продажи: Стохастический пересекает последнюю полосу, и CCI меньше 0, и цена активно движется
    Стоп-убыток exit: длинная линия 3% стоп, короткая линия 3% стоп

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

  1. Высокая точность в сочетании с Stochastic и CCI для определения направления тренда
  2. Индекс Rate of Change эффективно отсекает шокирующие тенденции и предотвращает неэффективные сделки
  3. Многофункциональная двунаправленная торговля, позволяющая зафиксировать различные типы тенденций
  4. Прорыв в тренд, своевременное использование возможностей
  5. Строгое сдерживание убытков, предотвращение крупных потерь и эффективный контроль рисков

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

  1. Неправильная настройка параметров политики может привести к слишком консервативным или радикальным действиям
  2. Показатели имеют ограниченный эффект и могут быть неэффективными в крайних случаях.
  3. Например, в начале тренда, когда прорывный вход был пропущен, часть прибыли была сокращена.
  4. Слишком маленькие стоп-лоши могут быть легко взломаны, а слишком большие - неконтролируемы.

Направление оптимизации

  1. Оптимизация параметров. Улучшение параметров, поиск оптимальных комбинаций
  2. Добавление большего количества показателей, позволяющих оценивать тенденции, повышает эффективность принятия решений
  3. Активная остановка. Настройка отслеживания остановки или остановки с перемещением по времени, чтобы уменьшить вероятность прорыва остановки
  4. Оценка риска. Присоединение ограничений по показателям риска, таким как максимальный отказ, полный контроль над рисковыми отверстиями

Подвести итог

Стратегия объединяет три основных показателя Stochastic, CCI и Rate of Change, чтобы определить направление тренда, чтобы использовать возможности тренда в виде прорыва отслеживания. Преимущество стратегии заключается в том, что показатели сочетаются с точным определением и эффективной фильтрацией шокирующих явлений, с помощью строгого контроля риска остановки. Следующий шаг может быть улучшен с точки зрения оптимизации параметров, многозначной сочетания и стратегии остановки, что делает стратегию более стабильной и гибкой.

Исходный код стратегии
/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// 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

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, 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 = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

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(3.0, title='Stop Loss %') / 100 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

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

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")