Бычьи и медвежьи стратегии, основанные на внутренних каналах колебаний цен


Дата создания: 2023-12-11 15:56:28 Последнее изменение: 2023-12-11 15:56:28
Копировать: 2 Количество просмотров: 590
1
Подписаться
1621
Подписчики

Бычьи и медвежьи стратегии, основанные на внутренних каналах колебаний цен

Обзор

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

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

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

При определении того, как формируется внутренний канал цены, стратегия также определяет направление этого внутреннего канала. Если это позитивный внутренний канал, то это создает сигнал покупки; если это падений внутренний канал, то это создает сигнал продажи. Таким образом, эта стратегия относится к двусторонней торговой стратегии.

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

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

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

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

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

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

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

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

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

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

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

Однако есть много возможностей для оптимизации этой стратегии. Некоторые возможные направления оптимизации включают:

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 3m
basePeriod: 1m
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/

// From "Day Trading Cryptocurrency 
// Strategies, Tactics, Mindset, and Tools Required To Build Your 
// New Income Stream"
// by Phil C. Senior

// "Inside bars are a two -bar pattern. They can indicate either a continuation of the 
// existing move or a reversal. A continuation occurs when there is no significant 
// support or resistance level in sight, while a reversal occurs close to a strong sup- 
// port or resistance level...
// ...A lot of traders are aware of inside bars but few manage to make money with 
// them. Why is this so? It goes back to interpreting price action. A lot of traders look 
// to trade in geometric ways. What I mean is that they search for fancy shapes on a 
// chart and think that this is what represents true price action. 
// This is not the case. A shape is just a shape. The formation by itself means 
// nothing unless underlying order flow backs it up. This is why it’s extremely impor- 
// tant that you look for inside bars when a trend is already in place. The best place to 
// look for them is in the beginning of trends."

// © tweakerID

//@version=4
strategy("Inside Bar Strategy w/ SL", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

i_NBars = input(defval=1, type=input.integer, title="# Of Inside Bars in pattern", options=[1, 2, 3, 4])
i_BarsDirection = input(false, title="Only trade using complete bullish or bearish patterns")
i_MAFilter = input(true, title="Use MA Trend Filter")
i_MALen = input(65, title="MA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=1, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(5, step=.1, title="ATR Multiple")
i_TPRRR = input(2, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop
float LongStop = valuewhen(bought,low[1],0)*(1-i_PercIncrement)
float ShortStop = valuewhen(bought,high[1],0)*(1+i_PercIncrement)
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

MAFilter=close > sma(close, i_MALen)
plot(i_MAFilter ? sma(close, i_MALen) : na)
bullBar=close > open
bearBar=close < open
contbullBar=barssince(not bullBar) >= (i_NBars+1)
contbearBar=barssince(not bearBar) >= (i_NBars+1)

InsideBar(NBars) =>
    Inside1Bar=high < high[1] and low > low[1] 
    Inside2Bar=high < high[2] and low > low[2] and Inside1Bar
    Inside3Bar=high < high[3] and low > low[3] and Inside1Bar and Inside2Bar
    Inside4Bar=high < high[4] and low > low[4] and Inside1Bar and Inside2Bar and Inside3Bar
    if NBars == 1
        inside1Bar=Inside1Bar
        [inside1Bar]
    else if NBars == 2
        inside2Bar=Inside2Bar
        [inside2Bar]
    else if NBars == 3
        inside3Bar=Inside3Bar   
        [inside3Bar]
    else if NBars == 4
        inside4Bar=Inside4Bar
        [inside4Bar]
    else
        [na]
[insideBar] = InsideBar(i_NBars) 
    
bullInsideBar=bar_index > 40 and insideBar and bullBar 
     and (i_BarsDirection ? contbullBar : true) and (i_MAFilter ? MAFilter : true)
bearInsideBar=bar_index > 40 and insideBar and bearBar 
     and (i_BarsDirection ? contbearBar : true) and (i_MAFilter ? not MAFilter : true)

BUY = bullInsideBar
SELL = bearInsideBar

//Debugging Plots
plot(contbullBar ? 1:0, transp=100, title="contbullBar")
plot(contbearBar ? 1:0, transp=100, title="contbearBar")

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)

SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)