Estratégias de alta e baixa baseadas em canais de flutuação interna de preços


Data de criação: 2023-12-11 15:56:28 última modificação: 2023-12-11 15:56:28
cópia: 2 Cliques: 590
1
focar em
1621
Seguidores

Estratégias de alta e baixa baseadas em canais de flutuação interna de preços

Visão geral

A estratégia utiliza o canal interno do preço para determinar a movimentação futura dos preços, e é uma estratégia de acompanhamento de tendências. Quando os preços formam uma certa quantidade de canal interno de flutuação dos preços, é considerado um sinal de reversão de tendência, para comprar ou vender.

Princípio da estratégia

A estratégia julga a formação de um canal interno com base na relação entre o preço máximo e o preço mínimo de duas linhas K anteriores e posteriores. Quando um certo número de linhas K satisfaz a condição de que o preço máximo é inferior ao preço máximo da linha K anterior e o preço mínimo é superior ao preço mínimo da linha K anterior, é julgado um canal interno de preços.

Ao mesmo tempo em que julga a formação de um canal interno de preço, a estratégia também julga a direção desse canal interno. Se for um canal interno de baixa, gera um sinal de compra; se for um canal interno de baixa, gera um sinal de venda. Portanto, a estratégia pertence a uma estratégia de negociação bidirecional.

Para filtrar os sinais falsos, a estratégia também introduziu o indicador de média móvel. Apenas quando o preço está acima ou abaixo da média móvel, um sinal de negociação real é produzido. Isso pode evitar, em parte, as transações erradas na liquidação do mercado.

Após a entrada, a estratégia também define um ponto de parada de perda de acordo com a escolha do usuário. Há três tipos de parada de perda escolhíveis: parada de ponto fixo, parada de ATR e parada de ponto máximo e mínimo anterior. A configuração de parada de parada é a paralisação da taxa de retorno do risco. Isso pode bloquear os lucros e controlar o risco até certo ponto.

Análise de vantagens

A maior vantagem desta estratégia é a sua capacidade de identificar os pontos de reversão de tendências. Quando os preços formam um certo número de canais internos, geralmente sinalizam a iminência de grandes quedas. Este julgamento é altamente compatível com a teoria da análise técnica tradicional.

Além disso, a estratégia em si é altamente configurável. Os usuários podem escolher livremente o número de canais internos, o ciclo da média móvel, os parâmetros de parada de perda, etc. Isso oferece uma grande flexibilidade para diferentes variedades e diferentes estilos de negociação.

Finalmente, a estratégia inclui filtros de média móvel e paradas de perda, o que reduz consideravelmente o risco de negociação. Isso permite que a estratégia seja aplicada a todos os tipos de negociação em diferentes ambientes de mercado.

Análise de Riscos

O maior risco desta estratégia é a maior probabilidade de erro no julgamento de tendências. Os canais internos não conseguem determinar completamente a reversão de preços, existindo uma certa probabilidade de erro. Se o número determinado for insuficiente, pode haver falsos sinais.

Além disso, a estratégia não se aplica em nenhum mercado de liquidação ou de turbulência. Quando os preços flutuam para cima e para baixo, mas não estabelecem uma tendência, a estratégia produzirá um sinal de erro contínuo. Isso é determinado pela mecânica da estratégia.

Finalmente, a configuração de stop loss é conservadora demais e pode impedir que a estratégia seja mantida por tempo suficiente para capturar o lucro da grande tendência. Isso requer que o usuário balance as configurações.

Direção de otimização

A estratégia ainda tem muito espaço para otimização. Algumas possíveis direções de otimização incluem:

  1. Otimizar o número e a forma dos canais internos. Pode testar a eficácia das transações em diferentes números ou combinações de arranjos.

  2. Otimizar os parâmetros de periodicidade das médias móveis para que sejam mais indicadores de tendências. O ciclo padrão atual pode não ser adequado para todas as variedades.

  3. Adicionar outros filtros de indicadores. Por exemplo, introduzir a faixa de Brin, que só gera um sinal de negociação quando o preço quebra a faixa de Brin para cima ou para baixo.

  4. Optimizar os parâmetros de stop loss para permitir que a estratégia mantenha uma posição por um período maior de tempo, capturando assim os lucros da supertrend.

Em geral, a estratégia existe pela sua precisão no julgamento de tendências. Com a garantia da precisão do julgamento, complementada com uma configuração apropriada de gerenciamento de risco, é possível negociar com algoritmos de melhor desempenho.

Resumir

A estratégia é, em geral, uma estratégia de negociação quantitativa baseada em canais internos de preços para determinar a tendência futura dos preços. Combina os dois métodos de determinação, acompanhamento de tendências e reversão de tendências, com certas vantagens. Mas também há espaço para otimização, onde o investidor pode ajustar de acordo com suas próprias necessidades para se adequar à variedade e ao ambiente de negociação específicos.

Código-fonte da estratégia
/*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)