Estrategias alcistas y bajistas basadas en canales de fluctuación interna de precios


Fecha de creación: 2023-12-11 15:56:28 Última modificación: 2023-12-11 15:56:28
Copiar: 2 Número de Visitas: 590
1
Seguir
1621
Seguidores

Estrategias alcistas y bajistas basadas en canales de fluctuación interna de precios

Descripción general

La estrategia utiliza el canal interno del precio para determinar el movimiento futuro del precio y es una estrategia de seguimiento de tendencias. Cuando el precio forma una cierta cantidad de canal interno de fluctuación del precio, se considera una señal de cambio de tendencia y se realiza una operación de compra o venta.

Principio de estrategia

Esta estrategia determina la formación de un canal interno en función de la relación entre el precio máximo y el precio mínimo de las dos líneas K anteriores y posteriores. Cuando un número determinado de líneas K cumple con la condición de que el precio máximo es inferior al precio máximo de la línea K anterior y el precio mínimo es superior al precio mínimo de la línea K anterior, se determina que el precio es un canal interno.

Al mismo tiempo que determina la formación de un canal interno de precios, la estrategia también determina la dirección de este canal interno. Si es un canal interno bajista, genera una señal de compra; si es un canal interno bajista, genera una señal de venta. Por lo tanto, la estrategia pertenece a una estrategia de negociación bidireccional.

Para filtrar falsas señales, la estrategia también introdujo un indicador de promedio móvil. Sólo se producen señales de negociación reales cuando el precio está por encima o por debajo de la media móvil. Esto puede evitar hasta cierto punto las transacciones erróneas en la liquidación del mercado.

Después de la entrada, la estrategia también establece un punto de parada de pérdidas según la elección del usuario. Se pueden elegir tres tipos de paradas: paradas de puntos fijos, paradas de ATR y paradas de puntos máximos y mínimos previos. La configuración de paradas es una parada del porcentaje de retorno del riesgo. Esto puede bloquear los beneficios y controlar el riesgo hasta cierto punto.

Análisis de las ventajas

La mayor ventaja de esta estrategia reside en su gran capacidad para identificar los puntos de inflexión de tendencias. Cuando los precios forman un cierto número de canales internos, suelen indicar que se avecina una gran caída. Este juicio es altamente compatible con la teoría tradicional del análisis técnico.

Además, la estrategia en sí misma es muy configurable. Los usuarios pueden elegir libremente el número de canales internos, el ciclo de la media móvil, los parámetros de parada de pérdidas, etc. Esto proporciona una gran flexibilidad para diferentes variedades y estilos de negociación.

Finalmente, la estrategia incluye un filtro de media móvil y una configuración de stop loss que reduce considerablemente el riesgo de negociación. Esto hace que la estrategia pueda aplicarse a operaciones en todo tipo de entornos de mercado.

Análisis de riesgos

El mayor riesgo de esta estrategia es la alta probabilidad de error en la determinación de la tendencia. Los canales internos no pueden determinar completamente la reversión de los precios, existe una cierta probabilidad de error. Si la cantidad determinada es insuficiente, puede haber casos de falsas señales.

Además, la estrategia no se aplica en absoluto en un mercado de reajuste o oscilación. Cuando los precios oscilan hacia arriba y hacia abajo, pero no se ha establecido una tendencia, la estrategia generará una serie de señales erróneas. Esto se debe a la mecánica de la estrategia.

Por último, los paros demasiado conservadores también pueden hacer que la estrategia no se mantenga el tiempo suficiente para capturar ganancias en las grandes tendencias. Esto requiere que el usuario se balancee a sí mismo.

Dirección de optimización

La estrategia tiene un amplio margen de optimización. Algunas de las posibles direcciones de optimización incluyen:

  1. Optimización de la cantidad y la forma de los canales internos. Se puede probar la eficacia de las transacciones en diferentes cantidades o en diferentes combinaciones de secuencias.

  2. Optimización de los parámetros de ciclo de las medias móviles para que sean mejores para juzgar la dirección de las tendencias. El ciclo predeterminado actual puede no ser adecuado para todas las variedades.

  3. Añadir otros filtros de indicadores. Por ejemplo, la introducción de bandas de Brin, que generan una señal de negociación solo cuando el precio se rompe en la banda de Brin para subir o bajar de la vía.

  4. Optimización de los parámetros de stop loss para que la estrategia pueda mantener posiciones durante un período más prolongado de tiempo y, por lo tanto, capturar ganancias en la supertrend.

En general, la estrategia existe por su precisión en el juicio de la tendencia. La mejor manera de operar con un algoritmo eficaz es asegurando la precisión del juicio, complementado con una configuración adecuada de gestión de riesgos.

Resumir

En general, esta estrategia es una estrategia de negociación cuantitativa para determinar la tendencia futura de los precios en función de los canales internos de los precios. Combina el seguimiento de la tendencia y la inversión de la tendencia.

Código Fuente de la Estrategia
/*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)