Tendencia media móvil de múltiples factores siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2024-01-18 12:07:52
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Ventajas

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.

  1. Utilice múltiples promedios móviles combinados para juzgar la tendencia, que es relativamente confiable.

  2. Adoptar posiciones de tenencia a largo plazo para seguir los movimientos de tendencia sin ser perturbado por las fluctuaciones a corto plazo del mercado.

  3. 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.

  4. 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.

  5. Pueden controlar los riesgos de manera efectiva limitando las pérdidas a través del stop loss.

Riesgos y soluciones

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:

  1. 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.

  2. 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.

  3. 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.

Direcciones de optimización

Esta estrategia también puede optimizarse en los siguientes aspectos:

  1. Prueba más combinaciones de ciclos de media móvil para encontrar los parámetros óptimos.

  2. Pruebe otros indicadores o modelos para juzgar las tendencias y el momento de entrada, como las bandas de Bollinger, el indicador KD, etc.

  3. Utilice el aprendizaje automático y otros métodos para optimizar dinámicamente los parámetros.

  4. Incorporar indicadores de volumen de operaciones para evitar fallas. Por ejemplo, sobre el volumen de saldo, volumen de transacciones, etc.

  5. 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.

Conclusión

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
        


Más.