Estrategia de scalping intradiario de combinación de dos indicadores

El autor:¿ Qué pasa?, Fecha: 2023-12-01 14:47:57
Las etiquetas:

img

Resumen general

Esta estrategia combina las señales de compra y venta de los indicadores TMO y AMA de LuxAlgo para capturar el comienzo de una tendencia durante la consolidación de rango.

Estrategia lógica

El indicador TMO refleja el impulso de los precios. Pertenece al tipo de indicador oscilador y puede generar señales comerciales cuando se produce una divergencia. El indicador AMA es un promedio móvil suavizado. Muestra una gama de fluctuaciones de precios, indicando condiciones de sobrecompra / sobreventa cuando el precio se acerca a la banda superior / inferior.

La lógica principal detrás de esta estrategia es: TMO puede detectar la divergencia de tendencia para generar señales comerciales. AMA puede identificar zonas de inversión de precios. Junto con la confirmación del aumento del tamaño del cuerpo de la vela, pueden mejorar la precisión de la captura del inicio de la tendencia. Por lo tanto, la estrategia será larga / corta cuando:

  1. TMO da la señal de compra, es decir, divergencia alcista Y AMA muestra su extremo máximo
  2. TMO da la señal de venta, es decir, divergencia bajista Y AMA muestra su extremo mínimo
  3. También requiere que el cuerpo de las 3 velas más recientes se expanda en tamaño

Esto resuelve el problema de la señal falsa de un solo indicador. El stop loss basado en barras recientes más alto más alto/más bajo más bajo puede controlar el riesgo de manera efectiva.

Ventajas

Las ventajas de esta estrategia incluyen:

  1. La combinación de indicadores mejora la precisión de la señal. TMO y AMA se validan entre sí para reducir las señales falsas y mejorar la precisión.

  2. La combinación de la señal TMO, extremidades AMA y el aumento del tamaño de la vela permite a la estrategia identificar eficazmente el inicio de la tendencia, que las estrategias de scalping persiguen.

  3. Al utilizar barras recientes precio más alto/más bajo como stop loss, controla el riesgo de cada operación evitando el riesgo de retraso del recálculo del indicador.

  4. Con sólo dos indicadores, la estrategia ha implementado un sistema completo de scalping con lógica clara y simple.

Los riesgos

Los principales riesgos de la estrategia:

  1. Como una estrategia de scalping dirigida a un período de retención corto, el alto costo de negociación puede afectar su rentabilidad.

  2. Riesgo de stop loss agresivo: al utilizar los precios extremos recientes para el stop loss, puede ser vulnerable al ruido del mercado y aumentar la probabilidad de que se desencadene el stop loss.

  3. El riesgo de optimización de parámetros es difícil. La estrategia implica múltiples parámetros. Encontrar la combinación óptima de parámetros puede ser un reto.

Optimización

La estrategia puede optimizarse aún más en los siguientes ámbitos:

  1. Añadir más indicadores de filtro como el volumen para eliminar señales falsas y mejorar aún más la calidad de la señal.

  2. Las pruebas de las modificaciones de las reglas de stop loss para que sea menos agresivo, por ejemplo, añadir barras de confirmación antes de activar el stop loss.

  3. Realizar la optimización de parámetros para encontrar la mejor combinación de parámetros para los indicadores, lo que puede ayudar a filtrar más ruido y aumentar la tasa de ganancia.

  4. Prueba de retroceso y comercio en vivo a través de diferentes productos y plazos para averiguar la mejor condición de mercado para esta lógica estratégica.

Conclusión

Esta estrategia combina las señales comerciales de TMO y AMA para el cuero cabelludo en los mercados de rango al capturar los primeros movimientos de la tendencia. Tiene las ventajas de una alta precisión de la señal, captura temprana de la tendencia y un control eficaz del riesgo.


/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
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/
// © Kaspricci

//@version=5
strategy("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)

headlineTMO = "TMO Settings"

tmoLength   = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource   = input.source(close, "TMO Source", group = headlineTMO)

// calculate values
osc         = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)

// determine color of historgram
oscColor    = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na

// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)

// conditon to find highs and lows
up          = ta.highest(tmoSource, tmoLength)
dn          = ta.lowest(tmoSource, tmoLength)

// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)

// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0

// -------------------------------------------------------------------------------------------------------------

headlineAMA = "AMA Settings"

amaSource   = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength   = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)


amaMulti    = input.float(defval = 2.0, title = "Factor", minval = 1)

amaShowCd   = input(defval = true , title = "As Smoothed Candles")
amaShowEx   = input(defval = true,   title = "Show Alternating Extremities")

amaAlpha    = input.float(1.0, "Lag",       minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta     = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')

// -------------------------------------------------------------------------------------------------------------

headlineSL = "Stop Loss Settings"

slLength    = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")

// -------------------------------------------------------------------------------------------------------------

var b       = array.new_float(0)
var float x = na

if barstate.isfirst
    for i = 0 to amaLength - 1
        x := i / (amaLength - 1)
        w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
        array.push(b, w)

// local function to filter the source
filter(series float x) =>
    sum = 0.

    for i = 0 to amaLength - 1
        sum := sum + x[i] * array.get(b,i)
    
    sum / array.sum(b)

// apply filter function on source series

srcFiltered = filter(amaSource)

deviation   = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti

upper       = srcFiltered + deviation
lower       = srcFiltered - deviation

//----
crossHigh   = ta.cross(high, upper)
crossLow    = ta.cross(low, lower)

var os      = 0
os          := crossHigh ? 1 : crossLow ? 0 : os[1]

ext         = os * upper + (1 - os) * lower

//----
os_css = ta.rsi(srcFiltered, amaLength) / 100

extColor    = os == 1 ? #30FF85 : #ff1100

plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)

// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na

if amaShowCd
    h := filter(high)
    l := filter(low)
    c := filter(amaSource)
    body := math.abs(math.avg(c[1], c[2]) - c)

ohlc_os = ta.rsi(c, amaLength) / 100

plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)

// -------------------------------------------------------------------------------------------------------------

plotshape(bull ? ext : na, "Bullish Circle", shape.circle,    location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle,    location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label",  shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label",  shape.labelup,   location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)

// -------------------------------------------------------------------------------------------------------------

candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]

longEntryCond   = os == 1 and bull
shortEntryCond  = os == 0 and bear

longEntry       = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond)  < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry      = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)

longExit        = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit       = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)

recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow  = ta.lowest(low,   slLength) // lowest low of recent candles

bgcolor(longEntry  ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)

slLong          = (close - recentSwingLow) / syminfo.mintick  // stop loss in ticks
slShort         = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks

newOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades)

alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"

if (longEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
    
    strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
    strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)

if(longExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

if (shortEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)

    strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
    strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)

if(shortExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

Más.