Strategi ini menggunakan MACD untuk menentukan arah trend, digabungkan dengan EMA dan SMA crossover sebagai pengesahan. Isyarat kemasukan adalah apabila histogram MACD melintasi di atas garis isyarat dan trendnya naik. Stop loss ditetapkan pada tahap harga di bawah stop trailing ATR terapung. Strategi ini juga keluar sebahagiannya untuk mengambil keuntungan, keluar lebih banyak pada lonjakan harga yang lebih besar, dan memegang beberapa kedudukan dengan stop trailing sehingga stop loss dipukul.
Apabila EMA yang lebih cepat melintasi di atas EMA yang lebih perlahan, ia menunjukkan trend jangka pendek lebih baik daripada trend jangka panjang, menandakan pembelian. Sementara itu, SMA yang lebih cepat melintasi di atas SMA yang lebih perlahan juga menunjukkan momentum menaik yang lebih kuat dalam jangka pendek.
ATR digunakan untuk mengira tahap stop loss. ATR boleh mengukur julat turun naik harga dengan berkesan. Apabila harga pecah di bawah julat ini, stop loss dicetuskan. Tempoh ATR boleh diselaraskan - tempoh yang lebih kecil membolehkan berhenti yang lebih tepat tetapi lebih mudah dihentikan, sementara tempoh yang lebih besar memberikan berhenti yang lebih luas tetapi lebih kuat.
Keluar sebahagiannya pada lonjakan harga kecil untuk mengambil keuntungan. Keluar lebih banyak pada lonjakan harga yang besar untuk mengunci keuntungan. Mengekalkan beberapa kedudukan dengan hentian penunggang sehingga stop loss dipukul. Ini membantu mengunci keuntungan, sementara masih dapat memegang kedudukan untuk beberapa tempoh.
Risiko isyarat yang salah dari MACD dan penunjuk trend.
Risiko ATR stop loss yang dipukul. Boleh meningkatkan tempoh ATR atau stop loss pengganda.
Risiko kedudukan belakang terperangkap. mengurangkan saiz kedudukan belakang dan memotong kerugian dalam masa.
Mengoptimumkan parameter MACD untuk penilaian trend yang lebih baik
Mengoptimumkan tempoh ATR untuk tahap stop loss yang lebih baik
Mengoptimumkan nisbah keluar dan saiz kedudukan untuk mengurangkan risiko terperangkap
Pertimbangkan untuk menambah bergerak mengambil keuntungan atau indeks turun naik untuk meningkatkan stop loss
Strategi ini menggabungkan MACD, EMA/SMA dan penunjuk lain untuk menentukan trend dan masa kemasukan dengan tepat. Stop loss ATR terapung membantu mengunci keuntungan sambil mengikuti trend. Keluarannya disusun untuk mengambil keuntungan, memastikan keuntungan dan memegang kedudukan untuk tempoh. Secara keseluruhan ia stabil dengan hasil yang baik. Tetapi parameter dan keluar dapat dioptimumkan lagi untuk pulangan yang lebih baik.
/*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")