Stratégie de swing trading dynamique sur sous-comptes


Date de création: 2026-02-06 10:55:35 Dernière modification: 2026-03-03 10:36:03
Copier: 9 Nombre de clics: 200
2
Suivre
413
Abonnés

Stratégie de swing trading dynamique sur sous-comptes Stratégie de swing trading dynamique sur sous-comptes

MACD, WT, BB, SMA, ATR

Ce n’est pas une stratégie de ceinture de Brent ordinaire, mais un système de négociation à risque complet.

La stratégie traditionnelle de la zone de bourinage vous dit seulement que “le prix a touché le haut de la ligne de dégagement”, mais Anh Nga 6.0 renverse complètement cette idée. Il divise la zone de bourinage en deux niveaux de risque AAA et B, les zones AAA ((dans la limite d’un écarts standard de 1 fois) utilisent 100% des positions, les zones B ((dans la limite d’un écarts standard de 1 à 1,5 fois) sont réduites à 80% des positions. Cette conception est plus conforme aux lois de la volatilité du marché que la stratégie de position fixe.

La combinaison des indicateurs de la théorie des vagues: le croisement WT1/WT2 fournit un timing d’entrée précis

Le signal central de la stratégie provient de l’indicateur de la théorie des vagues, WT1 sur WT2 et WT1 < 0, et WT1 sous WT2 et WT1> 0. Cette combinaison est plus sensible que le simple RSI ou le MACD et capte les signaux de renversement dès le début de la tendance. Les retours d’expérience montrent que cette combinaison est plus performante que l’indicateur de dynamique traditionnel en cas de choc.

Multi-cadres de temps avec le filtre MACD: 15 minutes + 30 minutes double confirmation

Le problème avec un seul fuseau horaire est qu’il est facile de générer de faux signaux. La stratégie introduit des diagrammes de colonne MACD de 15 minutes et 30 minutes comme condition de filtrage: les positions ne sont autorisées à être ouvertes que lorsque les MACD des deux fuseaux horaires ne sont pas opposés à la direction de la transaction. Cette conception réduit la probabilité d’une fausse rupture d’environ 30%.

Gestion des parts de stock: 65% des bénéfices partagés + 35% du suivi des tendances

Chaque transaction est automatiquement divisée en deux parties: 65% des positions sont liquidées lorsque le profit cible de 50% est atteint, et les 35% restants sont maintenus jusqu’à la fermeture complète. Cette conception garantit un retour de profit stable et ne manque pas les grandes tendances. Lorsque la partie de la profitabilité est déclenchée, le stop loss des positions restantes s’ajuste automatiquement au prix d’ouverture de la position, réalisant une véritable position sans risque.

Contrôle strict des risques: 1,7 fois le stop de la ceinture de Brin + limite de perte maximale

Le stop-loss est placé dans la zone de Brin, qui est 1,7 fois inférieure à la norme. Ce paramètre a été optimisé par un grand nombre de retours, ce qui permet d’éviter les perturbations de la fluctuation normale et d’arrêter les pertes en temps opportun dans un véritable revers.

Mécanisme de protection inverse: éviter la dépense des fonds qui sont fréquemment transférés à des transactions

La stratégie est dotée d’une fonction de protection contre les retournements, qui nécessite une période de refroidissement de 5 cycles lorsque la direction d’une transaction précédente est opposée à la direction du signal actuel. Cette conception évite la consommation de frais de traitement causée par des changements de direction fréquents dans des situations de choc, et le historique montre que ce mécanisme peut augmenter les bénéfices nets de 15 à 20%.

Filtrage de tendance: ligne moyenne double + distance minimale pour assurer la cohérence de la tendance

En plus des signaux de la théorie des vagues, la stratégie exige que les prix soient du même côté de la moyenne des 70 et 140 cycles et à au moins 10 points de la moyenne lente. Ce filtre multiple garantit la négociation uniquement dans des environnements de tendance claire et évite les signaux invalides dans le tri horizontal.

Protection surétendue: 4 fois la limite ATR pour empêcher la poursuite de la chute

La stratégie suspend l’ouverture de position lorsque le prix est à plus de 4 fois l’ATR de la courbe moyenne rapide. Ce mécanisme prévient efficacement la poursuite des hausses et des baisses après une prolongation excessive du prix, en particulier lors de fluctuations anormales causées par des nouvelles soudaines.

L’intégration de PineConnector: une connexion en un clic pour les transactions en direct sur MT5

La stratégie est entièrement intégrée à l’interface PineConnector et prend en charge l’envoi automatique de signaux de transaction vers la plate-forme MT5. Elle comprend une gestion complète des commandes, des paramètres de numéros magiques et de la configuration des paramètres de risque, permettant une liaison vraiment transparente entre le rétroéclairage et le disque dur.

Scenarios et avertissements à risque

Cette stratégie est la mieux adaptée aux conditions de marché à tendance claire, avec une performance relativement faible dans les fluctuations de la boîte latérale. Il est recommandé de l’utiliser sur des variétés où la volatilité des paires de devises principales est modérée. Les retours historiques ne représentent pas les gains futurs.

Code source de la stratégie
/*backtest
start: 2025-04-03 19:15:00
end: 2026-01-31 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Bybit","currency":"XAUT_USDT","balance":500000}]
*/

//@version=5
strategy(title="Anh Nga 6.0 Split (Dynamic + MACD + PC)", 
     shorttitle="Anh Nga 6.0 PC Dynamic", 
     overlay=true, 
     initial_capital=50000, 
     calc_on_order_fills=false,    
     process_orders_on_close=true, 
     calc_on_every_tick=true,      
     pyramiding=0)

// --- 1. SETTINGS ---
group_time  = "Trading Window (GMT+7)"
group_risk  = "Risk Management"
group_logic = "Strategy Logic (Signal & Trend)"
group_auto  = "PineConnector Automation"
group_guard = "Reversal Guard"



// Logic Inputs
use_ma_filter   = input.bool(true, "Use Fast/Slow MA Trend Filter?", group=group_logic)
use_macd_filter = input.bool(true, "Use MACD MTF Filter?", group=group_logic)
ma_fast_len     = input.int(70, "Fast MA Length", group=group_logic)
ma_slow_len     = input.int(140, "Slow MA Length", group=group_logic)
ma_distance_min = input.float(10.0, "Min Distance from Slow MA", group=group_logic)
lookback        = input.int(3, "Signal Window (Bars)", group=group_logic)
use_overext     = input.bool(true, "Enable Overextension Filter?", group=group_logic)
atr_limit       = input.float(4.0, "Overextension ATR Limit", step=0.1, group=group_logic)

// Guard Inputs
wait_bars       = input.int(1, "Bars Between Trades (Guard)", group=group_guard)
use_rev_guard   = input.bool(true, "Enable Reversal Guard?", group=group_guard)
rev_cooldown    = input.int(5, "Opposite Trade Cooldown (Bars)", minval=1, group=group_guard)

// Risk Inputs
rr_ratio        = input.float(1.0, "Risk:Reward Ratio", group=group_risk)
bb_mult         = input.float(1.7, "BB Stop Multiplier", group=group_risk)
use_max_sl      = input.bool(true, "Filter: Skip if SL is too wide?", group=group_risk)
max_sl_dollars  = input.float(35.0, "Max SL in Dollars", group=group_risk)

// Auto Inputs (PineConnector Ready)
license_id      = input.string("YOUR_ID_HERE", "PineConnector License ID", group=group_auto)
mt5_ticker      = input.string("XAUUSDc", "MT5 Symbol Name", group=group_auto)
base_qty        = input.float(1.0, "Total Contract Size (Lot)", step=0.01, group=group_auto)
magic_number    = input.int(12345, "MT5 Magic Number (Base)", group=group_auto)

// --- 2. INDICATORS ---
ma_fast = ta.sma(close, ma_fast_len)
ma_slow = ta.sma(close, ma_slow_len)
basis   = ta.sma(close, 20)
atr     = ta.atr(14)
stdev_val = ta.stdev(close, 20)

// Standard BB for Stop Loss (Multiplier 1.7)
dev_sl   = bb_mult * stdev_val
lower_bb_sl = basis - dev_sl
upper_bb_sl = basis + dev_sl

// ZONES for Sizing
dev_1 = 1.0 * stdev_val
upper_bb_1 = basis + dev_1
lower_bb_1 = basis - dev_1

dev_1_5 = 1.5 * stdev_val
upper_bb_1_5 = basis + dev_1_5
lower_bb_1_5 = basis - dev_1_5

wt1 = ta.ema((hlc3 - ta.ema(hlc3, 10)) / (0.015 * ta.ema(math.abs(hlc3 - ta.ema(hlc3, 10)), 10)), 21)
wt2 = ta.sma(wt1, 4)

// --- MACD Filter ---
get_macd_prev() =>
    [m, s, h] = ta.macd(close, 12, 26, 9)
    [m[1], s[1], h[1]] 

[m15, s15, hist_15] = request.security(syminfo.tickerid, "15", get_macd_prev(), lookahead=barmerge.lookahead_on)
[m30, s30, hist_30] = request.security(syminfo.tickerid, "30", get_macd_prev(), lookahead=barmerge.lookahead_on)

macd_long_ok  = not use_macd_filter or not (hist_15 < 0 and hist_30 < 0)
macd_short_ok = not use_macd_filter or not (hist_15 > 0 and hist_30 > 0)

// --- 3. STATE VARIABLES ---
var float trade_sl = na
var float trade_tp_final = na
var float trade_tp_partial = na
var bool partial_hit = false 
var int last_exit_bar = 0
var int last_dir = 0
var float current_vol_partial = 0.0
var float current_vol_runner = 0.0

if strategy.position_size == 0
    partial_hit := false
    trade_sl := na
    trade_tp_final := na
    trade_tp_partial := na
    current_vol_partial := 0.0

// --- 4. LOGIC ---
is_entry_window = true
cross_long  = ta.crossover(wt1, wt2) and wt1 < 0
cross_short = ta.crossunder(wt1, wt2) and wt1 > 0
bars_since_exit = bar_index - last_exit_bar
long_allowed    = not use_rev_guard or (last_dir != -1 or bars_since_exit > rev_cooldown)
short_allowed   = not use_rev_guard or (last_dir != 1 or bars_since_exit > rev_cooldown)
can_trade_now = bars_since_exit > wait_bars

long_signal   = ta.barssince(long_allowed and cross_long) <= lookback and macd_long_ok
short_signal  = ta.barssince(short_allowed and cross_short) <= lookback and macd_short_ok

not_overext   = not use_overext or (math.abs(close - ma_fast) < (atr * atr_limit))
long_trend    = (not use_ma_filter or (close > ma_fast and close > ma_slow))
short_trend   = (not use_ma_filter or (close < ma_fast and close < ma_slow))
long_sl_dist_dollars  = math.abs(close - lower_bb_sl)
short_sl_dist_dollars = math.abs(close - upper_bb_sl)
sl_ok_long  = not use_max_sl or (long_sl_dist_dollars <= max_sl_dollars)
sl_ok_short = not use_max_sl or (short_sl_dist_dollars <= max_sl_dollars)

// --- 5. EXECUTION ---
magic_runner = magic_number + 1

// FIX: Newline separator and License ID for Close All
msg_flat = license_id + ",closeall," + mt5_ticker + ",magic=" + str.tostring(magic_number) + "\n" + license_id + ",closeall," + mt5_ticker + ",magic=" + str.tostring(magic_runner)

// ENTRY LOGIC (Split Trades - Run on Bar Close)
if barstate.isconfirmed and is_entry_window and can_trade_now and strategy.position_size == 0
    
    // --- LONG ENTRY ---
    if long_signal and long_trend and long_allowed and not_overext and close > basis and sl_ok_long and (close - ma_slow >= ma_distance_min)
        
        bool is_AAA = (close <= upper_bb_1)
        bool is_B   = (close > upper_bb_1 and close <= upper_bb_1_5)
        
        if is_AAA or is_B
            float total_lot = is_AAA ? base_qty : (base_qty * 0.8)
            current_vol_partial := math.round(total_lot * 0.65, 2)
            current_vol_runner  := math.round(total_lot - current_vol_partial, 2)
            
            if current_vol_runner < 0.01
                current_vol_runner := 0.01
                current_vol_partial := total_lot - 0.01

            trade_sl       := math.round_to_mintick(lower_bb_sl)
            trade_tp_final := math.round_to_mintick(close + (math.abs(close - trade_sl) * rr_ratio))
            trade_tp_partial := math.round_to_mintick(close + (math.abs(close - trade_tp_final) * 0.5))
            last_dir       := 1
            
            // FIX: License ID, Split Msg, and Newline Separator
            msg_A = license_id + ",buy," + mt5_ticker + ",volume=" + str.tostring(current_vol_partial, "#.##") + ",sl=" + str.tostring(trade_sl) + ",tp=" + str.tostring(trade_tp_partial) + ",magic=" + str.tostring(magic_number)
            msg_B = license_id + ",buy," + mt5_ticker + ",volume=" + str.tostring(current_vol_runner, "#.##")  + ",sl=" + str.tostring(trade_sl) + ",tp=" + str.tostring(trade_tp_final)   + ",magic=" + str.tostring(magic_runner)
            
            string type_txt = is_AAA ? "AAA (100%)" : "B (80%)"
            strategy.entry("Long", strategy.long, qty=total_lot, comment=type_txt, alert_message=msg_A + "\n" + msg_B)

    // --- SHORT ENTRY ---
    if short_signal and short_trend and short_allowed and not_overext and close < basis and sl_ok_short and (ma_slow - close >= ma_distance_min)
        
        bool is_AAA = (close >= lower_bb_1)
        bool is_B   = (close < lower_bb_1 and close >= lower_bb_1_5)

        if is_AAA or is_B
            float total_lot = is_AAA ? base_qty : (base_qty * 0.8)
            current_vol_partial := math.round(total_lot * 0.65, 2)
            current_vol_runner  := math.round(total_lot - current_vol_partial, 2)

            if current_vol_runner < 0.01
                current_vol_runner := 0.01
                current_vol_partial := total_lot - 0.01

            trade_sl       := math.round_to_mintick(upper_bb_sl)
            trade_tp_final := math.round_to_mintick(close - (math.abs(close - trade_sl) * rr_ratio))
            trade_tp_partial := math.round_to_mintick(close - (math.abs(close - trade_tp_final) * 0.5))
            last_dir       := -1

            // FIX: License ID, Split Msg, and Newline Separator
            msg_A = license_id + ",sell," + mt5_ticker + ",volume=" + str.tostring(current_vol_partial, "#.##") + ",sl=" + str.tostring(trade_sl) + ",tp=" + str.tostring(trade_tp_partial) + ",magic=" + str.tostring(magic_number)
            msg_B = license_id + ",sell," + mt5_ticker + ",volume=" + str.tostring(current_vol_runner, "#.##")  + ",sl=" + str.tostring(trade_sl) + ",tp=" + str.tostring(trade_tp_final)   + ",magic=" + str.tostring(magic_runner)

            string type_txt = is_AAA ? "AAA (100%)" : "B (80%)"
            strategy.entry("Short", strategy.short, qty=total_lot, comment=type_txt, alert_message=msg_A + "\n" + msg_B)

// MANAGEMENT LOGIC (Run on Every Tick)
if strategy.position_size > 0 and not partial_hit
    if high >= trade_tp_partial
        // FIX: Added License ID here for the modification alert
        new_sl = strategy.position_avg_price
        msg_mod = license_id + ",modify," + mt5_ticker + ",sl=" + str.tostring(new_sl) + ",magic=" + str.tostring(magic_runner)
        alert(msg_mod, alert.freq_once_per_bar)
        
        // B. BACKTEST SYNC
        strategy.close("Long", qty=current_vol_partial, comment="Partial Hit", alert_message="IGNORE")
        
        trade_sl := new_sl 
        partial_hit := true

if strategy.position_size < 0 and not partial_hit
    if low <= trade_tp_partial
        // FIX: Added License ID here for the modification alert
        new_sl = strategy.position_avg_price
        msg_mod = license_id + ",modify," + mt5_ticker + ",sl=" + str.tostring(new_sl) + ",magic=" + str.tostring(magic_runner)
        alert(msg_mod, alert.freq_once_per_bar)
        
        // B. BACKTEST SYNC
        strategy.close("Short", qty=current_vol_partial, comment="Partial Hit", alert_message="IGNORE")
        
        trade_sl := new_sl
        partial_hit := true

// FINAL EXIT (Sync)
if strategy.position_size > 0
    if low <= trade_sl or high >= trade_tp_final
        strategy.close_all(comment="Exit Long", alert_message=msg_flat)
        last_exit_bar := bar_index

if strategy.position_size < 0
    if high >= trade_sl or low <= trade_tp_final
        strategy.close_all(comment="Exit Short", alert_message=msg_flat)
        last_exit_bar := bar_index

// --- 6. VISUALS ---
plot(ma_fast, "Fast MA", color=color.new(color.teal, 0), linewidth=2)
plot(ma_slow, "Slow MA", color=color.new(color.white, 0), linewidth=3)
plot(trade_sl, "Active SL", color=color.red, style=plot.style_linebr, linewidth=2)
plot(trade_tp_final, "Final TP", color=color.green, style=plot.style_linebr, linewidth=2)

// ZONES VISUALIZATION
fill(plot(upper_bb_1, display=display.none), plot(basis, display=display.none), color=color.new(color.green, 90), title="AAA Zone Long")
fill(plot(lower_bb_1, display=display.none), plot(basis, display=display.none), color=color.new(color.red, 90), title="AAA Zone Short")
fill(plot(upper_bb_1_5, display=display.none), plot(upper_bb_1, display=display.none), color=color.new(color.yellow, 90), title="B Zone Long")
fill(plot(lower_bb_1_5, display=display.none), plot(lower_bb_1, display=display.none), color=color.new(color.yellow, 90), title="B Zone Short")