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


Дата создания: 2024-01-15 12:25:26 Последнее изменение: 2024-01-15 12:25:26
Копировать: 0 Количество просмотров: 639
1
Подписаться
1617
Подписчики

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

Обзор

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

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

Эта стратегия формирует ценовой канал, рассчитывая среднюю линию высоких и низких цен. В частности, рассчитывается средняя линия высоких и низких цен SMA длиной 10, формирующая верхнюю и нижнюю линию канала.

После входа, стратегия использует фиксированный стоп или trailing stop, чтобы выйти из позиции. Trailing stop включает в себя два параметра: фиксированный стоп и активирующий offset.

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

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

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

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

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

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

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

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

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

Правила выхода могут быть оптимизированы для перемещения стоп или 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)