Эта стратегия генерирует торговые сигналы, основанные на перекрестке положительного направленного индикатора (DI +) и отрицательного направленного индикатора (DI-) рассчитанных на основе среднего истинного диапазона (ATR).
Вычислить ATR ((14): Вычислить средний реальный диапазон за последние 14 дней с использованием высоких, низких и близких цен.
Вычислить DI+ и DI-:
Диапазон измерений (DIA)
Ди- = 100 * RMA(MAX(DOWN,0),N) / ATNR
где UP - это разница между текущим максимумом и предыдущим закрытием, DOWN - это разница между текущим минимумом и предыдущим закрытием, N - это параметровый период, по умолчанию до 14, а ATNR - это ATR, рассчитанный с шага 1.
Определить вход и выход:
Когда DI+ пересекает DI-, генерируется сигнал покупки.
При переходе DI+ ниже DI-, генерируется сигнал продажи.
Установите стоп-лосс и принимайте прибыль:
Длинный стоп-лосс - это цена входа минус ATR, умноженная на множитель стоп-лосса
Продолжительная прибыль - это цена входа плюс ATR, умноженная на множитель прибыли.
Короткий стоп-лосс - это цена входа плюс ATR, умноженная на множитель стоп-лосса
Короткая прибыль - это цена входа минус ATR, умноженная на множитель прибыли.
Использование перекрестка DI+/DI- для определения обратного направления тренда обеспечивает своевременный сигнал о новом направлении тренда.
ATR как динамический индикатор стоп-лосс/приобретения прибыли может устанавливать разумные уровни на основе волатильности рынка.
Стратегия имеет несколько параметров и легко понять и реализовать.
Результаты обратных тестов показывают, что эта стратегия имеет положительный коэффициент прибыли и превосходит buy & hold.
Риск ложного сигнала в результате перекрестки DI
Стоп-лосс/прибыль слишком близко
Неэффективность на рынке с ограниченным диапазоном
Риск привлечения
Добавьте фильтры, такие как скользящая средняя, чтобы избежать ложных сигналов в периоды, ограниченные диапазоном.
Используйте размещение позиций, как фиксированный дробный или Мартингейл, чтобы контролировать снижение и повысить рентабельность.
Оптимизировать параметры ATR для соответствия волатильности различных торговых инструментов.
Оптимизация параметров на период DI, период ATR, мультипликатор ATR и т. д. для поиска оптимальной комбинации.
Добавьте логику ночной и ранней сессии, чтобы использовать стратегию 24/7.
Это простая и практичная стратегия, генерирующая сигналы от DI кроссовера и устанавливающая динамическую стоп-лосс / take profit с ATR. С несколькими параметрами ее легко протестировать и оптимизировать. Но DI кроссовер менее эффективен во время консолидации. В будущем сочетание дополнительных фильтров является основной областью улучшения. В целом эта стратегия демонстрирует стабильную производительность, подходящую для краткосрочной дневной торговли.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TheHulkTrading //@version=4 strategy("DI Crossing Daily Straregy HulkTrading", overlay=true) // ATR Multiplier. Recommended values between 1..4 atr_multiplier = input(1, minval=1, title="ATR Multiplier") //Length of DI. Recommended default value = 14 length = input(14, minval=1, title="Length di") up = change(high) down = -change(low) range = rma(tr, 14) //DI+ and DI- Calculations di_plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, length) / range) di_minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, length) / range) //Long and short conditions longCond = crossover(di_plus,di_minus) shortCond = crossunder(di_plus,di_minus) //Stop levels and take profits stop_level_long = strategy.position_avg_price - atr_multiplier*atr(14) take_level_long = strategy.position_avg_price + 2*atr_multiplier*atr(14) stop_level_short = strategy.position_avg_price + atr_multiplier*atr(14) take_level_short = strategy.position_avg_price - 2*atr_multiplier*atr(14) //Entries and exits strategy.entry("Long", strategy.long, when=longCond) strategy.exit("Close Long","Long", stop=stop_level_long, limit = take_level_long) strategy.entry("Short", strategy.short, when=shortCond) strategy.exit("Close Short","Short", stop=stop_level_short, limit = take_level_short)