
Торговая стратегия, основанная на динамических показателях, является стратегией отслеживания тенденций. Она использует двузначные скользящие средние для построения динамических показателей, а затем в сочетании с показателями изменения цен для получения торговых сигналов.
Эта стратегия использует бинарный подвижной средний показатель Decision Point oscillator для измерения динамики. Сначала рассчитывается ежедневная скорость изменения цены, затем используются бинарные подвижные средние с длиной 31 день и 20 дней, соответственно, для сглаживания скорости изменения цены, и, наконец, используется плавная подвижная средняя с длиной 9 дней, чтобы отправить торговый сигнал.
В этой стратегии также введены показатели изменения цены, чтобы избежать ошибочных сигналов в консолидированном рынке. В частности, рассчитывается процентное изменение цены за последние 30 дней, чтобы определить, находится ли рынок в активном состоянии, с помощью его движущейся средней.
Эта стратегия, в сочетании с динамическим показателем и показателем скорости изменения цен, позволяет эффективно идентифицировать среднесрочные тенденции и избегать частого трейдинга в шокирующих ситуациях. По сравнению с простыми стратегиями тренда, такими как следование за движущейся средней, она может значительно снизить вероятность ошибочной торговли. Кроме того, в области контроля риска установлены точки остановки, которые позволяют своевременно остановить убытки и эффективно контролировать одиночные потери.
Эта стратегия основана на BASE, которая торгует на средних и длинных трендах, не может улавливать краткосрочные колебания цен. В случае сильной ситуации, стоп-стоп может быть преодолен, что приводит к большим потерям. Кроме того, неправильная настройка параметров также может повлиять на стратегию. Например, слишком короткая настройка параметров бинарной скользящей средней увеличивает вероятность ошибочной сделки.
Чтобы предотвратить риск, можно соответствующим образом скорректировать точку остановки и расширить степень остановки. Также можно временно закрыть стратегию, чтобы избежать вероятности прорыва остановки в экстремальных ситуациях.
Эта стратегия может быть оптимизирована в следующих направлениях:
Добавление других фильтрующих показателей, таких как показатели волатильности, позволяет избежать торговли во время сильных колебаний.
Добавление моделей машинного обучения, которые помогают определить направление и силу тренда, может повысить точность сигналов.
Попробуйте различные динамические индикаторы, такие как относительно сильные и слабые индикаторы, стохастический осциллятор и т. д., чтобы оптимизировать время покупки и продажи.
В процессе работы на твердом диске, в сочетании с характеристиками недавнего периода, динамически корректируйте параметры, стремитесь к оптимальному пакету параметров.
Движущийся средний показатель принятия решений в торговых стратегиях в целом является стабильной среднесрочной и долгосрочной стратегии отслеживания тенденций. Он сочетает в себе двузначный показатель движущегося среднего показателя объема и показателя изменения цены, чтобы эффективно идентифицировать тенденции и избежать ошибочной торговли. В то же время, установление остановочных точек для контроля риска.
/*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)