Stratégie de trading intraday de Bitcoin basée sur de multiples indicateurs

Auteur:ChaoZhang est là., Date: 2023-12-07 15h23 et 44 min
Les étiquettes:

img

Résumé

Cette stratégie combine les quatre indicateurs RSI, MFI, Stoch RSI et MACD pour mettre en œuvre le trading intraday de bitcoin. Les ordres ne seront passés que lorsque plusieurs indicateurs donneront des signaux d'achat ou de vente simultanément pour contrôler les risques.

La logique de la stratégie

  1. L'indicateur RSI est utilisé pour déterminer si le marché est suracheté ou survendu. Il génère un signal d'achat lorsque le RSI est inférieur à 40 et un signal de vente lorsque le RSI est supérieur à 70.

  2. L'indicateur des IFM évalue le flux de capitaux sur le marché et génère un signal d'achat lorsque l'IFM est inférieur à 23 et un signal de vente lorsque l'IFM est supérieur à 80.

  3. L'indicateur Stoch RSI détermine si le marché est suracheté ou survendu. Il génère un signal d'achat lorsque la ligne K est inférieure à 34 et un signal de vente lorsqu'elle est supérieure à 80.

  4. L'indicateur MACD évalue la tendance et l'élan du marché. Il génère un signal d'achat lorsque la ligne rapide est en dessous de la ligne lente et que l'histogramme est négatif, et un signal de vente pour le scénario opposé.

Analyse des avantages

  1. La combinaison de quatre indicateurs principaux améliore la précision du signal et évite les pertes causées par la défaillance d'un seul indicateur.

  2. Les ordres ne sont passés que lorsque plusieurs indicateurs donnent des signaux simultanément, ce qui réduit considérablement la probabilité de faux signaux.

  3. L'adoption de stratégies de négociation intrajournalière permet d'éviter les risques du jour au lendemain et de réduire les coûts en capital.

Risques et solutions

  1. La fréquence de négociation de la stratégie peut être relativement faible, avec certains risques temporels. Les paramètres de l'indicateur peuvent être adéquatement assouplis pour augmenter le nombre de transactions.

  2. Il existe encore une probabilité que les indicateurs donnent des signaux erronés.

  3. Les paramètres de l'indicateur peuvent être ajustés en conséquence ou plus de logique de l'indicateur peut être ajoutée.

Directions d'optimisation

  1. Ajustez les paramètres en temps réel en fonction de la volatilité du marché et de la vitesse de changement.

  2. Ajoutez une logique de stop-loss. Stop-loss de sortie si les pertes dépassent un certain pourcentage pour contrôler efficacement une seule perte.

  3. Incorporer des indicateurs de sentiment. Augmenter les jugements multidimensionnels tels que la chaleur du marché et la peur du marché pour améliorer l'espace de profit de la stratégie.

Conclusion

En vérifiant les signaux à travers quatre indicateurs principaux, cette stratégie peut réduire efficacement le taux de faux signaux et est une stratégie de profit à haute fréquence relativement stable.


/*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)

Plus de