
Эта стратегия является стратегией отслеживания тенденций с использованием индикатора MACD для идентификации многополосного направления. Она генерирует MACD-магистраль, рассчитывая разницу между быстрыми и медленными перемещающимися средними значениями. Стратегия использует золотой крест MACD-магистрали и сигнальной линии для получения сигнала покупки, а мертвый крест - для получения сигнала продажи, что позволяет осуществлять многополосный балансовый отслеживание.
В коде сначала устанавливается время начала отсчета, чтобы проверить историческую эффективность стратегии.
Затем выполняется расчет MACD-показателей, включая настройку длины скоростных, медленных и средних MACD-линий. Быстрые линии более чувствительны, а медленные более устойчивы. Их разница образует основную линию MACD, а затем через равномерную линию образует сигнальную линию MACD.
На основании многоголовых и пустых сигналов, записывается время последнего появления сигнала. Когда быстрые и медленные линии пересекаются, подтверждается и записывается сигнал покупки/продажи, тогда можно открыть позицию.
После входа в рынок, постоянно отслеживать наивысшую и наименьшую цены на позиции. Устанавливается стоп-процент, и, когда убыток достигает этого процента, стоп-убыток выходит.
MACD является одним из классических индикаторов технического анализа, который эффективно идентифицирует тенденции.
Дифференциальный дизайн медленно-быстрых средних позволяет заранее определить динамику и направление изменения цен.
Использование фильтрации равномерной линии позволяет отфильтровать некоторые ложные сигналы.
Также в стратегию включены механизмы сдерживания убытков, чтобы контролировать риски.
MACD-индикаторы легко создают ложные сигналы, сами индикаторы имеют ограниченное пространство для оптимизации.
Неправильная настройка стоп-пойнтов может быть слишком активной или консервативной и требует индивидуальной оптимизации для разных сортов.
Позиции с фиксированным количеством могут привести к чрезмерному уровню леверинга, поэтому следует рассмотреть возможность установления рискового порога в соответствии с размером капитала.
Необходимо проверить рациональность выбора временного окна отслеживания, чтобы избежать пересочетания.
Оптимизируйте комбинацию параметров по скорости и средней скорости, чтобы найти оптимальные параметры для совмещения различных сортов.
Добавить фильтры на другие индикаторы, такие как K-линия, Брин-линия, RSI и т. д. для проверки сигнала.
Эффективность различных стоп-пойнтов может быть оценена на основе таких показателей, как отзыв и коэффициент Шарпа.
Оптимизация стратегий по прекращению убытков, такие как перемещение убытков, привязывание стоп-листов и т. д.
Попытайтесь установить динамическую позицию в зависимости от изменения капитала, волатильности и т. д.
Стратегия 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)