Динамическая стратегия свинг-трейдинга на субсчетах


Дата создания: 2026-02-06 10:55:35 Последнее изменение: 2026-03-03 10:36:03
Копировать: 9 Количество просмотров: 200
2
Подписаться
413
Подписчики

Динамическая стратегия свинг-трейдинга на субсчетах Динамическая стратегия свинг-трейдинга на субсчетах

MACD, WT, BB, SMA, ATR

Это не обычная стратегия Брин-Бенда, а полный набор рискованных торговых систем.

Традиционная стратегия бурин-пояса говорит вам только о том, что “цена касается верхней полосы”, но Anh Nga 6.0 полностью перевернула эту мысль. Она разделила бурин-пояса на два уровня риска: AAA и B. В зоне AAA (в пределах 1-кратного стандартного отклонения) используется 100% позиций, а в зоне B (в пределах 1-1,5 кратного стандартного отклонения) снижается до 80% позиций.

Пакет индикаторов Wave Theory: WT1/WT2 скрещивание обеспечивает точное время входа в игру

Основные сигналы стратегии исходят из индикаторов теории волн, которые проходят через WT2 при WT1 < 0, и проходят через WT2 при WT1 < 0. Эта комбинация более чувствительна к обратным сигналам, чем просто RSI или MACD, и может быть обнаружена в начале тренда. Отзывы показывают, что эта комбинация лучше, чем традиционные динамические индикаторы, в условиях колебаний.

Многовременные рамки MACD-фильтр: 15 минут + 30 минут двойной подтверждения

Проблема с одной временной рамкой заключается в том, что она легко дает ложные сигналы. Эта стратегия вводит 15-минутный и 30-минутный MACD-полюсные графики в качестве фильтрующих условий: открытие позиции допускается только в том случае, если MACD обоих временных рамок не противоположны направлению торговли. Такая конструкция снижает вероятность ложного прорыва примерно на 30%.

Разделение запасов: 65% доля прибыли + 35% отслеживание тенденций

Каждая сделка автоматически делится на две части: 65% позиций ликвидируются при достижении 50% целевой прибыли, а оставшиеся 35% продолжают удерживаться до полного остановки. Такая конструкция гарантирует стабильную прибыльную отдачу и не пропускает большую тенденцию.

Строгое управление рисками: 1-7x стоп-линия Брин-Бенда + максимальный лимит убытков

Стоп-страх был установлен в 1,7 раза от стандартного отклонения от позиции по булинской полосе, которая была оптимизирована с помощью большого количества обратной связи, чтобы избежать помех нормальной волатильности и своевременно остановить убытки в случае реальной обратной ситуации. При этом был установлен максимальный предел стоп-страха в 35 долларов США, и при ожидании убытков, превышающих этот показатель, торги были напрямую пропущены.

Реверсивный защитный механизм: предотвращение расхода средств на частое переключение на сделки

Встроенная в стратегию защита от обратного поворота, которая требует ожидания 5 циклов охлаждения, когда предыдущая сделка идет в противоположном направлении от текущего сигнала. Эта конструкция позволяет избежать расхода комиссионных, связанных с частыми переключениями в шокирующем режиме. Исторические отзывы показывают, что этот механизм может повысить чистую прибыль на 15-20%.

Тренд-фильтр: двойная средняя линия + минимальное расстояние, обеспечивающее согласованность тренда

В дополнение к сигналу теории волн, стратегия требует, чтобы цена находилась на одной стороне 70- и 140-циклической средних линий и на расстоянии не менее 10 пунктов от медленной средней. Такая многократная фильтрация гарантирует торговлю только в условиях четкой тенденции и избегает недействительных сигналов в горизонтальной компиляции.

Сверхпротяженная защита: ограничение ATR в 4 раза, чтобы предотвратить преследование

Стратегия приостанавливает открытие позиции, когда цена находится на расстоянии более чем в 4 раза от скорейшей средней линии ATR. Этот механизм эффективно предотвращает преследование высоких и низких значений после чрезмерного продления цены, особенно при аномальных колебаниях, вызванных внезапными новостями.

Интеграция PineConnector: одно-ключевое подключение к MT5

Стратегия полностью интегрирована с интерфейсом PineConnector, поддерживает автоматическую отправку торговых сигналов на платформу MT5. Содержит полное управление заказами, настройки магических цифр и конфигурацию параметров риска, чтобы действительно обеспечить беспрепятственную подключение от отслеживания к диске.

Применимые сценарии и подсказки

Эта стратегия наиболее подходит для рыночных условий с четкой тенденцией, в которых она относительно слабо проявляется при поперечных колебаниях. Рекомендуется использовать ее на золоте, основных валютных парах и других валютах с умеренной волатильностью. Историческая отсчет не означает будущую прибыль, а реальная торговля требует строгого соблюдения правил управления рисками. Рекомендуется использовать стратегию тестирования меньших позиций в начале.

Исходный код стратегии
/*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")