Stratégie de suivi des tendances sur plusieurs délais basée sur le cloud Ichimoku, le MACD et le stochastique

Auteur:ChaoZhang est là., Date: 2024-02-05 10h30 et 45 min
Les étiquettes:

img

Résumé

Cette stratégie intègre les indicateurs Ichimoku Cloud, moyenne mobile, MACD, stochastique et ATR pour identifier et suivre les tendances sur plusieurs délais.

La logique de la stratégie

  1. Le Cloud Ichimoku évalue les tendances à moyen et long terme. Le prix CLOSE qui traverse au-dessus de la ligne de basculement et de la ligne de base d'Ichimoku est un signal haussier, et celui qui traverse en dessous est un signal baissier.

  2. L'histogramme MACD qui traverse au-dessus de la ligne de signal MACD est un signal haussier, et celui qui traverse en dessous est un signal baissier.

  3. Le KD stochastique évalue les zones de surachat/survente.

  4. Les moyennes mobiles jugent les tendances à moyen terme.

  5. Intégrer les signaux des indicateurs ci-dessus pour filtrer certains faux signaux et former des signaux de tendance durable à forte probabilité.

  6. Utilisez un certain multiple d'ATR comme stop loss et prenez des bits de profit pour contrôler les risques.

Les avantages

  1. Identifier les tendances à travers plusieurs délais pour améliorer la précision du signal.

  2. Utilisez largement des combinaisons d'indicateurs pour filtrer efficacement les faux signaux.

  3. Limites de stop loss et de prise de profit significatives par perte commerciale basées sur ATR.

  4. La rigueur personnalisable des conditions d'entrée répond à différents appétits de risque.

Les risques

  1. La tendance à suivre la nature ne détecte pas les inversions causées par les événements du cygne noir.

  2. Il est difficile de reproduire pleinement le stop loss ATR idéal dans le trading en direct.

  3. Des paramètres mal réglés peuvent entraîner une survente ou une précision insuffisante du signal.

  4. Des ajustements de paramètres sont nécessaires pour s'adapter à différents produits et environnements de marché.

Les domaines d'amélioration

  1. Introduire l'apprentissage automatique pour aider à juger des points d'inversion de tendance.

  2. Optimiser les valeurs des paramètres du multiplicateur ATR pour différents produits.

  3. Incorporer d'autres facteurs comme les changements de volume pour améliorer la précision du signal de percée.

  4. Continuez à optimiser les paramètres basés sur les résultats des backtests pour trouver les meilleures combinaisons de paramètres.

Résumé

Cette stratégie exploite Ichimoku Cloud, MACD, Stochastic et plus encore pour l'identification des tendances sur plusieurs délais, capturant les tendances tout en évitant d'être pris au piège par les événements du cygne noir.


/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FXFUNDINGMATE

//@version=4
strategy(title="FXFUNDINGMATE TREND INDICATOR", overlay=true)

//Ichimoku Cloud
conversionPeriods = input(9, minval=1, title="Conversion Line Length")
basePeriods = input(26, minval=1, title="Base Line Length")
laggingSpan2Periods = input(52, minval=1, title="Lagging Span 2 Length")
displacement = input(26, minval=1, title="Displacement")
donchian(len) => avg(lowest(len), highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = avg(conversionLine, baseLine)[displacement - 1]
leadLine2 = donchian(laggingSpan2Periods)[displacement - 1]


//macd
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//kd
periodK = input(5, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)


//atr
atrlength = input(title="Atr Length", defval=8, minval=1)
SMulti = input(title="Stop loss multi Atr", defval=1.0)
TMulti = input(title="Take profit multi Atr", defval=1.0)
smoothing = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
ma_function(source, length) =>
	if smoothing == "RMA"
		rma(source, length)
	else
		if smoothing == "SMA"
			sma(source, length)
		else
			if smoothing == "EMA"
				ema(source, length)
			else
				wma(source, length)
atr = ma_function(tr(true), atrlength)


operation_type = input(defval = "Both", title = "Position side", options = ["Long", "Short", "Both"])
operation = operation_type == "Long" ? 1 : operation_type == "Short" ? 2 : 3
showlines = input(true,  title="Show sl&tp lines")

// MA
sma_len = input(100, title="MA Length", type=input.integer)
sma = sma(close, sma_len)

longCond = crossover(k, 20) and macd > 0 and close > sma and close > leadLine1 and close > leadLine2
shortCond = crossunder(k, 80)  and macd < 0 and close < sma and close < leadLine1 and close < leadLine2

entry_price  = float(0.0) //set float
entry_price := strategy.position_size != 0 or longCond or shortCond ? strategy.position_avg_price : entry_price[1]
entry_atr = valuewhen(longCond or shortCond, atr,0)
short_stop_level     = float(0.0)   //set float
short_profit_level   = float(0.0)   //set float
long_stop_level      = float(0.0)   //set float
long_profit_level    = float(0.0)   //set float
short_stop_level    := entry_price + SMulti * entry_atr
short_profit_level  := entry_price - TMulti * entry_atr
long_stop_level     := entry_price - SMulti * entry_atr
long_profit_level   := entry_price + TMulti * entry_atr


//  Strategy Backtest Limiting Algorithm
i_startTime = input(defval = timestamp("1 Jan 2020 00:00 +0000"), title = "Backtesting Start Time", type = input.time)
i_endTime = input(defval = timestamp("31 Dec 2025 23:59 +0000"), title = "Backtesting End Time", type = input.time)
timeCond = true

if (operation == 1 or operation == 3)
    strategy.entry("long" , strategy.long , when=longCond and timeCond, alert_message = "Long")
    strategy.exit("SL/TP", from_entry = "long" , limit = long_profit_level , stop = long_stop_level , alert_message = "Long exit")

if (operation == 2 or operation == 3)
    strategy.entry("short", strategy.short, when=shortCond and timeCond, alert_message="Short")
    strategy.exit("SL/TP", from_entry = "short", limit = short_profit_level , stop = short_stop_level , alert_message = "Short exit")
    
if time > i_endTime  
    strategy.close_all(comment = "close all", alert_message = "close all")
    
plot(showlines and strategy.position_size <= 0 ? na : long_stop_level,    color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size <= 0 ? na : long_profit_level,  color=color.lime, style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_stop_level,   color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_profit_level, color=color.lime, style=plot.style_linebr, linewidth = 2)

//}



Plus de