
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.
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.
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:
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:
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.
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.
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.
La estrategia también puede ser optimizada en los siguientes aspectos:
Pruebe más combinaciones de ciclos de la media para encontrar el parámetro óptimo.
Intentar otros indicadores o modelos para juzgar la tendencia y el momento de entrada. Por ejemplo, la banda de Brin, el indicador KD, etc.
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.
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.
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.
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.
/*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