Estrategia de ruptura de medias móviles de alto nivel


Fecha de creación: 2023-10-30 12:22:28 Última modificación: 2023-10-30 12:22:28
Copiar: 0 Número de Visitas: 659
1
Seguir
1617
Seguidores

Estrategia de ruptura de medias móviles de alto nivel

Descripción general

La idea principal de esta estrategia es utilizar las rupturas de la línea media de nivel superior para lograr el comercio de tendencias. En el rango de tiempo de nivel superior, se puede determinar el comienzo de la tendencia cuando los precios rompen la línea media hacia arriba o hacia abajo, y se puede elegir la dirección adecuada para el seguimiento.

Principio de estrategia

La estrategia se desarrolló a través del lenguaje Pine Script y se divide en las siguientes partes:

  1. Parámetros de entrada

Se define el parámetro de período de la línea media, con el valor predeterminado de 200; se define el parámetro de período de tiempo de la línea K, con el valor predeterminado de la línea diaria “D” .

  1. Cálculo de la línea media

Utiliza la función ta.ema para calcular el promedio móvil exponencial.

  1. El juicio se rompió

Utilice las funciones ta.crossover y ta.crossunder para determinar si el precio ha roto o ha bajado de la línea media.

  1. Mapeo de señales

Cuando se produzca una ruptura, se traza una flecha hacia arriba o hacia abajo en la línea K.

  1. El comercio se cierra.

La posición se abre en la dirección elegida en el momento de la ruptura y se cierra después de que se alcance la distancia de doble parada.

La estrategia se basa en la capacidad de determinar tendencias en la línea media de alto nivel y el seguimiento de tendencias a través de operaciones de ruptura simples, que pertenecen a las estrategias de ruptura más tradicionales.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. El concepto es simple, fácil de entender y dominar.

  2. El ajuste de los parámetros es sencillo con sólo un indicador de la línea media.

  3. Las operaciones de ruptura son fáciles de hacer tendencia y no se negocian con frecuencia.

  4. Los ciclos de alto nivel muestran claramente las tendencias generales y no se ven afectados por las fluctuaciones a corto plazo.

  5. Se pueden configurar diferentes combinaciones de períodos de tiempo para diferentes variedades.

  6. La mayoría de las especies de la especie son de la misma especie, pero la mayoría de las especies son de la misma especie.

Análisis de riesgos

La estrategia también tiene sus riesgos:

  1. Las señales de ruptura pueden ser falsas y no filtrar eficazmente los movimientos del mercado.

  2. No se puede aprovechar de manera eficiente las oportunidades de la línea corta para obtener beneficios.

  3. Los perjuicios pueden ser más graves cuando la dirección hace un error de juicio.

  4. Cuando el ciclo de la línea media no coincide con el ciclo de negociación, se produce un exceso de operaciones o pérdidas.

  5. No se puede detener en tiempo real, y es más probable que se amplíen las pérdidas.

Las soluciones para hacer frente al riesgo incluyen: combinación de indicadores de tendencia, aumento de las condiciones de filtración, reducción adecuada del período de tenencia de la posición, ajuste dinámico de la posición de stop loss, etc.

Dirección de optimización

La estrategia puede considerarse para optimizar en los siguientes aspectos:

  1. Aumentar la combinación de indicadores de tendencia, como MACD, KD, etc., para aumentar la fiabilidad de las rupturas.

  2. Aumentar las condiciones de filtrado, como el volumen de transacciones o el canal de la línea de browsing, para evitar falsas brechas.

  3. Optimizar la coincidencia de los ciclos de los parámetros para que los ciclos de tenencia coincidan mejor con los ciclos de tendencia.

  4. Aumentar las estrategias de stop loss en tiempo real para controlar las pérdidas individuales mediante el seguimiento de los stops.

  5. Considere la optimización dinámica de los parámetros, combinada con la tecnología de aprendizaje automático.

  6. La idea es que los inversores de la zona de mercado de la zona de mercado de la zona de mercado de la zona de mercado de la zona de mercado de la zona de mercado de la zona de mercado.

Resumir

En general, la estrategia es sencilla, práctica, fácil de dominar y puede usarse como una de las estrategias de entrada para el comercio cuantitativo. Sin embargo, también hay algunos problemas que requieren mejoras a través de indicadores combinados, parámetros de optimización, parámetros de parada dinámicos, etc., para que la estrategia sea más estable y eficiente. Tiene un gran espacio de optimización y escalabilidad.

Código Fuente de la Estrategia
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// Open-Range-Breakout strategy
// No license. Free and Open Source.    

strategy('Strategy: ORB', shorttitle="ORB", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
period = input.int(defval=15, title="TimeRange", tooltip="The range in minutes (default: 15m)")
sessionInput = input(defval="0915-0930", title="Time Range", group="ORB settings", tooltip='What is the timeperiod (default 9:15AM to 9:30AM, exchange timezone')
hide = input.bool(defval = false, title="Hide ORB Range", group="ORB setting", tooltip = 'Hide the ORB range drawing')

// SL Related
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="StopLoss settings")

