Стратегия прорыва на основе импульса


Дата создания: 2024-02-23 14:27:21 Последнее изменение: 2024-02-23 14:27:21
Копировать: 0 Количество просмотров: 641
1
Подписаться
1617
Подписчики

Стратегия прорыва на основе импульса

Обзор

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

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

Эта стратегия используется для определения рыночных тенденций и ключевых уровней цен, рассчитывая различные длительные периоды Donchian channel. В частности, она определяет, что цены находятся в восходящем тренде, когда они пересекают более длительный цикл, такой как 40-дневный Donchian channel, и на этой основе посылает много сигналов в сочетании с фильтрационными условиями, такими как новое высокое, движущееся среднее, расположение в направлении линейной линии в течение года; а когда цены падают вниз по более длительному Donchian channel, для определения нисходящего тренда, они посылают пустой сигнал в сочетании с новыми низкими фильтрационными условиями, такими как новое низкое в течение года.

С точки зрения выхода из позиции, стратегия предлагает два варианта: фиксированная линия отмены и отслеживание стоп-убытков. Фиксированная линия отмены - это установка стоп-убытков на основе более коротких периодов, таких как 20-дневный канал Дончиана; отслеживание стоп-убытков - это плавающий стоп-убыток, рассчитанный ежедневно на основе ATR. Оба способа остановки хорошо контролируют риск.

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

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

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

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2024-01-23 00:00:00
end: 2024-02-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyHigh-SellLow Strategy", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)
donchianEntryLength = input(40, step=10)
donchianExitLength = input(20, step=10)

considerNewLongTermHighLows = input(true)
shortHighLowPeriod = input(120, step=10)
longHighLowPeriod = input(180, step=10)

considerMAAlignment = input(true)
MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LookbackPeriod = input(40, minval=10,step=10)

atrLength = input(22)
atrMult = input(4)

exitStrategy = input(title="Exit Strategy", defval="tsl", options=["dc", "tsl"])

considerYearlyHighLow = input(true)
backtestYears = input(10, minval=1, step=1)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0

//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

donchian(rangeLength)=>
    upper = highest(rangeLength)
    lower = lowest(rangeLength)
    middle = (upper+lower)/2
    [middle, upper, lower]

inDateRange = true
[eMiddle, eUpper, eLower] = donchian(donchianEntryLength)
[exMiddle, exUpper, exLower] = donchian(donchianExitLength)
maAlignment = f_getMaAlignment(MAType, false)
[yearlyHighCondition, yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHigh,newLow] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)

maAlignmentLongCondition = highest(maAlignment, LookbackPeriod) == 1 or not considerMAAlignment 

atr = atr(atrLength)
tsl = f_getTrailingStop(atr, atrMult)

//U = plot(eUpper, title="Up", color=color.green, linewidth=2, style=plot.style_linebr)
//D = plot(exLower, title="Ex Low", color=color.red, linewidth=2, style=plot.style_linebr)
longCondition = crossover(close, eUpper[1]) and yearlyHighCondition and newHigh and maAlignmentLongCondition
exitLongCondition = crossunder(close, exLower[1])

shortCondition = crossunder(close, eLower[1]) and yearlyLowCondition and newLow
exitShortCondition = crossover(close, exUpper[1])
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange, oca_name="oca_buy")
strategy.exit("ExitBuyDC", "Buy", when=exitStrategy=='dc', stop=exLower)
strategy.exit("ExitBuyTSL", "Buy", when=exitStrategy=='tsl', stop=tsl)
plot(strategy.position_size > 0 ? (exitStrategy=='dc'?exLower:tsl) : na, title="Trailing Stop", color=color.red, linewidth=2, style=plot.style_linebr)
//strategy.close("Buy", when=exitLongCondition)