
Il s’agit d’une stratégie de suivi de tendances basée sur des moyennes mobiles équilibrées. Elle intègre des moyennes mobiles équilibrées équilibrées et des mécanismes d’entrée et de sortie de précision pour améliorer les taux de profit.
La stratégie consiste principalement à construire une moyenne mobile équilibrée à première vue en calculant le prix de clôture du dernier jour de négociation et les paramètres d’entrée définis par l’utilisateur. Lorsque le prix augmente, faites plus; lorsque le prix baisse, faites moins.
En même temps, la stratégie a ajouté un mécanisme de confirmation de nuage qui détermine la couleur de la moyenne mobile équilibrée au premier coup d’œil. Ne faites plus que lorsque la couleur de la moyenne mobile équilibrée au premier coup d’œil est verte et laissez un espace lorsque la couleur est rouge, ce qui peut filtrer certains signaux inexacts et améliorer la probabilité de rentabilité de la stratégie.
Le plus grand avantage de cette stratégie réside dans la combinaison des avantages des deux indicateurs de la moyenne et de la moyenne mobile équilibrée, qui prennent en compte à la fois l’évolution globale de la moyenne des prix et la variation pondérée du prix de clôture du dernier jour de négociation. En outre, le mécanisme de confirmation du cloud évite les faux signaux de négociation, ce qui améliore la stabilité de la stratégie.
En ce qui concerne l’optimisation des paramètres, le paramètre Stop Loss Stop permet également de contrôler le risque de la stratégie. Enfin, la première moyenne mobile équilibrée est un indicateur technique relativement nouveau, que beaucoup de gens ne connaissent pas encore, ce qui donne un avantage de départ à l’application de la stratégie.
Le plus grand risque de cette stratégie réside dans l’instabilité de la moyenne mobile équilibrée elle-même. En tant que nouvel indicateur, son efficacité à long terme et l’espace d’optimisation des paramètres sont discutables.
De plus, toute stratégie qui suit une tendance présente le risque d’une inversion de tendance. La stratégie subit de lourdes pertes lorsque le prix dépasse la moyenne mais se redresse rapidement. Il est donc essentiel de définir des points de rupture.
Cette stratégie peut être optimisée par:
Optimiser les paramètres de longueur des moyennes mobiles équilibrées de première vue pour trouver le point d’équilibre optimal.
Tester différents paramètres de stop-loss pour déterminer la combinaison optimale. Un stop-loss trop grand limite le plafond de gain, un stop-loss trop petit est trop risqué.
L’ajout d’autres indicateurs techniques tels que le MACD, le KD, etc. a permis de créer un consensus sur plusieurs indicateurs, ce qui a permis d’éviter davantage de faux signaux.
Les variétés et les cycles sont analysés pour déterminer les meilleures stratégies et les scénarios.
Considérer l’ajout de modèles d’apprentissage automatique pour optimiser dynamiquement les paramètres et adapter la stratégie.
Cette stratégie intègre les avantages des moyennes et des moyennes mobiles équilibrées à première vue, met en place des arrêts de perte raisonnables et ajoute un mécanisme de confirmation de nuage, permettant de suivre efficacement les tendances et de contrôler les risques. La stratégie peut être largement appliquée à des variétés telles que les indices boursiers, les devises, les matières premières et les crypto-monnaies.
/*backtest
start: 2022-11-17 00:00:00
end: 2023-11-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
strategy("Ichimoku Backtester with TP and SL", overlay=true,
currency = currency.USD, default_qty_type = strategy.percent_of_equity,
default_qty_value = 95)
//@version=4
//Inputs
ts_bars = input(9, minval=1, title="Tenkan-Sen Bars")
ks_bars = input(26, minval=1, title="Kijun-Sen Bars")
ssb_bars = input(52, minval=1, title="Senkou-Span B Bars")
cs_offset = input(26, minval=1, title="Chikou-Span Offset")
ss_offset = input(26, minval=1, title="Senkou-Span Offset")
long_entry = input(true, title="Long Entry")
short_entry = input(true, title="Short Entry")
wait_for_cloud = input(true, title="Wait for Cloud Confirmation")
use_short_stop_loss = input(true, title="Use Short Stop Loss")
short_stop_loss = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1,
defval=5) * 0.01
use_long_stop_loss = input(true, title="Use Long Stop Loss")
long_stop_loss = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1,
defval=5) * 0.01
use_short_take_profit = input(true, title="Use Short Take Profit")
short_take_profit = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1,
defval = 20) * .01
use_long_take_profit = input(true, title="Use Long Take Profit")
long_take_profit = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1,
defval = 20) * .01
// === INPUT SHOW PLOT ===
showDate = input(defval = false, title = "Show Date Range", type = input.bool)
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12)
fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31)
fromYear = input(defval = 2020, title = "From Year", type = input.integer, minval = 1970)
thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12)
thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31)
thruYear = input(defval = 2112, title = "Thru Year", type = input.integer, minval = 1970)
// === FUNCTION EXAMPLE ===
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
middle(len) => avg(lowest(len), highest(len))
// Ichimoku Components
tenkan = middle(ts_bars)
kijun = middle(ks_bars)
senkouA = avg(tenkan, kijun)
senkouB = middle(ssb_bars)
bgcolor(color = showDate and window() ? color.gray : na, transp = 90) // plot within time window
// Plot Ichimoku Kinko Hyo
plot(tenkan, color=#0496ff, title="Tenkan-Sen")
plot(kijun, color=#991515, title="Kijun-Sen")
plot(close, offset=-cs_offset+1, color=#459915, title="Chikou-Span")
sa=plot(senkouA, offset=ss_offset-1, color=color.green, title="Senkou-Span A")
sb=plot(senkouB, offset=ss_offset-1, color=color.red, title="Senkou-Span B")
fill(sa, sb, color = senkouA > senkouB ? color.green : color.red, title="Cloud color")
ss_high = max(senkouA[ss_offset-1], senkouB[ss_offset-1])
ss_low = min(senkouA[ss_offset-1], senkouB[ss_offset-1])
// Entry/Exit Signals
tk_cross_bull = tenkan > kijun
tk_cross_bear = tenkan < kijun
cs_cross_bull = mom(close, cs_offset-1) > 0
cs_cross_bear = mom(close, cs_offset-1) < 0
price_above_kumo = close > ss_high
price_below_kumo = close < ss_low
senkou_green = senkouA > senkouB ? true : false
bullish = tk_cross_bull and cs_cross_bull and price_above_kumo
bearish = tk_cross_bear and cs_cross_bear and price_below_kumo
if (wait_for_cloud)
bullish := bullish and senkou_green
bearish := bearish and not senkou_green
longStopPrice = strategy.position_avg_price * (1 - long_stop_loss)
shortStopPrice = strategy.position_avg_price * (1 + short_stop_loss)
longLimitPrice = strategy.position_avg_price * (1 + long_take_profit)
shortLimitPrice = strategy.position_avg_price * (1 - short_take_profit)
in_long = false
in_long := in_long[1]
open_long = bullish and not in_long
open_short = bearish and in_long
if (open_long)
in_long := true
if (open_short)
in_long := false
strategy.entry("Long", strategy.long, when=open_long and long_entry and (showDate ? window() : true))
strategy.entry("Short", strategy.short ,when=open_short and short_entry and (showDate ? window() : true))
if (strategy.position_size > 0.0)
if (use_long_stop_loss and not use_long_take_profit)
strategy.exit("Long", stop = longStopPrice)
if (use_long_take_profit and not use_long_stop_loss)
strategy.exit("Long", limit = longLimitPrice)
if (use_long_take_profit and use_long_stop_loss)
strategy.exit("Long", stop = longStopPrice, limit=longLimitPrice)
if (strategy.position_size < 0.0)
if (use_short_stop_loss and not use_short_take_profit)
strategy.exit("Short", stop = shortStopPrice)
if (use_short_take_profit and not use_short_stop_loss)
strategy.exit("Short", limit = shortLimitPrice)
if (use_short_take_profit and use_short_stop_loss)
strategy.exit("Short", stop = shortStopPrice, limit = shortLimitPrice)
strategy.close("Long", when=bearish and not short_entry and (showDate ? window() : true))
strategy.close("Short", when=bullish and not long_entry and (showDate ? window() : true))