// Further Filtering
ignoreMementumVolume = input.bool(defval=false, title="Ignore Momentum & Volume", tooltip="Ignore Momentum & Volume to find out trades", group="Strengh Settings")
rsiLen = input.int(defval=14, title="Momentum Period", group="Strengh Settings", tooltip = 'To determine the momentum, RSI period is set default to 100')
rsiBullish = input.int(defval=50, step=1, title="Bullish Momentum", group="Strengh Settings", tooltip = 'Bullish Momentum, default set to RSI as 50')
rsiBearish = input.int(defval=50, step=1, title="Bearish Momentum", group="Strengh Settings", tooltip = 'Bearish Momentum, default set to RSI as 50')
volAvg = input.int(defval=20, step=1, title="Volume Average Period", group="Strengh Settings", tooltip = 'To calculate average volume, how many historical bars are considered. Default: 20.')
volThreshold = input.float(defval=1, step=0.1, title="Volume Strengh", group="Strengh Settings", tooltip = 'Multiplier: How big the current bar volume compared to average of last 20')

trendPeriod = input.int(defval=200, step=1, title="Trend Period", group="Trend Settings", tooltip = 'To calculate trend, what period is considered. Default: 200.')
hideTrend = input.bool(defval = false, title="Hide the trend line", group="Trend Settings", tooltip = 'Hide the trend')

hidePDHCL = input.bool(defval = false, title="Hide the PDHCL (prev day High Close Low range)", tooltip = 'Hide the Previous Day High, Close, Low lines')

hideTable = input.bool(defval = false, title="Hide the Summary Table", tooltip = 'Hide the summary table.')

// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")

// Util method

is_newbar(res) => 
	timeframe.change(time(res)) != 0

// print table
printTable(txt) =>
    var table t = table.new(position.bottom_right, 1, 1)
    table.cell(t, 0, 0, txt, text_halign = text.align_left, bgcolor = color.lime)
	
// globals
t = time(timeframe.period, sessionInput + ":1234567") // everyday
in_session = not na(t)
is_first = in_session and not in_session[1]
is_end_session = in_session[1] and not in_session
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false

var float orb_high = na
var float orb_low = na
if is_first
    orb_high := high
    orb_low := low
else
    orb_high := orb_high[1]
    orb_low := orb_low[1]
if high > orb_high and in_session
    orb_high := high
if low < orb_low and in_session
    orb_low := low

plot(hide ? na : orb_high, style=plot.style_line, color=orb_high[1] != orb_high ? na : color.green, title="ORB High", linewidth=2)
plot(hide ? na : orb_low, style=plot.style_line, color=orb_low[1] != orb_low ? na : color.red, title="ORB Low", linewidth=2)



// PDHCL (Previous Day High Close Low)
[dh,dl,dc] = request.security(syminfo.ticker, "D", [high[1],low[1], close[1]], lookahead=barmerge.lookahead_on)
plot(hidePDHCL ? na : dh, title="Prev High",  color=color.red,  linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : dl, title="Prev Low",  color=color.green,  linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : dc, title="Prev Close",  color=color.black,  linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : ta.vwap(close), title="Prev VWAP",  color=color.fuchsia,  linewidth=2, trackprice=true, show_last = 1)

var l1 = label.new(bar_index, hidePDHCL ? na : dh, 'PDH', style=label.style_label_right)

// Previous Day WWAP


// For SL calculation
atr = ta.atr(slAtrLen)	
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Momentum: rsi
rsi = ta.rsi(close, rsiLen)

// trend: EMA200
ema = ta.ema(close, trendPeriod)
plot(hideTrend ? na : ema, "EMA Trend", color=close > ema ? color.green : color.red, linewidth = 1)

// Volume-Weighed Moving Average calculation
vwmaAvg = ta.vwma(close, volAvg)
vwma_latest = volume
// plotshape((barstate.isconfirmed and (vwma_latest > (vwmaAvg * volThreshold))), title='VolumeData', text='', location=location.abovebar, style=shape.diamond, color=color.gray, textcolor=color.gray, size=size.tiny)

// Trade signals

longCond = barstate.isconfirmed and (ta.crossover(close, orb_high) or ta.crossover(close, dh)) and green(open, close) and (ignoreMementumVolume ? true : rsi > rsiBullish and (vwma_latest > (vwmaAvg * volThreshold)))
shortCond = barstate.isconfirmed and (ta.crossunder(close, orb_low) or ta.crossunder(close, dl)) and red(open, close) and (ignoreMementumVolume ? true : rsi < rsiBearish and (vwma_latest > (vwmaAvg * volThreshold)))

plotshape(longCond, title='Breakout', text='BO', location=location.belowbar, style=shape.triangleup, color=color.green, textcolor=color.green)
plotshape(shortCond, title='Breakout', text='BD', location=location.abovebar, style=shape.triangledown, color=color.red, textcolor=color.red)


// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")


// Plotting table
if (not hideTable and is_end_session)
    message =  syminfo.ticker + " :\n\nORB Upper: " + str.tostring(math.round(orb_high)) + "\nORB Lower: " + str.tostring(math.round(orb_low)) + "\nPDH: " + str.tostring(math.round(dh)) + "\nPDC: " + str.tostring(math.round(dc)) + "\nPDL: " + str.tostring(math.round(dl)) + "\nVWAP: " + str.tostring(math.round(ta.vwap(close)))   
    printTable(message)
    alert(message, alert.freq_once_per_bar_close)