Esta estrategia combina el indicador estocástico para determinar los puntos de reversión de sobrecompra y sobreventa y el indicador MACD para identificar las reversiones de tendencia, con el objetivo de comprar bajo y vender alto a través de la negociación de reversión.
Utilice el indicador estocástico para identificar las condiciones de sobrecompra y sobreventa.
Ir largo en cruces de oro del MACD y ir corto en cruces de muerte del MACD. Cruzar el MACD por encima de la línea de señal indica una reversión de la media móvil e implica una reversión de la tendencia.
Tome posiciones largas o cortas cuando la reversión estocástica se alinee con las señales de reversión del MACD.
Implementar un stop loss de seguimiento. Después de entrar en una tendencia, cuando el precio alcanza un cierto porcentaje de ganancia, se activa el stop de seguimiento. El nivel de stop luego sigue el canal de precios ascendentes.
Las posiciones existentes se cierran y el stop loss se restablece cuando aparece una nueva señal de inversión.
Las confirmaciones de múltiples indicadores mejoran la precisión de la señal
El estocástico identifica eficazmente las zonas de sobrecompra/sobreventa
El MACD captura temprano la reversión de la media móvil
El trailing stop cierra bien las ganancias.
Datos suficientes de backtesting con señales estratégicas claras
Parámetros optimizados para ajustes fáciles
Dificultad para optimizar varios indicadores
Las señales de reversión pueden ser mal juzgadas y necesitan validación
Se necesitan más datos para probar y optimizar las paradas traseras
Naturaleza de retraso del estocástico y del MACD
El comercio frecuente puede acarrear mayores costes
Añadir más indicadores para construir un sistema de negociación robusto
Prueba diferentes períodos de parámetros para encontrar combinaciones óptimas
Desarrollar parámetros adaptativos que se actualicen en tiempo real
Establecer el límite de pérdida de retirada para limitar la retirada máxima
Incorporar el volumen para evitar señales falsas de divergencia
Considerar el impacto de los costes de negociación y establecer un objetivo de ganancia mínima
Esta estrategia combina los puntos fuertes del estocástico y el MACD en la identificación de puntos de negociación de reversión favorables. El mecanismo de trailing stop también bloquea efectivamente las ganancias. Pero el comercio de reversión todavía conlleva riesgos inherentes que necesitan validación de más indicadores y una mayor optimización de parámetros. Con parámetros estables y una gestión adecuada del capital, esta estrategia puede convertirse en un sistema de negociación a corto plazo altamente eficiente.
/*backtest start: 2022-09-14 00:00:00 end: 2023-06-24 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //////////////////////////////////////////////////////////// // @CoinDigger // // Credits for the base strategy go to HPotter // // I've just added a trail stop, basic leverage simulation and stop loss // //////////////////////////////////////////////////////////// // Copyright by HPotter v1.0 28/01/2021 // This is combo strategies for get a cumulative signal. // // First strategy // This System was created from the Book "How I Tripled My Money In The // Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies. // The strategy buys at market, if close price is higher than the previous close // during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. // The strategy sells at market, if close price is lower than the previous close price // during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50. // // Second strategy // MACD – Moving Average Convergence Divergence. The MACD is calculated // by subtracting a 26-day moving average of a security's price from a // 12-day moving average of its price. The result is an indicator that // oscillates above and below zero. When the MACD is above zero, it means // the 12-day moving average is higher than the 26-day moving average. // This is bullish as it shows that current expectations (i.e., the 12-day // moving average) are more bullish than previous expectations (i.e., the // 26-day average). This implies a bullish, or upward, shift in the supply/demand // lines. When the MACD falls below zero, it means that the 12-day moving average // is less than the 26-day moving average, implying a bearish shift in the // supply/demand lines. // A 9-day moving average of the MACD (not of the security's price) is usually // plotted on top of the MACD indicator. This line is referred to as the "signal" // line. The signal line anticipates the convergence of the two moving averages // (i.e., the movement of the MACD toward the zero line). // Let's consider the rational behind this technique. The MACD is the difference // between two moving averages of price. When the shorter-term moving average rises // above the longer-term moving average (i.e., the MACD rises above zero), it means // that investor expectations are becoming more bullish (i.e., there has been an // upward shift in the supply/demand lines). By plotting a 9-day moving average of // the MACD, we can see the changing of expectations (i.e., the shifting of the // supply/demand lines) as they occur. // // WARNING: // - For purpose educate only // - This script to change bars colors. //////////////////////////////////////////////////////////// Reversal123(Length, KSmoothing, DLength, Level) => vFast = sma(stoch(close, high, low, Length), KSmoothing) vSlow = sma(vFast, DLength) pos = 0.0 pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1, iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) pos MACD(fastLength,slowLength,signalLength) => pos = 0.0 fastMA = ema(close, fastLength) slowMA = ema(close, slowLength) macd = fastMA - slowMA signal = sma(macd, signalLength) pos:= iff(signal < macd , 1, iff(signal > macd, -1, nz(pos[1], 0))) pos strategy(title="Combo Backtest 123 Reversal & MACD Crossover with Trail and Stop", shorttitle="ComboReversal123MACDWithStop", overlay = false, precision=8,default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, currency="USD", commission_type=strategy.commission.percent, commission_value=0.075) leverage=input(2,"leverage",step=1) percentOfEquity=input(100,"percentOfEquity",step=1) sl_trigger = input(10, title='Stop Trail Trigger %', type=input.float)/100 sl_trail = input(5, title='Stop Trail %', type=input.float)/100 sl_inp = input(10, title='Stop Loss %', type=input.float)/100 Length = input(100, minval=1) KSmoothing = input(1, minval=1) DLength = input(2, minval=1) Level = input(1, minval=1) //------------------------- fastLength = input(10, minval=1) slowLength = input(19,minval=1) signalLength=input(24,minval=1) xSeria = input(title="Source", type=input.source, defval=close) reverse = input(false, title="Trade reverse") //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2015, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2999, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = time >= startDate and time <= finishDate //////////////////////////////////////////////////////////////////////////////// ////////////////////// STOP LOSS CALCULATIONS ////////////////////////////// /////////////////////////////////////////////////// cond() => barssince(strategy.position_size[1] == 0 and (strategy.position_size > 0 or strategy.position_size < 0)) > 0 lastStopLong = 0.0 lastStopLong := lastStopLong[1] != strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) and lastStopLong[1] != 0.0 ? lastStopLong[1] : strategy.position_size > 0 ? (cond() and close > strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price + (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))) : 0 lastStopShort = 0.0 lastStopShort := lastStopShort[1] != strategy.position_avg_price + (strategy.position_avg_price * (sl_inp)) and lastStopShort[1] != 9999999999.0 ? lastStopShort[1] : strategy.position_size < 0 ? (cond() and close < strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price - (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))) : 9999999999.0 longStopPrice = 0.0 longStopPrice2 = 0.0 longStopPrice3 = 0.0 shortStopPrice = 0.0 longStopPrice := if strategy.position_size > 0 originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger)) trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail)) stopValue = high > trigger ? trail : 0 max(stopValue, originalStop, longStopPrice[1]) else 0 longStopPrice2 := if strategy.position_size > 0 originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*2)) trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*2)) stopValue = high > trigger ? trail : 0 max(stopValue, originalStop, longStopPrice2[1]) else 0 longStopPrice3 := if strategy.position_size > 0 originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*4)) trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*3)) stopValue = high > trigger ? trail : 0 max(stopValue, originalStop, longStopPrice3[1]) else 0 shortStopPrice := if strategy.position_size < 0 originalStop = strategy.position_avg_price + (strategy.position_avg_price * (sl_inp)) trigger = strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger)) trail = strategy.position_avg_price - (strategy.position_avg_price * (sl_trail)) stopValue = low < trigger ? trail : 999999 min(stopValue, originalStop, shortStopPrice[1]) else 999999 /////////////////////////////////////////////////// /////////////////////////////////////////////////// posReversal123 = Reversal123(Length, KSmoothing, DLength, Level) posMACD = MACD(fastLength,slowLength, signalLength) pos = iff(posReversal123 == 1 and posMACD == 1 , 1, iff(posReversal123 == -1 and posMACD == -1, -1, 0)) possig = pos quantity = max(0.000001,min(((strategy.equity*(percentOfEquity/100))*leverage/open),100000000)) if (possig == 1 and time_cond) strategy.entry("Long", strategy.long, qty=quantity) if (possig == -1 and time_cond) strategy.entry("Short", strategy.short, qty=quantity) if (strategy.position_size > 0 and possig == -1 and time_cond) strategy.close_all() if (strategy.position_size < 0 and possig == 1 and time_cond) strategy.close_all() if ((strategy.position_size < 0 or strategy.position_size > 0) and possig == 0) strategy.close_all() //EXIT TRADE @ TSL if strategy.position_size > 0 strategy.exit(id="Long", stop=longStopPrice) if strategy.position_size < 0 strategy.exit(id="Short", stop=shortStopPrice)