Супер-Тренд ежедневная стратегия обратного движения - это количественная стратегия торговли, которая использует индикатор Супер-Тренда для определения рыночных тенденций, объединяет прорыв цены и средний истинный диапазон для расчета стоп-лосса, и использует индикатор скорости изменения цены для фильтрации сигналов Супер-Тренда. Эта стратегия подходит для суточных и более высоких временных рамок и может использоваться на рынках, таких как криптовалюты и акции.
Основным индикатором этой стратегии является индикатор Super Trend. Индикатор Super Trend основан на среднем истинном диапазоне (ATR) и может более четко определить направление рыночных тенденций.
Стратегия использует индикатор коэффициента изменения цены (ROC) для фильтрации индикатора Super Trend, чтобы избежать недействительных сигналов. Участвуйте только в сигналах Super Trend, когда волатильность цены велика, в противном случае не участвуйте.
Для стоп-лосса стратегия предусматривает два метода стоп-лосса: фиксированный процент стоп-лосса и адаптивный стоп-лосс на основе ATR. Фиксированный стоп-лосс прост и прямой.
Условия входа - это обратный ход индикатора Super Trend, а индикатор изменения курса цены проходит через фильтр. Условия выхода - это то, что Super Trend снова переворачивается или прорывается через линию стоп-лосса. Стратегия придерживается принципа отслеживания тренда и позволяет только одну позицию в каждом направлении.
Самое большое преимущество этой стратегии заключается в том, что индикатор Super Trend обладает большей ясностью и стабильностью в оценке направления тренда по сравнению с обычными скользящими средними, с меньшим шумом.
Адаптивный механизм стоп-лосса ATR также позволяет стратегии адаптироваться к более широкой рыночной среде.
По результатам испытаний, эта стратегия работает исключительно хорошо на бычьем рынке.
Основной риск, с которым сталкивается эта стратегия, заключается в неправильном оценке переворота тренда, который может пропустить сигналы переворота или генерировать ненужные сигналы переворота.
Кроме того, стоп-лосс, установленный слишком широко, также может привести к большим потерям.
Для устранения этих рисков, период расчета ATR может быть сокращен или скорректирован мультипликатор остановки потери ATR, а также могут быть добавлены дополнительные показатели для определения ключевых зон поддержки/сопротивления, чтобы избежать вводящих в заблуждение сигналов из этих зон.
Стратегия может быть оптимизирована в следующих аспектах:
Корректировать параметры индикатора Super Trend с целью оптимизации периода ATR и кратных ATR с целью упрощения линии Super Trend.
Корректировать параметры индикатора изменения курса цен для оптимизации периода и порога изменения курса для снижения ложных сигналов.
Попробуйте различные механизмы остановки потери, такие как остановки отслеживания, или оптимизируйте амплитуду остановки потери фиксированных остановок.
Добавление дополнительных показателей оценки для определения ключевых показателей поддержки/сопротивления и избежания ошибочной оценки переворотов тренда.
Испытывать настройки параметров и их воздействие на различные продукты для определения оптимальной комбинации параметров.
Провести оптимизацию обратного теста, чтобы найти наилучшие параметры.
В целом, Супер-Тренд ежедневная стратегия обратного движения является относительно стабильной и надежной следующей стратегии тренда. Он сочетает в себе индикатор Супер-Тренда и индикатор изменения цены для фильтрации, который может эффективно определить направление средне- и долгосрочных тенденций. Адаптивный механизм стоп-лосса ATR также позволяет ему адаптироваться к большинству рыночных условий. Благодаря дальнейшей оптимизации настроек параметров и добавлению показателей суждения, стабильность и рентабельность этой стратегии могут быть улучшены.
/*backtest start: 2024-01-22 00:00:00 end: 2024-02-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Super Trend Daily BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075) /////////////// Time Frame /////////////// _1 = input(false, "════════ Test Period ═══════") testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// Super Trend ///////////// _2 = input(false, "══════ Super Trend ══════") length = input(title="ATR Period", type=input.integer, defval=3) mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3) atr = mult * atr(length) longStop = hl2 - atr longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = hl2 + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir ///////////// Rate Of Change ///////////// _3 = input(false, "══════ Rate of Change ══════") source = close roclength = input(30, "ROC Length", minval=1) pcntChange = input(6, "ROC % Change", minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Strategy /////////////// long = dir == 1 and dir[1] == -1 and isMoving() short = dir == -1 and dir[1] == 1 and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) /////////////// Dynamic ATR Stop Losses /////////////// _4 = input(false, "════════ Stop Loss ═══════") SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type") sl_inp = input(6.0, title='Fixed Stop Loss %') / 100 atrLkb = input(20, minval=1, title='ATR Stop Period') atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier') atr1 = atr(atrLkb) longStop1 = 0.0 longStop1 := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1] shortStop1 = 0.0 shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1] slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long) strategy.entry("S", strategy.short, when=short) strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > 0) strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > 0) /////////////// Plotting /////////////// bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30) bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)