Este es un simple promedio móvil de tendencia siguiendo una estrategia adecuada para Bitcoin y Ethereum. Combina múltiples indicadores como promedios móviles, MACD y RSI para identificar la dirección de la tendencia, y adopta el tamaño de posición fijo para el seguimiento de tendencias a largo plazo.
La lógica central de la estrategia es ir largo cuando la EMA de 20 días cruza por encima de la SMA de 100 días y la SMA de 100 días cruza por encima de la SMA de 200 días; cerrar posiciones cuando la EMA de 20 días cruza por debajo de la SMA de 100 días. Es decir, utilizar tres promedios móviles de diferentes períodos para determinar la dirección de la tendencia.
Específicamente, la estrategia calcula los valores de la EMA de 20 días, la SMA de 100 días y la SMA de 200 días, y compara su relación de magnitud para juzgar la tendencia. Cuando la EMA de 20 días cruza por encima de la SMA de 100 días, significa que los precios han comenzado a subir. En este punto, si la SMA de 100 días también es mayor que la SMA de 200 días, indica que las tendencias a medio y largo plazo también están aumentando. Esta es una señal larga fuerte.
Después de entrar en una posición larga, la estrategia continuará manteniendo la posición para seguir la tendencia. Cuando la EMA de 20 días cruza por debajo de la SMA de 100 días nuevamente, indica que se ha producido una señal de inversión de tendencia a corto plazo. En este punto, la estrategia elegirá cerrar posiciones para detener las pérdidas.
Además, la estrategia también incorpora indicadores como el MACD y el RSI para confirmar la tendencia. Sólo cuando la línea DIF, la línea DEMA y la línea de barra HIST del MACD estén en alza, y el indicador RSI esté por encima de 50, optará por abrir posiciones largas.
La mayor ventaja de esta estrategia es que formula reglas claras de negociación de tendencias que permiten realizar un seguimiento eficaz de las tendencias a medio y largo plazo.
Utilice múltiples promedios móviles combinados para juzgar la tendencia, que es relativamente confiable.
Adoptar posiciones de tenencia a largo plazo para seguir los movimientos de tendencia sin ser perturbado por las fluctuaciones a corto plazo del mercado.
La combinación de indicadores como el MACD y el RSI para la confirmación de la señal de estrategia puede filtrar las falsas rupturas.
Utilizando la cruz dorada y la cruz de la muerte de las líneas EMA y SMA para determinar los puntos de entrada y salida, las reglas son simples y claras.
Pueden controlar los riesgos de manera efectiva limitando las pérdidas a través del stop loss.
El principal problema es que no puede detener las pérdidas a tiempo cuando la tendencia se invierte. Los riesgos y soluciones específicos son los siguientes:
Incapacidad de rastrear los puntos de reversión de tendencia en el tiempo: acortar los ciclos de promedios móviles o agregar más indicadores para un juicio integral.
El tiempo de espera prolongado puede llevar fácilmente a mayores pérdidas: acorta adecuadamente las líneas de salida para detener la pérdida oportunamente.
Los indicadores de media móvil tienden a retrasarse: añadir un cierto porcentaje de líneas de stop loss para la stop loss activa.
Esta estrategia también puede optimizarse en los siguientes aspectos:
Prueba más combinaciones de ciclos de media móvil para encontrar los parámetros óptimos.
Pruebe otros indicadores o modelos para juzgar las tendencias y el momento de entrada, como las bandas de Bollinger, el indicador KD, etc.
Utilice el aprendizaje automático y otros métodos para optimizar dinámicamente los parámetros.
Incorporar indicadores de volumen de operaciones para evitar fallas. Por ejemplo, sobre el volumen de saldo, volumen de transacciones, etc.
Desarrollar sistemas automáticos de stop loss y de seguimiento de stop loss que puedan ajustar las posiciones de stop loss en función de las condiciones del mercado.
En resumen, esta estrategia es una estrategia de seguimiento de tendencias simple y directa. Utiliza promedios móviles para determinar la dirección de la tendencia, MACD y RSI para filtrar las señales. Adopta períodos de retención relativamente largos para rastrear los movimientos de la tendencia. Puede capturar de manera efectiva las oportunidades de tendencia a mediano y largo plazo. Al mismo tiempo, también existe el riesgo de retraso en la identificación de las reversiones de tendencia.
/*backtest start: 2024-01-16 00:00:00 end: 2024-01-17 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="BTC_Long_Only_TV01_200507", overlay=true) //////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! ///////////////////// //280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020 [macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7) //_rsi_len = input(14, title="RSI length") _rsi_len = 14 NewValue = 0 PreviousValue = 0 leverage = 1 smaPercentageIncrease = 0.0 SMA_PERCENT_INCREASE = 0.0 float atrValue = 0 bool bPositionOpened = false float stockPositionSize = 0 float volatilityPercentage = 0.0 bool bDisplayArrow = false bool bEMAIsRising = false bool bSMAIsRising = false bool bSMASlowIsRising = false bool bMACDIsRising = false bool bMACDHistIsRising = false bool bMACDSignalIsRising = false float stopLoss = input (5, "StopLoss in %", type=input.float) //StopLoss associated with the order //Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order float positionSize = 1000 float currentPrice = close float stopLossPrice = 0 float entryPrice = 0 //----------------------------------------------------------- // === INPUT BACKTEST RANGE ONE YEAR //FromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31) //FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12) //FromYear = input(defval = 2020, title = "From Year", minval = 2017) FromDay = 01 FromMonth = 01 FromYear = 2020 //ToDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31) //ToMonth = input(defval = 01, title = "To Month", minval = 1, maxval = 12) //ToYear = input(defval = 2023, title = "To Year", minval = 2017) ToDay = 14 ToMonth = 05 ToYear = 2029 // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" //FUNCTION DEFINITIONS //---------------------- IsRising(data, loopBack) => bIsRising = true for n = 1 to loopBack if data[n] > data[n-1] bIsRising := false continue bIsRising IsFalling(data, loopBack) => bIsFalling = true for n = 1 to loopBack if data[n] < data[n-1] bIsFalling := false continue bIsFalling // END OF FUNCTION DEFINITIONS // emaLength = 20 smaLength = 100 smaSlowLength = 200 ema = ema(close, emaLength) sma = sma(close, smaLength) smaSlow = sma(close, smaSlowLength) plot(sma, color=color.green) plot(smaSlow, color=color.orange) plot(ema, color=color.yellow) //reload previous values stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1] entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1] bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1] positionSize := na(positionSize[1]) ? 1000 : positionSize[1] stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1] //leverage := na(leverage[1]) ? 1 : leverage[1] bEMAIsRising := IsRising(ema, 2) bSMAIsRising := IsRising(sma, 3) bMACDIsRising := IsRising(macdLine, 3) bMACDHistIsRising := IsRising(macdHist, 1) bSMASlowIsRising := IsRising(smaSlow, 10) bMACDSignalIsRising := IsRising(macdSignalLine, 3) atrValue := atr(14) volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price if (window()) //Check if we can open a LONG if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice) //Enter in short position stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured. //calculate exit values stopLossPrice := currentPrice*(1-stopLoss/100) strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice)) entryPrice := currentPrice //store the entry price bPositionOpened := true bDisplayArrow := true if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]))) strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect. //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) //reset some flags bPositionOpened := false bDisplayArrow := true entryPrice := 0.0