
La stratégie de double croisement de moyenne mobile est une stratégie de suivi de tendance qui utilise une moyenne mobile rapide et une moyenne mobile lente croisée pour former un signal d’achat et de vente. Cette stratégie combine plusieurs indicateurs tels que MACD, RSI et autres pour déterminer la direction de la tendance, avec une forte capacité de suivi de tendance.
La stratégie est basée sur les indicateurs suivants:
Les moyennes mobiles rapides et les moyennes mobiles lentes: les signaux d’achat sont traversés par des lignes lentes sur les lignes rapides et les signaux de vente par des lignes lentes sous les lignes rapides.
MACD: est un signal à plusieurs têtes lorsque la ligne MACD est supérieure à la ligne Signal et que la valeur minimale de la MACD augmente.
RSI: RSI supérieur à 50 est un signal de multiples et inférieur à 50 est un signal de zéro.
Oscillateur de mesure (AO): lorsque l’axe 0 au dessus de l’AO est un signal d’achat, l’axe 0 en dessous de l’AO est un signal de vente.
Trois moyennes mobiles au niveau de la ligne solaire: les moyennes mobiles à plus courte période au niveau de la ligne solaire sont placées sur les moyennes mobiles à plus longue période comme signal d’achat.
La stratégie synthétise plusieurs périodes de temps et plusieurs indicateurs, formant une logique de jugement d’achat et de vente. Elle génère des ordres d’achat lorsque plusieurs indicateurs produisent simultanément des signaux d’achat et des ordres de vente lorsque plusieurs indicateurs produisent simultanément des signaux de vente, permettant de suivre la tendance.
Cette stratégie présente les avantages suivants:
La combinaison de plusieurs indicateurs permet d’éviter les faux signaux et d’améliorer l’exactitude des jugements.
La combinaison de plusieurs périodes de temps permet de détecter les tendances à un plus grand niveau.
Les paramètres de l’indicateur ont été optimisés, Parameters tuning, avec un meilleur taux de rendement.
Le stop-loss mobile est utilisé pour contrôler le risque et prévenir l’expansion des pertes.
Le suivi automatique des tendances fonctionne sans intervention humaine et réduit les coûts d’exploitation.
Cette stratégie comporte aussi des risques:
Il est possible de générer plus de signaux de transaction inefficaces dans des conditions de choc. Les signaux inefficaces peuvent être réduits en optimisant les paramètres de l’indicateur.
Les événements imprévus peuvent entraîner un retrait rapide. Un arrêt mobile peut être configuré pour contrôler les pertes.
Les règles de détection des signaux multi-espaces sont plus complexes et l’optimisation des paramètres nécessite une grande quantité de données historiques.
Un mauvais réglage de l’arrêt de suivi peut entraîner un arrêt prématuré. Des tests répétés sont nécessaires pour déterminer les paramètres optimaux.
Cette stratégie peut être optimisée dans les directions suivantes:
Testez plus de combinaisons d’indicateurs à la recherche de signaux de trading plus stables et plus précis, tels que les indicateurs de volatilité, les indicateurs OBV, etc.
Optimiser les paramètres de l’indicateur et réduire le nombre de transactions invalides. Utiliser l’apprentissage automatique et les algorithmes génétiques pour rechercher automatiquement les paramètres optimaux.
Augmentation de la technologie d’intégration des modèles, intégration de plus de stratégies indépendantes et de plus de modèles de jugement.
Entrer en haute fréquence et sortir en basse fréquence. Réduire le risque d’être piégé
Ajout de modules de contrôle de vent quantifiés, contrôle strict du taux de perte unique, taux de rétractation maximal, etc.
La stratégie multichannel de croisement de deux indicateurs à moyenne rapide forme un signal de négociation par la croisée de la moyenne mobile rapide et de la moyenne mobile lente, et combine plusieurs indicateurs pour déterminer la direction de la tendance et permettre un suivi automatique de la tendance. La stratégie a beaucoup d’espace pour l’optimisation, et de meilleurs résultats stratégiques sont attendus en introduisant plus d’indicateurs, en ajustant les paramètres et en intégrant des modèles.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('SteffVans', shorttitle='SteffVans strategy', overlay=true, process_orders_on_close = true)
// Input settings
macd_fast_length = input(12)
macd_slow_length = input(26)
macd_signal_length = input(9)
// Calculate MACD values
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)
mg = ta.lowest(signal_line, 30) >= -0
// RSI
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
rsiLengthInput = input.int(14, minval=1)
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
RSI = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
// AO
AO = ta.sma((high + low) / 2, 5) - ta.sma((high + low) / 2, 34)
crossaosell = AO < AO[1] and AO[1] < AO[2] and AO[2] > AO[3] and ta.lowest(low,3)
// Uptrend sma
len1 = input.int(5, minval=1)
len2 = input.int(10, minval=1)
len3 = input.int(20, minval=1)
src = input(close)
out1 = ta.sma(src, len1)
out2 = ta.sma(src, len2)
out3 = ta.sma(src, len3)
// Timeframe
macdl60 = request.security(syminfo.tickerid, "60", signal_line,lookahead = barmerge.lookahead_on)
ao = request.security(syminfo.tickerid, "60", AO,lookahead = barmerge.lookahead_on)
rsi = request.security(syminfo.tickerid, "60", RSI,lookahead = barmerge.lookahead_on)
good = request.security(syminfo.tickerid, "60", mg,lookahead = barmerge.lookahead_on)
bad = request.security(syminfo.tickerid, "60", crossaosell,lookahead = barmerge.lookahead_on)
ma1 = request.security(syminfo.tickerid, "D", out1,lookahead = barmerge.lookahead_on)
ma2 = request.security(syminfo.tickerid, "D", out2, lookahead = barmerge.lookahead_on)
ma3 = request.security(syminfo.tickerid, "D", out3, lookahead = barmerge.lookahead_on)
// Kriteria BUY and SELL
uptrend1 = request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) > ma1 and ma1 > ma3 and ma2 > ma3
uptrend2 = ta.lowest(ma1,12) > ta.lowest(ma3,12) and ta.lowest(ma2,12) > ta.lowest(ma3,12)
// Triger BUY and SELL
cross1 = ao > ao[1] and ao[1] < ao[2] and ao > 0 and good and rsi >= 60 and uptrend1
cross2 = ao > 0 and ao[1] < 0 and good and rsi >=50 and uptrend1
cross3 = ao > 0 and ao[1] < 0 and not good and uptrend2 and uptrend1
cross4 = ao > ao[1] and ao[1] > ao[2] and ao[2] < ao[3] and ao[3] < ao[4] and not good and uptrend2 and uptrend1
s1 = ao < ao[1] and ao[1] < ao[2] and ao[2] < ao[3] and ao > 0 and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
s2 = ao < 0 and ao < ao[2] and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
// Variabel Buy dan Sell
buySignal = false
sellSignal = false
// Syarat masuk Buy
buyCondition = cross1 or cross2 or cross3 or cross4
if buyCondition
buySignal := true
// Syarat masuk Sell
sellCondition = s1 or s2
if sellCondition
sellSignal := true
// Reset sinyal jika ada sinyal berulang
if buySignal and sellSignal
sellSignal := false
if sellSignal and buySignal
buySignal := false
// Logika perdagangan
if buySignal
strategy.entry("Buy", strategy.long, comment = "BUY")
if sellSignal
strategy.close("Buy")
plotshape(cross1,title = "Stefkuy1", style = shape.labelup, location = location.belowbar, color = color.green,text = "1", textcolor = color.white,size = size.small)
plotshape(cross2,title = "Stefkuy2", style = shape.labelup, location = location.belowbar, color = color.green, text = "2", textcolor= color.white, size = size.small)
plotshape(cross3,title = "StefVan1", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "3", textcolor= color.white,size = size.small)
plotshape(cross4,title = "StefVan2", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "4", textcolor= color.white,size = size.small)