Эта стратегия является адаптивной торговой системой, которая сочетает в себе индикаторы волатильности и импульса для улавливания рыночных тенденций посредством координации нескольких технических индикаторов. Стратегия использует индикатор ATR для мониторинга волатильности рынка, MACD для оценки импульса тренда и сочетает в себе индикаторы импульса цен для подтверждения торговых сигналов, с гибким механизмом стоп-лосса и получения прибыли. Система имеет сильную адаптивность и может автоматически регулировать частоту торговли и контроль позиций в соответствии с рыночными условиями.
Стратегия опирается на тройную систему индикаторов в качестве основной логики торговли: во-первых, ATR используется для измерения условий волатильности рынка для предоставления ссылки на волатильность для принятия торговых решений; во-вторых, золотые и смертные кресты индикатора MACD используются для захвата поворотных точек тренда, причем быстрое и медленное пересечение линии MACD используется в качестве основных сигналов запуска торговли; в-третьих, индикаторы импульса цены используются для проверки, наблюдая изменения цен относительно предыдущих периодов для подтверждения силы тренда. Система также включает 50-дневную скользящую среднюю в качестве фильтра тренда, позволяя устанавливать длинные позиции только тогда, когда цена выше скользящей средней, и короткие позиции, когда ниже. Чтобы избежать переоценки, стратегия сигналов применяет минимальные интервалы торговли и необязательно чередует исполнение.
Эта стратегия представляет собой хорошо разработанную, логически строгую количественную торговую систему, которая достигает эффективного захвата рыночных тенденций с использованием нескольких технических индикаторов.
/*backtest start: 2019-12-23 08:00:00 end: 2024-11-25 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("[ETH] Volatility & Momentum Adaptive Strategy", shorttitle="Definitive 1 day Ethereum Signal", overlay=true, initial_capital=10000, currency=currency.USD) // === Input Parameters === // trade_size = input.float(5, title="Trade Size (ETH)") atr_length = input.int(8, minval=1, title="ATR Length") macd_fast = input.int(8, minval=1, title="MACD Fast Length") macd_slow = input.int(7, minval=1, title="MACD Slow Length") macd_signal = input.int(9, minval=1, title="MACD Signal Length") momentum_length = input.int(37, title="Momentum Length") stop_loss_percent = input.float(9.9, title="Stop Loss Percentage (%)") take_profit_percent = input.float(9.0, title="Take Profit Percentage (%)") alternate_signal = input.bool(true, title="Alternate Buy/Sell Signals") // === Indicators === // // ATR to measure volatility atr = ta.atr(atr_length) // MACD for trend momentum [macd_line, signal_line, _] = ta.macd(close, macd_fast, macd_slow, macd_signal) macd_cross_up = ta.crossover(macd_line, signal_line) macd_cross_down = ta.crossunder(macd_line, signal_line) // Momentum momentum = ta.mom(close, momentum_length) // === Signal Control Variables === // var bool last_signal_long = na var int last_trade_bar = na min_bars_between_trades = 5 // Adjust for minimal trade frequency control time_elapsed = na(last_trade_bar) or (bar_index - last_trade_bar) >= min_bars_between_trades // === Buy and Sell Conditions === // // Buy when: buy_signal = (macd_cross_up and momentum > 0 and close > ta.sma(close, 50) and time_elapsed) // Sell when: sell_signal = (macd_cross_down and momentum < 0 and close < ta.sma(close, 50) and time_elapsed) // Enforce alternate signals if selected if alternate_signal buy_signal := buy_signal and (na(last_signal_long) or not last_signal_long) sell_signal := sell_signal and (not na(last_signal_long) and last_signal_long) // === Trade Execution === // // Buy Position if (buy_signal) if strategy.position_size < 0 strategy.close("Short") strategy.entry("Long", strategy.long, qty=trade_size) last_signal_long := true last_trade_bar := bar_index // Sell Position if (sell_signal) if strategy.position_size > 0 strategy.close("Long") strategy.entry("Short", strategy.short, qty=trade_size) last_signal_long := false last_trade_bar := bar_index // === Stop Loss and Take Profit === // if strategy.position_size > 0 long_take_profit = strategy.position_avg_price * (1 + take_profit_percent / 100) long_stop_loss = strategy.position_avg_price * (1 - stop_loss_percent / 100) strategy.exit("TP/SL Long", from_entry="Long", limit=long_take_profit, stop=long_stop_loss) if strategy.position_size < 0 short_take_profit = strategy.position_avg_price * (1 - take_profit_percent / 100) short_stop_loss = strategy.position_avg_price * (1 + stop_loss_percent / 100) strategy.exit("TP/SL Short", from_entry="Short", limit=short_take_profit, stop=short_stop_loss) // === Visual Signals === // plotshape(series=buy_signal and time_elapsed, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY") plotshape(series=sell_signal and time_elapsed, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")