Estrategia de seguimiento de tendencia de media móvil equilibrada de largo y corto plazo


Fecha de creación: 2024-01-18 12:07:52 Última modificación: 2024-01-18 12:07:52
Copiar: 0 Número de Visitas: 608
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencia de media móvil equilibrada de largo y corto plazo

Descripción general

La estrategia es una estrategia de seguimiento de tendencias de promedio móvil simple para Bitcoin y Ethereum. Combina varios indicadores como la línea media, MACD y RSI para identificar la dirección de la tendencia y seguir la tendencia usando una línea larga de posiciones fijas.

Principio de estrategia

La lógica central de la estrategia es hacer más cuando la línea 20 de la EMA atraviesa la línea 100 de la SMA y cuando la línea 100 de la SMA atraviesa la línea 200 de la SMA; cerrar la posición cuando la línea 20 de la EMA atraviesa la línea 100 de la SMA. Es decir, utilizar tres promedios móviles de diferentes períodos para determinar la dirección de la tendencia.

Concretamente, la estrategia determina la tendencia calculando los valores de la línea EMA de 20 días, la línea SMA de 100 días y la línea SMA de 200 días, y comparando su relación de magnitud. Cuando la línea EMA de 20 días atraviesa la línea SMA de 100 días, es decir, la línea EMA de 20 días es mayor que la línea SMA de 100 días, indica que el precio comienza a subir; mientras que si la línea SMA de 100 días también es mayor que la línea SMA de 200 días, indica que la tendencia de mediano y largo plazo también está subiendo, lo cual es una señal más fuerte de hacer más.

Después de entrar en una posición de más, la estrategia mantiene la posición y sigue la tendencia. Cuando la línea EMA del día 20 vuelve a cruzar la línea SMA del día 100, lo que indica una señal de reversión de la tendencia a corto plazo, la estrategia elige la parada de pérdidas.

Además, la estrategia también combina indicadores como el MACD y el RSI para confirmar la tendencia. La opción de abrir una posición adicional se realiza solo cuando la línea DIF, la línea DEMA y la columnar HIST de MACD están al alza y el indicador RSI está por encima de 50.

Ventajas estratégicas

La mayor ventaja de esta estrategia es que establece reglas claras para el comercio de tendencias, lo que permite un seguimiento eficaz de las tendencias de línea media y larga. Las ventajas concretas son las siguientes:

  1. El uso de medias móviles de múltiples grupos para combinar tendencias es más fiable.
  2. El uso de la línea larga para mantener posiciones sigue la tendencia y no se ve afectado por las fluctuaciones del mercado a corto plazo.
  3. La combinación de indicadores como el MACD y el RSI para la confirmación de señales estratégicas puede filtrar falsas rupturas.
  4. Los puntos de entrada y salida se juzgan a través de la línea EMA y la línea SMA, las reglas son simples y claras.
  5. La capacidad de controlar el riesgo de manera efectiva y limitar las pérdidas mediante el stop loss.

Riesgos y soluciones

La estrategia también presenta algunos riesgos, principalmente la imposibilidad de detener el movimiento a tiempo cuando la tendencia se invierte. Los riesgos específicos y soluciones son:

  1. No se puede rastrear a tiempo hasta el punto de reversión de la tendencia: se puede acortar el ciclo promedio o agregar más indicadores para un juicio integral.

  2. El exceso de tiempo de tenencia de posiciones puede generar grandes pérdidas: se puede reducir adecuadamente la línea de salida y detener las pérdidas a tiempo.

  3. Los indicadores de línea media son propensos al retraso: se puede agregar una línea de stop loss con una cierta proporción de retirada, stop loss activo.

Dirección de optimización

La estrategia también puede ser optimizada en los siguientes aspectos:

  1. Pruebe más combinaciones de ciclos de la media para encontrar el parámetro óptimo.

  2. Intentar otros indicadores o modelos para juzgar la tendencia y el momento de entrada. Por ejemplo, la banda de Brin, el indicador KD, etc.

  3. Parámetros de optimización dinámica mediante el uso de aprendizaje automático. Por ejemplo, el uso de aprendizaje por refuerzo para ajustar la amplitud de parada.

  4. En combinación con indicadores de volumen de transacciones para evitar falsos brechas, como el indicador de marea de energía, volumen de transacciones, etc.

  5. Desarrollar un sistema de stop loss automático y de seguimiento de stop loss, capaz de ajustar la posición de stop loss según las condiciones del mercado.

Resumir

La estrategia en su conjunto es una estrategia de seguimiento de tendencias simple y directa. Utiliza las medias móviles para determinar la dirección de la tendencia, las señales de filtro MACD y RSI. Utiliza un tiempo de tenencia más largo para seguir la tendencia.

Código Fuente de la Estrategia
/*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