Эта стратегия использует MACD для определения направления тренда, в сочетании с EMA и SMA кроссовером в качестве подтверждения. Сигнал входа - это когда гистограмма MACD пересекает линию сигнала и тренд повышается. Стоп-лосс устанавливается на уровне цены ниже плавающей остановки ATR. Стратегия также частично выходит, чтобы получить прибыль, выходит больше при большем росте цен и удерживает определенную позицию с остановкой, пока не будет достигнута остановка.
Когда более быстрая EMA пересекает более медленную EMA, это указывает на то, что краткосрочный тренд лучше, чем долгосрочный тренд, сигнализируя о покупке. Между тем, более быстрый переход SMA над более медленной SMA также предполагает более сильный подъемный импульс в краткосрочной перспективе. Таким образом, сочетание пересечения линии MACD выше сигнала и восходящего тренда на основе перекрестного EMA&SMA помогает идентифицировать более сильные сигналы входа.
ATR используется для расчета уровня стоп-лосса. ATR может эффективно измерять диапазон колебаний цены. Когда цена падает ниже этого диапазона, запускается стоп-лосс. Период ATR можно корректировать - меньший период позволяет более точно остановиться, но легче остановиться, в то время как более большой период дает более широкую остановку, но более прочную.
Выходит частично на небольшом ценовом всплеске, чтобы получить прибыль. Выходит больше на большом ценовом всплеске, чтобы зафиксировать прибыль. Сохраняет некоторую позицию с последующей остановкой, пока не будет достигнута остановка потери. Это помогает зафиксировать прибыль, при этом все еще может удерживать позицию в течение некоторого периода.
Риск ошибочного сигнала от MACD и индикаторов тренда.
Риск попадания ATR-стоп-лосса может увеличить период ATR или множитель стоп-лосса.
Уменьшить размер позиции и сократить потери во времени.
Оптимизировать параметры MACD для лучшего определения тренда
Оптимизировать период ATR для улучшения уровня остановки потерь
Оптимизировать коэффициенты выхода и размер позиций для снижения риска задержания
Подумайте о добавлении движущегося индекса прибыли или волатильности для улучшения стоп-лосса
Стратегия сочетает в себе MACD, EMA/SMA и другие индикаторы для точного определения тренда и времени входа. Плавающий ATR Stop Loss помогает зафиксировать прибыль, следуя за трендом. Выходы откладываются для получения прибыли, обеспечения прибыли и удержания позиции в течение длительного времени. В целом он стабилен с достойным результатом. Но параметры и выходы могут быть дополнительно оптимизированы для лучшей доходности.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 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/ // © Deobald //@version=4 strategy("MACD Strategy", overlay=true) // FUNCTIONS Ema(src,p) => ema = 0. sf = 2/(p+1) ema := nz(ema[1] + sf*(src - ema[1]),src) Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0) Atr(p) => atr = 0. Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1]))) atr := nz(atr[1] + (Tr - atr[1])/p,Tr) /// TREND ribbon_period = input(34, "Period", step=1) leadLine1 = ema(close, ribbon_period) leadLine2 = sma(close, ribbon_period) p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) // MACD fast_length = input(title="Fast Length", type=input.integer, defval=3) slow_length = input(title="Slow Length", type=input.integer, defval=5) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length) slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // plot(macd, title="MACD", color=col_macd, transp=0) // plot(signal, title="Signal", color=col_signal, transp=0) // TAKE PROFIT AND STOP LOSS long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) // Stop Loss multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1) ATR_period=input(17,"ATR period", minval=1, step=1) // Strategy entry_long=crossover(macd,signal) and leadLine2 < leadLine1 entry_price_long=valuewhen(entry_long,close,0) SL_floating_long = entry_price_long - multiplier*Atr(ATR_period) exit_long= close < SL_floating_long ///// BACKTEST PERIOD /////// testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => true if testPeriod() strategy.entry("long", strategy.long, comment="Long", when=entry_long) strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick) strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick) strategy.close_all("long", when=exit_long, comment="exit long" ) // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit") plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit") plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")