Тенденция после стратегии прорыва канала с скользящей средней и последующей остановкой

Автор:Чао Чжан, Дата: 2024-01-15 12:25:26
Тэги:

img

Обзор

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

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

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

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

Стратегия также сочетает в себе фильтр временного диапазона, выполняющий только обратные тесты в течение определенного исторического периода времени, для проверки производительности на разных этапах рынка.

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

Стратегия использует ценовой канал и тренд с последующей остановкой, что позволяет отслеживать направления тренда в среднесрочной и долгосрочной перспективе.

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

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

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

Настройка параметров довольно субъективна, требуя корректировки на разных этапах рынка.

Возможности для расширения

Другие индикаторы, такие как объем, полосы Боллинджера, могут быть включены для фильтрации сигналов входа, избегая ловушек.

Правила выхода могут быть обновлены до последующей остановки или Chandelier Exit. Частичные цели прибыли могут быть рассмотрены, когда цена вновь входит в канал. Оптимизация фильтров входа и правил выхода может значительно улучшить стабильность стратегии.

Заключение

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


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

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

Больше