Стратегия Three Bar и Four Bar Breakout Reversion идентифицирует три или четыре K-линейных бара с сильным импульсом и принимает контратендентные сделки после того, как несколько небольших K-баров формируют уровни поддержки / сопротивления и появляются сигналы обратного движения.
Основная логика определения этой стратегии включает:
Распознать большие полоски (Gap Bars): Break 1,5 x ATR, с процентом тела выше 65%. Они считаются имеющими сильный импульс.
Распознать низкодиапазонные полоски (Сборные полоски): один или два последующих низкодиапазонных полоски после Gap Bars, с высокими / низкими уровнями, близкими к тем из Gap Bars. Они представляют собой замедление импульса и консолидацию, образуя уровни поддержки / сопротивления.
Признание сигнальных баров обратного движения: если после консолидации бара проходит через высокий/низкий уровень предыдущих баров, это может считаться сигналом обратного движения.
Стоп-лосс и прибыль: Установите стоп-лосс ниже/выше Gap Bar. Прибыль определяется умножением коэффициента риск-вознаграждение на расстояние стоп-лосса.
Основные преимущества этой стратегии:
Определите тенденции и переломы с использованием необработанных ценовых действий, не требуется никаких индикаторов.
Строгие правила, касающиеся пробелов и сбора пробелов, обеспечивают точность в фиксации реальных тенденций и консолидации.
Суждение о реверсионных барах по телам уменьшает ложные сигналы.
Каждая сделка занимает всего 3-4 бара.
Ясные правила стоп-лосса и прибыли облегчают управление рисками.
Основные риски:
Опираясь на настройки параметров, свободные параметры увеличивают ложные сигналы и проигрышные операции.
Уязвимы к фальшивым утечкам и не способны отфильтровать все ложные сигналы.
Риск оказаться в ловушке консолидации после неудачных попыток выхода.
Широкий диапазон стоп-потери означает большие потери, когда вы попали в ловушку.
Для снижения рисков:
Оптимизировать параметры для идентификации пробелов и сбора пробелов.
Добавьте фильтры, такие как строки подтверждения, перед вводом позиций.
Оптимизировать алгоритмы остановки потери, чтобы сделать их более адаптивными.
Основные направления оптимизации:
Добавить композитные фильтры, чтобы избежать ложных прорывов, например, требующих увеличения объема.
Комбинируйте с скользящими средними, принимая сигналы только при нарушении ключевых уровней MA.
Требуйте согласия в течение нескольких временных рамок, прежде чем вступать в сделки.
Динамически корректировать целевые показатели прибыли на основе волатильности рынка и предпочтения риска.
Комбинировать с системой идентификации рыночного режима, разрешать стратегию только в условиях тренда.
Эти оптимизации могут еще больше улучшить стабильность и рентабельность.
Стратегия Three Bar и Four Bar Breakout Reversion направлена на захват высококачественных движений тренда и реверсионных сделок. Она имеет преимущество коротких периодов удержания и высокой частоты. Существуют также внутренние риски, которые необходимо уменьшить путем непрерывной оптимизации. Эффективное выявление самодостаточных сигналов тренда и реверсии от действий сырой цены делает эту стратегию оправданной для дальнейших исследований и применения.
/*backtest start: 2023-12-10 00:00:00 end: 2023-12-17 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Three (3)-Bar and Four (4)-Bar Plays Strategy", shorttitle="Three (3)-Bar and Four (4)-Bar Plays Strategy", overlay=true, calc_on_every_tick=true, currency=currency.USD, default_qty_value=1.0,initial_capital=30000.00,default_qty_type=strategy.percent_of_equity) frommonth = input(defval = 1, minval = 01, maxval = 12, title = "From Month") fromday = input(defval = 1, minval = 01, maxval = 31, title = "From day") fromyear = input(defval = 2021, minval = 1900, maxval = 2100, title = "From Year") tomonth = input(defval = 12, minval = 01, maxval = 12, title = "To Month") today = input(defval = 31, minval = 01, maxval = 31, title = "To day") toyear = input(defval = 2100, minval = 1900, maxval = 2100, title = "To Year") garBarSetting1 = input(defval = 1.5, minval = 0.0, maxval = 100.0, title = "Gap Bar Size", type = input.float) garBarSetting2 = input(defval = 0.65, minval = 0.0, maxval = 100.0, title = "Gap Bar Body Size", type = input.float) TopSetting = input(defval = 0.10, minval = 0.0, maxval = 100.0, title = "Bull Top Bar Size", type = input.float) profitMultiplier = input(defval = 2.0, minval = 1.0, maxval = 100.0, title = "Profit Multiplier", type = input.float) // ========== 3-Bar and 4-Bar Play Setup ========== barSize = abs(high - low) bodySize = abs(open - close) gapBar = (barSize > (atr(1000) * garBarSetting1)) and (bodySize >= (barSize * garBarSetting2)) // find a wide ranging bar that is more than 2.5x the size of the average bar size and body is at least 65% of bar size bullTop = close > close[1] + barSize[1] * TopSetting ? false : true // check if top of bar is relatively equal to top of the gap bar (first collecting bull bar) bullTop2 = close > close[2] + barSize[2] * TopSetting ? false : true // check if top of bar is relatively equal to top of the gap bar (first collecting bear bar) bearTop = close < close[1] - barSize[1] * TopSetting ? false : true // check if top of bar is relatively equal to top of the gap bar (second collecting bull bar) bearTop2 = close < close[2] - barSize[2] * TopSetting ? false : true // check if top of bar is relatively equal to top of the gap bar (second collecting bear bar) collectingBarBull = barSize < barSize[1] / 2 and low > close[1] - barSize[1] / 2 and bullTop // find a collecting bull bar collectingBarBear = barSize < barSize[1] / 2 and high < close[1] + barSize[1] / 2 and bearTop // find a collecting bear bar collectingBarBull2 = barSize < barSize[2] / 2 and low > close[2] - barSize[2] / 2 and bullTop2 // find a second collecting bull bar collectingBarBear2 = barSize < barSize[2] / 2 and high < close[2] + barSize[2] / 2 and bearTop2 // find a second collecting bear bar triggerThreeBarBull = close > close[1] and close > close[2] and high > high[1] and high > high[2] // find a bull trigger bar in a 3 bar play triggerThreeBarBear = close < close[1] and close < close[2] and high < high[1] and high < high[2] // find a bear trigger bar in a 3 bar play triggerFourBarBull = close > close[1] and close > close[2] and close > close[3] and high > high[1] and high > high[2] and high > high[3] // find a bull trigger bar in a 4 bar play triggerFourBarBear = close < close[1] and close < close[2] and close < close[3] and high < high[1] and high < high[2] and high < high[3] // find a bear trigger bar in a 4 bar play threeBarSetupBull = gapBar[2] and collectingBarBull[1] and triggerThreeBarBull // find 3-bar Bull Setup threeBarSetupBear = gapBar[2] and collectingBarBear[1] and triggerThreeBarBear // find 3-bar Bear Setup fourBarSetupBull = gapBar[3] and collectingBarBull[2] and collectingBarBull2[1] and triggerFourBarBull // find 4-bar Bull Setup fourBarSetupBear = gapBar[3] and collectingBarBear[2] and collectingBarBear2[1] and triggerFourBarBear // find 4-bar Bear Setup labels = input(title="Show Buy/Sell Labels?", type=input.bool, defval=true) plotshape(threeBarSetupBull and labels, title="3-Bar Bull", text="3-Bar Play", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.green, textcolor=color.white, transp=0) plotshape(threeBarSetupBear and labels, text="3-Bar Bear", title="3-Bar Play", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.red, textcolor=color.white, transp=0) plotshape(fourBarSetupBull and labels, title="4-Bar Bull", text="4-Bar Play", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.green, textcolor=color.white, transp=0) plotshape(fourBarSetupBear and labels, text="4-Bar Bear", title="4-Bar Play", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.red, textcolor=color.white, transp=0) alertcondition(threeBarSetupBull or threeBarSetupBear or fourBarSetupBull or fourBarSetupBear, title="3-bar or 4-bar Play", message="Potential 3-bar or 4-bar Play") float sl = na float tp = na sl := nz(sl[1], 0.0) tp := nz(tp[1], 0.0) plot(sl==0.0?na:sl,title='SL', color = color.red) plot(tp==0.0?na:tp,title='TP', color = color.green) if (true) if threeBarSetupBull and strategy.position_size <=0 strategy.entry("3 Bar Long", strategy.long, when=threeBarSetupBull) sl :=low[1] if threeBarSetupBear and strategy.position_size >=0 strategy.entry("3 Bar Short", strategy.short, when=threeBarSetupBull) sl :=high[1] if fourBarSetupBull and strategy.position_size <=0 strategy.entry("4 Bar Long", strategy.long, when=fourBarSetupBull) sl :=min(low[1], low[2]) if fourBarSetupBear and strategy.position_size >=0 strategy.entry("4 Bar Short", strategy.short, when=fourBarSetupBear) sl :=max(high[1], high[2]) if sl !=0.0 if strategy.position_size > 0 tp := strategy.position_avg_price + ((strategy.position_avg_price - sl) * profitMultiplier) strategy.exit(id="Exit", limit=tp, stop=sl) if strategy.position_size < 0 tp := strategy.position_avg_price - ((sl - strategy.position_avg_price) * profitMultiplier) strategy.exit(id="Exit", limit=tp, stop=sl)