Esta estrategia es un sistema de negociación basado en la doble EMA y ATR. Utiliza promedios móviles exponenciales (EMA) de 38 y 62 períodos para identificar las tendencias del mercado, determina las señales de entrada a través de cruces de precios con la EMA rápida e incorpora el indicador ATR para la gestión dinámica de stop-loss.
La lógica central se basa en los siguientes elementos clave: 1. Determinación de tendencia: La tendencia del mercado se identifica a través de la posición relativa de las EMA de 38 períodos y 62 períodos. 2. señales de entrada: las señales largas se generan cuando el precio se rompe por encima de la EMA rápida durante las tendencias alcistas; las señales cortas ocurren cuando el precio se rompe por debajo de la EMA rápida durante las tendencias bajistas. Gestión de riesgos: emplea un sistema de stop-loss dinámico basado en ATR que ajusta el nivel de stop a medida que el precio se mueve favorablemente, protegiendo las ganancias al tiempo que evita salidas prematuras.
Esta estrategia construye un sistema de negociación completo de seguimiento de tendencias mediante la combinación del clásico sistema EMA dual con técnicas de stop-loss dinámicas modernas. Sus fortalezas se encuentran en el control integral del riesgo y la alta adaptabilidad, aunque los operadores aún necesitan optimizar los parámetros y gestionar los riesgos de acuerdo con las condiciones específicas del mercado. A través de las direcciones de optimización sugeridas, la estabilidad y rentabilidad de la estrategia pueden mejorarse aún más.
/*backtest start: 2024-12-10 00:00:00 end: 2025-01-08 08:00:00 period: 4h basePeriod: 4h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © aalapsharma //@version=5 strategy(title="CM_SlingShotSystem - Strategy", shorttitle="SlingShotSys_Enhanced_v5", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1) // Inputs sae = input.bool(true, "Show Aggressive Entry Bars? (Highlight only)") sce = input.bool(true, "Show Conservative Entry Bars? (Highlight only)") st = input.bool(true, "Show Trend Arrows (Top/Bottom)?") def = input.bool(false, "(Unused) Only Choose 1 - Either Conservative Entry Arrows or 'B'-'S' Letters") pa = input.bool(true, "Show Conservative Entry Arrows?") sl = input.bool(false, "Show 'B'-'S' Letters?") useStopLoss = input.bool(true, "Use Stop-Loss?") stopLossPerc = input.float(5.0, "Stop-Loss (%)", step=0.1) useTakeProfit = input.bool(true, "Use Take-Profit?") takeProfitPerc = input.float(20.0, "Take-Profit (%)", step=0.1) useTrailingStop = input.bool(false, "Use ATR Trailing Stop?") atrLength = input.int(14, "ATR Length", minval=1) atrMult = input.float(2.0, "ATR Multiple for Trailing Stop", step=0.1) // Calculations emaSlow = ta.ema(close, 62) emaFast = ta.ema(close, 38) upTrend = emaFast >= emaSlow downTrend = emaFast < emaSlow pullbackUpT() => emaFast > emaSlow and close < emaFast pullbackDnT() => emaFast < emaSlow and close > emaFast entryUpT() => emaFast > emaSlow and close[1] < emaFast and close > emaFast entryDnT() => emaFast < emaSlow and close[1] > emaFast and close < emaFast entryUpTrend = entryUpT() ? 1 : 0 entryDnTrend = entryDnT() ? 1 : 0 atrValue = ta.atr(atrLength) // Trailing Stop Logic (Improved) var float trailStopLong = na var float trailStopShort = na if (strategy.position_size > 0) trailStopLong := math.max(close - (atrValue * atrMult), nz(trailStopLong[1], close)) trailStopLong := strategy.position_avg_price > trailStopLong ? strategy.position_avg_price : trailStopLong else trailStopLong := na if (strategy.position_size < 0) trailStopShort := math.min(close + (atrValue * atrMult), nz(trailStopShort[1], close)) trailStopShort := strategy.position_avg_price < trailStopShort ? strategy.position_avg_price : trailStopShort else trailStopShort := na // Plotting col = emaFast > emaSlow ? color.lime : emaFast < emaSlow ? color.red : color.yellow p1 = plot(emaSlow, "Slow MA (62)", linewidth=4, color=col) p2 = plot(emaFast, "Fast MA (38)", linewidth=2, color=col) fill(p1, p2, color=color.silver, transp=50) barcolor((sae and pullbackUpT()) ? color.yellow : (sae and pullbackDnT()) ? color.yellow : na) barcolor((sce and entryUpT()) ? color.aqua : (sce and entryDnT()) ? color.aqua : na) plotshape(st and upTrend, title="Trend UP", style=shape.triangleup, location=location.bottom, color=color.lime) plotshape(st and downTrend, title="Trend DOWN", style=shape.triangledown, location=location.top, color=color.red) plotarrow((pa and entryUpTrend == 1) ? 1 : na, title="Up Entry Arrow", colorup=color.lime, maxheight=30, minheight=30) plotarrow((pa and entryDnTrend == 1) ? -1 : na, title="Down Entry Arrow", colordown=color.red, maxheight=30, minheight=30) plotchar(sl and entryUpTrend ? (low - ta.tr) : na, title="Buy Entry (Letter)", char='B', location=location.absolute, color=color.lime) plotchar(sl and entryDnTrend ? (high + ta.tr) : na, title="Short Entry (Letter)", char='S', location=location.absolute, color=color.red) plot(useTrailingStop and strategy.position_size > 0 ? trailStopLong : na, "Trailing Stop Long", color=color.green, style=plot.style_linebr) plot(useTrailingStop and strategy.position_size < 0 ? trailStopShort : na, "Trailing Stop Short", color=color.red, style=plot.style_linebr) // Function to calculate stop and limit prices f_calcStops(_entryPrice, _isLong) => _stopLoss = _isLong ? _entryPrice * (1.0 - stopLossPerc / 100.0) : _entryPrice * (1.0 + stopLossPerc / 100.0) _takeProfit = _isLong ? _entryPrice * (1.0 + takeProfitPerc / 100.0) : _entryPrice * (1.0 - takeProfitPerc / 100.0) [_stopLoss, _takeProfit] // Entry and Exit Logic (Simplified using strategy.close) if (entryUpT() and strategy.position_size == 0) strategy.entry("Long", strategy.long) if (entryDnT() and strategy.position_size == 0) strategy.entry("Short", strategy.short) // Exit conditions based on Stop-loss and Take-profit [slPrice, tpPrice] = f_calcStops(strategy.position_avg_price, strategy.position_size > 0) if (strategy.position_size > 0) strategy.exit("Exit Long", "Long", stop=slPrice, limit=tpPrice, trail_price = trailStopLong, trail_offset = atrValue * atrMult) if (strategy.position_size < 0) strategy.exit("Exit Short", "Short", stop=slPrice, limit=tpPrice, trail_price = trailStopShort, trail_offset = atrValue * atrMult) // Close opposite position on new entry signal if (entryUpT() and strategy.position_size < 0) strategy.close("Short", comment="Close Short on Long Signal") if (entryDnT() and strategy.position_size > 0) strategy.close("Long", comment="Close Long on Short Signal")