В процессе загрузки ресурсов... загрузка...

Индикатор импульса Стратегия торговли решениями

Автор:Чао Чжан, Дата: 2023-12-15 15:31:52
Тэги:

img

Обзор

Момент-индикатор (англ. Momentum Indicator Decision Trading Strategy) - это стратегия, использующая двойную экспоненциальную скользящую среднюю и объединяющая ее с индикатором изменения курса цены для получения торговых сигналов.

Принцип стратегии

Стратегия использует осциллятор точки решения, основанный на двойной экспоненциальной скользящей средней для измерения импульса. Сначала он рассчитывает ежедневный коэффициент изменения цены, затем использует 31-дневные и 20-дневные двойные экспоненциальные скользящие средние для сглаживания коэффициента изменения цен отдельно. Наконец, он использует 9-дневную сглаженную скользящую среднюю для выпуска торговых сигналов. Когда быстрая линия выше медленной линии, это указывает на бычий рынок. Когда быстрая линия ниже медленной линии, это указывает на медвежий рынок.

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

Анализ преимуществ

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

Анализ рисков

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

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

Руководство по оптимизации

Стратегия может быть оптимизирована в следующих аспектах:

  1. Добавить другие индикаторы фильтрации, такие как индикатор волатильности, чтобы избежать торговли в периоды резких колебаний рынка.

  2. Добавьте модели машинного обучения, чтобы помочь судить о направлении и силе тренда, что может улучшить точность сигнала.

  3. Попробуйте различные индикаторы импульса, такие как индекс относительной силы, стохастический осциллятор для оптимизации времени входа и выхода.

  4. При торговле в режиме реального времени динамически корректировать параметры в сочетании с недавними рыночными условиями для достижения оптимальной комбинации параметров.

Заключение

Стратегия решения о торговле индикатором импульса - это, как правило, стабильная средне-долгосрочная стратегия, следующая за трендом. Она эффективно идентифицирует тенденции и избегает неправильных сделок путем сочетания двойного экспоненциального среднего движущегося индикатора импульса и индикатора скорости изменения цены. Между тем, она контролирует риск, устанавливая точки остановки потерь. Если параметры настроены правильно и результаты бэкстеста хороши, она подходит для средне-долгосрочных инвесторов, которые стремятся к избыточной отдаче.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-11-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Decision BF", overlay=false, 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 ///////////////
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

/////////////// Decision ///////////////
src = input(ohlc4, title="Source")
length1 = input(31, title="First Smoothing")
length2 = input(20, title="Second Smoothing")
siglength = input(9, title="Signal Smoothing")
fr = input(true, title="Fill Region")

calc_csf(src, length) => 
	sm = 2.0 / length
	csf = 0.0
	csf := (src - nz(csf[1])) * sm + nz(csf[1])
	csf
i = (src / nz(src[1], src)) * 100
pmol2 = calc_csf(i - 100, length1)
pmol = calc_csf(10 * pmol2, length2)
pmols = ema(pmol, siglength)
d = pmol - pmols
duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL")

hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7, 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 = d > 0 and isMoving() 
short = d < 0 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])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[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("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal")
mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO")
fill(duml, sigl, color.green, transp=20, title="PosFill")
fill(duml, mdl, color.red, transp=20, title="NegFill")
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)

Больше