Estrategia de day trading de Bitcoin que combina múltiples indicadores


Fecha de creación: 2023-12-07 15:23:44 Última modificación: 2023-12-07 15:23:44
Copiar: 1 Número de Visitas: 691
1
Seguir
1619
Seguidores

Estrategia de day trading de Bitcoin que combina múltiples indicadores

Descripción general

Esta estrategia combina cuatro indicadores RSI, MFI, Stoch RSI y MACD para realizar operaciones diarias de Bitcoin. La estrategia se ordena para controlar el riesgo cuando varios indicadores emiten señales de compra o venta al mismo tiempo.

Principio de estrategia

  1. El indicador RSI es utilizado para determinar si el mercado está sobrecomprando o sobrevendendo. El RSI genera una señal de compra cuando está por debajo de 40 y una señal de venta cuando está por encima de 70.

  2. El indicador MFI determina el flujo de fondos en el mercado. El MFI produce una señal de compra cuando está por debajo de 23 y una señal de venta cuando está por encima de 80.

  3. El indicador Stoch RSI determina si el mercado está sobrecomprando o sobrevendendo. La línea K produce una señal de compra cuando está por debajo de 34, y una señal de venta cuando está por encima de 80.

  4. El indicador MACD determina la tendencia y el movimiento del mercado. La línea rápida es inferior a la línea lenta y produce una señal de compra cuando el pilar es negativo, y por el contrario, produce una señal de venta.

Análisis de las ventajas

  1. La combinación de los cuatro indicadores mejora la precisión de la señal y evita los daños causados por el fallo de un solo indicador.

  2. La probabilidad de falsas señales puede reducirse considerablemente si los indicadores se ordenan solo cuando se emiten múltiples señales al mismo tiempo.

  3. Adoptar estrategias de negociación diurna para evitar riesgos nocturnos y reducir el costo de capital.

Riesgos y soluciones

  1. La frecuencia de negociación de la estrategia puede ser baja y existe un cierto riesgo de tiempo. Se puede relajar adecuadamente los parámetros del indicador para aumentar la frecuencia de negociación.

  2. La probabilidad de que el indicador emita una señal errónea aún existe. Se pueden introducir algoritmos de aprendizaje automático para ayudar a juzgar la confiabilidad de la señal del indicador.

  3. Existe cierto riesgo de sobrecompra y sobreventa. Se pueden ajustar los parámetros del indicador o agregar otras lógicas de juicio del indicador.

Dirección de optimización

  1. La función de ajuste automático de los parámetros de los indicadores se ha añadido. Los parámetros de los indicadores se ajustan en tiempo real en función de la volatilidad del mercado y la velocidad de cambio.

  2. Añadir la lógica de stop loss. Si la pérdida supera un cierto porcentaje, el stop loss se retira, controlando efectivamente la pérdida individual.

  3. Combinación de los indicadores de la emoción. Aumento de la calidez del mercado, el grado de pánico del mercado y otros criterios multidimensionales para mejorar la estrategia de ganancias.

Resumir

Esta estrategia emite señales a través de la verificación mutua de los cuatro indicadores principales, lo que reduce efectivamente la tasa de falsas señales, y es una estrategia de ganancias de alta frecuencia relativamente estable. Con la optimización continua de los parámetros y modelos, se espera que la ganancia y la rentabilidad de la estrategia aumenten aún más.

Código Fuente de la Estrategia
/*backtest
start: 2023-11-29 00:00:00
end: 2023-12-06 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy('John Day Stop Loss', overlay=false, pyramiding=1, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency='USD', precision=2)
strategy.risk.allow_entry_in(strategy.direction.long) 

from_day = input.int(defval=1, title='From Day', minval=1)
from_month = input.int(defval=1, title='From Month', minval=1)
from_year = input.int(defval=2021, title='From Year', minval=2020)
to_day = input.int(defval=1, title='To Day', minval=1)
to_month = input.int(defval=1, title='To Month', minval=1)
to_year = input.int(defval=2025, title='To Year', minval=2020)

time_cond = time > timestamp(from_year, from_month, from_day, 00, 00) and time < timestamp(to_year, to_month, to_day, 00, 00)
//time_cond = true

//Stop Loss
longProfitPerc = input.float(title="Stop Loss Profit (%)", defval=2.1) / 100
longExitPrice  = strategy.position_avg_price * (1 - longProfitPerc)

//RSI - yellow
up = ta.rma(math.max(ta.change(close), 0), 14)
down = ta.rma(-math.min(ta.change(close), 0), 14)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
plot(rsi, "RSI", color=#00FFFF)
buy_rsi = true // rsi < 40
sell_rsi = true //rsi > 70

//MFI - cyan
mf = ta.mfi(hlc3, 14)
plot(mf, "MF", color=#FFFF00)
buy_mfi = mf < input.int(defval=23, title='Max MF', minval=1)
sell_mfi = mf > input.int(defval=80, title='Min MF', minval=1)

//Stoch RSI
OverBought_StochRSI = input(80)
OverSold_StochRSI = input(34)
smoothK = input.int(3, "K", minval=1)
smoothD = input.int(2, "D", minval=1)
lengthRSI = input.int(14, "RSI Length", minval=1)
lengthStoch = input.int(14, "Stochastic Length", minval=1)
srcRSI = input(close, title="RSI Source")
rsi1 = ta.rsi(srcRSI, lengthRSI)
kStochRSI = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(kStochRSI, smoothD)
co = ta.crossover(kStochRSI,d)
cu = ta.crossunder(kStochRSI,d)

buy_stochRSI = co and kStochRSI < OverSold_StochRSI
sell_stochRSI = cu and kStochRSI > OverBought_StochRSI

plot(kStochRSI, "K", color=#2962FF)
plot(d, "D", color=#FF6D00)
h0 = hline(OverBought_StochRSI, "Upper Band", color=#787B86)
h1 = hline(OverSold_StochRSI, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")

//MACD
// Getting inputs
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
src = input(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
//col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
//col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
//col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
//col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
//col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
//col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
buy_MACD = macd < signal and hist < 0 
sell_MACD = macd > signal and hist > 0 

//buy_MACD = true 
//sell_MACD = true

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)

sessionColor = color(na)
if time_cond

    if (not na(kStochRSI) and not na(d))
        cmt = str.tostring(close)
    	if (buy_stochRSI and buy_MACD and buy_mfi and buy_rsi)
    		strategy.entry("BUY", strategy.long, comment='BUY @ ' + cmt)
    		if longProfitPerc != 0
    		    strategy.exit(id="x", stop=longExitPrice, comment='EXIT @ ' + str.tostring(longExitPrice))
        	sessionColor := input.color(#0000FF, "buy") //red
    	if (sell_stochRSI and sell_MACD and sell_mfi and sell_rsi)
    		strategy.entry("SELL", strategy.short, comment='SELL @ ' + cmt)
    		sessionColor := input.color(#FF0000, "sell") //green
    	
bgcolor(sessionColor)