Estratégia de negociação diária de Bitcoin combinando vários indicadores


Data de criação: 2023-12-07 15:23:44 última modificação: 2023-12-07 15:23:44
cópia: 0 Cliques: 380
1
focar em
1166
Seguidores

Estratégia de negociação diária de Bitcoin combinando vários indicadores

Visão geral

Esta estratégia combina quatro indicadores RSI, MFI, Stoch RSI e MACD para permitir a negociação intradiária de Bitcoin. A estratégia é feita para controlar o risco quando vários indicadores emitem sinais de compra ou venda ao mesmo tempo.

Princípio da estratégia

  1. O indicador RSI é usado para determinar se o mercado está sobrecomprando ou sobrevendendo. O RSI gera um sinal de compra quando está abaixo de 40 e um sinal de venda quando está acima de 70.

  2. O indicador MFI julga o fluxo de capital do mercado. O MFI produz um sinal de compra quando está abaixo de 23 e um sinal de venda quando está acima de 80.

  3. O Stoch RSI determina se o mercado está sobrecomprando ou sobrevendendo. A linha K abaixo de 34 gera um sinal de compra e acima de 80 gera um sinal de venda.

  4. O indicador MACD determina a tendência e a dinâmica do mercado. A linha rápida é inferior à linha lenta e gera um sinal de compra quando o pilar é negativo, ao contrário, gera um sinal de venda.

Análise de vantagens

  1. A combinação dos quatro principais indicadores aumenta a precisão do sinal e evita perdas causadas por falhas em um único indicador.

  2. A redução da probabilidade de falsos sinais pode ser significativamente reduzida quando vários indicadores emitem sinais ao mesmo tempo.

  3. Adotar estratégias de negociação diária, evitar riscos durante a noite e reduzir os custos de capital.

Riscos e soluções

  1. A frequência de negociação da estratégia pode ser baixa, existindo um certo risco de tempo. Os parâmetros do indicador podem ser relaxados de forma apropriada, aumentando o número de transações.

  2. A probabilidade de um indicador emitir um sinal errado ainda existe. Algoritmos de aprendizado de máquina podem ser introduzidos para auxiliar na determinação da confiabilidade do sinal do indicador.

  3. Existe um certo risco de sobrecompra ou sobrevenda. Pode-se ajustar os parâmetros do indicador de forma apropriada ou adicionar outras lógicas de julgamento de indicadores.

Direção de otimização

  1. Adição de função de parâmetros de indicadores de adaptação. Ajustar os parâmetros de indicadores em tempo real de acordo com a volatilidade do mercado e a velocidade de mudança.

  2. Adição de lógica de stop loss. Se o prejuízo for superior a uma certa proporção, o prejuízo é eliminado, controlando efetivamente o prejuízo individual.

  3. A combinação de indicadores de sentimento aumenta o julgamento multidimensional, como calor do mercado e medo do mercado, aumentando a margem de lucro da estratégia.

Resumir

Esta estratégia é uma estratégia de ganho de alta frequência relativamente estável, que emite sinais de forma que os quatro principais indicadores são mutuamente verificados, reduzindo efetivamente a taxa de falsos sinais. Com a otimização contínua dos parâmetros e modelos, a taxa de vitória e a lucratividade da estratégia podem ser ainda mais elevadas.

Código-fonte da estratégia
/*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)