Estrategia de tendencia larga de BTC y ETH

El autor:¿ Qué pasa?, Fecha: 2023-10-07 10:16:09
Las etiquetas:

Resumen general

Esta es una estrategia de tendencia larga automatizada basada en indicadores técnicos simples para criptomonedas como Bitcoin y Ethereum, con el objetivo de capturar las principales tendencias alcistas y reducir las pérdidas de las tarifas de negociación por el comercio frecuente.

Estrategia lógica

  1. Utilice el MACD para determinar la dirección de la tendencia, largo cuando el MACD se cruce hacia arriba;

  2. Calcular la EMA de 20 períodos, la SMA de 100 períodos y la SMA de 200 períodos, ir largo cuando la EMA y la SMA apuntan hacia arriba juntos;

  3. Comprar cuando la EMA es superior a la SMA y la SMA es superior a la SMA lenta;

  4. Establezca la línea de stop loss, deténgase cuando el precio se rompa.

  5. Cierre de posición cuando el precio cae y la EMA se cruza por debajo de la SMA.

Esta estrategia combina múltiples indicadores para determinar la tendencia y el momento de entrada para beneficiarse de las principales tendencias alcistas.

Ventajas

  1. La combinación de múltiples indicadores puede ayudar a filtrar las fallas y señales erróneas.

  2. Solo entrar en tendencias obvias puede reducir las operaciones innecesarias y reducir la frecuencia de las operaciones.

  3. El stop loss puede limitar efectivamente la pérdida máxima por operación.

  4. El backtest muestra una rentabilidad decente en BTC y ETH.

  5. Lógica simple y clara, fácil de entender e implementar, buena para principiantes.

  6. Alta extensibilidad para incluir más indicadores para la optimización.

Los riesgos

  1. Alta aleatoriedad del mercado, riesgos de juicio erróneo.

  2. El enfoque de posición única no puede cubrir los riesgos sistemáticos.

  3. La configuración incorrecta de la pérdida de parada puede causar una pérdida excesiva.

  4. El backtest no representa los resultados en vivo, el rendimiento real aún no se ha validado.

  5. El impacto de los costos de negociación no se considera, puede diferir del rendimiento en vivo.

  6. No consideró las características del producto, necesitaba ajustar los parámetros.

Direcciones de optimización

  1. Prueba diferentes combinaciones de parámetros para optimizar los parámetros del indicador.

  2. Añadir filtros como KDJ para filtrar las señales de entrada.

  3. Optimizar la estrategia de stop loss, como añadir un stop loss dinámico.

  4. Considere el tamaño de la posición en función del tamaño de la cuenta.

  5. Distinguir las características del producto y ajustar los parámetros en consecuencia.

  6. Incorporar más plazos para el análisis.

  7. Pruebe diferentes productos y encuentre los más adecuados.

Conclusión

La lógica de la estrategia es simple y clara. El uso de múltiples indicadores puede ayudar a filtrar las señales incorrectas de manera efectiva. Pero se necesita una mayor optimización de los parámetros, control de riesgos, etc., combinada con la verificación de operaciones en vivo, antes de la aplicación real. Con las extensiones adecuadas, puede convertirse en una tendencia criptográfica muy práctica después de la estrategia.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)

//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////


[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 (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order 
//positionSize = input (1000, "in $")
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  = 2019


//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     = 31
ToMonth   = 12
ToYear    = 2099

// === 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"



//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length") 
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]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
 
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2) 
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)

atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price


//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
//    //calculate the percentegage difference over the last 10 bars
//    smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
//    if smaPercentageIncrease < SMA_PERCENT_INCREASE
//        //Not enough increase we reset the flag 
//        bSMASlowIsRising := false 
        
 
if (window()) 
    //Check if we can open a LONG
//sma > smaSlow and
    if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
    // add comparaison between macd and macd signal line
    //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < 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]) or currentPrice < sma[1]))  
    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.