Стратегия отслеживания длинного-короткого баланса MACD


Дата создания: 2023-10-17 16:15:53 Последнее изменение: 2023-10-17 16:15:53
Копировать: 0 Количество просмотров: 704
1
Подписаться
1617
Подписчики

Стратегия отслеживания длинного-короткого баланса MACD

Обзор

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

Стратегический принцип

В коде сначала устанавливается время начала отсчета, чтобы проверить историческую эффективность стратегии.

Затем выполняется расчет MACD-показателей, включая настройку длины скоростных, медленных и средних MACD-линий. Быстрые линии более чувствительны, а медленные более устойчивы. Их разница образует основную линию MACD, а затем через равномерную линию образует сигнальную линию MACD.

На основании многоголовых и пустых сигналов, записывается время последнего появления сигнала. Когда быстрые и медленные линии пересекаются, подтверждается и записывается сигнал покупки/продажи, тогда можно открыть позицию.

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

Стратегические преимущества

  1. MACD является одним из классических индикаторов технического анализа, который эффективно идентифицирует тенденции.

  2. Дифференциальный дизайн медленно-быстрых средних позволяет заранее определить динамику и направление изменения цен.

  3. Использование фильтрации равномерной линии позволяет отфильтровать некоторые ложные сигналы.

  4. Также в стратегию включены механизмы сдерживания убытков, чтобы контролировать риски.

Стратегический риск

  1. MACD-индикаторы легко создают ложные сигналы, сами индикаторы имеют ограниченное пространство для оптимизации.

  2. Неправильная настройка стоп-пойнтов может быть слишком активной или консервативной и требует индивидуальной оптимизации для разных сортов.

  3. Позиции с фиксированным количеством могут привести к чрезмерному уровню леверинга, поэтому следует рассмотреть возможность установления рискового порога в соответствии с размером капитала.

  4. Необходимо проверить рациональность выбора временного окна отслеживания, чтобы избежать пересочетания.

Оптимизация стратегии

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

  2. Добавить фильтры на другие индикаторы, такие как K-линия, Брин-линия, RSI и т. д. для проверки сигнала.

  3. Эффективность различных стоп-пойнтов может быть оценена на основе таких показателей, как отзыв и коэффициент Шарпа.

  4. Оптимизация стратегий по прекращению убытков, такие как перемещение убытков, привязывание стоп-листов и т. д.

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

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("MACD BF", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Component Code Start ///////////////
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)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

long = crossover(delta, 0) 
short = crossunder(delta, 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 = 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 = 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 = 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(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

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

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)