Tren MACD Mengikuti Strategi Intraday

Penulis:ChaoZhang, Tanggal: 2023-12-19 11:16:44
Tag:

img

Gambaran umum

MACD Trend Following Intraday Strategy adalah strategi perdagangan intraday yang menggabungkan moving average, indikator MACD dan indikator Williams.

Logika Strategi

Logika perdagangan utama dari strategi ini didasarkan pada beberapa aspek:

  1. Pergi panjang ketika harga melanggar di atas garis EMA (Exponential Moving Average), dan pergi pendek ketika melanggar di bawahnya;

  2. Pergi panjang ketika garis cepat MACD berada di atas garis lambat, dan pergi pendek di bawahnya;

  3. Pergi panjang ketika garis MA cepat Indikator William berada di atas garis MA lambat, dan sebaliknya;

  4. Menggunakan kombinasi dari tiga skenario ini sebagai kondisi masuk;

  5. Keluar pada sinyal pembalikan.

Dengan menggabungkan EMA untuk arah tren keseluruhan dan MACD untuk momentum jangka pendek, strategi ini dapat menangkap pergerakan tren harga pada titik masuk yang layak untuk keuntungan.

Keuntungan

Struktur kombinasi multi-indikator ini membuat tren jangka pendek yang khas mengikuti strategi, dengan tepi utama seperti:

  1. Verifikasi silang tiga kali untuk mengurangi sinyal palsu;

  2. EMA untuk tren utama, MACD untuk momentum jangka pendek;

  3. Williams Indicator menghindari mengejar atas atau memancing bawah selama gerakan volatile;

  4. Kombo pembalikan memastikan kontrol risiko selaras dengan exit.

Risiko

Ada juga risiko besar yang harus diperhatikan untuk strategi ini:

  1. Struktur yang kompleks membuat pengaturan parameter menantang;

  2. Perdagangan jangka pendek yang sering dapat menyebabkan biaya transaksi yang lebih tinggi;

  3. Kegagalan untuk mendeteksi titik pembalikan tren yang sebenarnya dapat mengakibatkan kerugian.

Mitigasi utama adalah optimasi parameter dan stop loss untuk memaksimalkan kombinasi keuntungan dan mengendalikan kerugian perdagangan tunggal maksimal.

Peluang Peningkatan

Aspek utama untuk meningkatkan strategi:

  1. Uji lebih banyak kombinasi parameter untuk set optimal;

  2. Tambahkan lebih banyak umpan data seperti volume untuk validasi entri;

  3. Menggunakan stop loss dinamis atau trailing untuk memperkuat pengendalian risiko;

  4. Masukkan pembelajaran mesin untuk mendeteksi pembalikan yang sebenarnya.

Kesimpulan

Tren MACD berikut strategi intraday ini secara efektif menggabungkan indikator untuk mengidentifikasi tren jangka pendek dan mengelola risiko. Perbaikan lebih lanjut pada parameter tuning, menetapkan tingkat stop loss dan menggabungkan lebih banyak umpan data dapat meningkatkan tingkat kemenangan dan profitabilitas strategi.


/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
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/
// © platsn

//@version=5
strategy("MACD Willy Strategy", overlay=true, pyramiding=1, initial_capital=10000) 

// ******************** Trade Period **************************************
startY = input(title='Start Year', defval=2011, group = "Trading window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Trading window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Trading window")
finishY = input(title='Finish Year', defval=2050, group = "Trading window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Trading window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Trading window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
// t1 = time(timeframe.period, "0945-1545:23456") 
// window = time >= timestart and time <= timefinish and t1 ? true : false 
// t2 = time(timeframe.period, "0930-1555:23456")
// window2 = time >= timestart and time <= timefinish and t2 ? true : false 

leverage = input.float(1, title="Leverage (if applicable)", step=0.1, group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=20, title = "Reinvest percentage", group="Trading Options")
// entry_lookback = input.int(defval=10, title="Lookback period for entry condition", group = "Trading Options")

// -------------------------------------------- Data Source --------------------------------------------

src = input(title="Source", defval=close)

// ***************************************************************************************************** Daily ATR *****************************************************
atrlen = input.int(14, minval=1, title="ATR period", group = "Daily ATR")
iPercent = input.float(5, minval=1, maxval=100, step=0.1, title="% ATR to use for SL / PT", group = "Daily ATR")
 
percentage = iPercent * 0.01
datr = request.security(syminfo.tickerid, "1D", ta.rma(ta.tr, atrlen))
datrp = datr * percentage

// plot(datr,"Daily ATR")
// plot(datrp, "Daily % ATR")

//*********************************************************** VIX volatility index ****************************************

VIX = request.security("BTC_USDT:swap", timeframe.period, close)
vix_thres = input.float(20.0, "VIX Threshold for entry", step=0.5, group="VIX Volatility Index")

// ************************************************ Volume ******************************************************

vol_len = input(50, 'Volume MA Period')
avg_vol = ta.sma(volume, vol_len)

//-------------------------------------------------------- Moving Average ------------------------------------

emalen1 = input.int(200, minval=1, title='EMA', group= "Moving Averages")
ema1 = ta.ema(src, emalen1)

// ------------------------------------------ MACD ------------------------------------------
// Getting inputs
fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Plot colors
col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

// ---------------------------------------- William %R --------------------------------------
w_length = input.int(defval=34, minval=1)
w_upper = ta.highest(w_length)
w_lower = ta.lowest(w_length)

w_output = 100 * (close - w_upper) / (w_upper - w_lower)

fast_period = input(defval=5, title='Smoothed %R Length')
slow_period = input(defval=13, title='Slow EMA Length')

w_fast_ma = ta.wma(w_output,fast_period)
w_slow_ma = ta.ema(w_output,slow_period)



// ------------------------------------------------ Entry Conditions ----------------------------------------

L_entry1 = close > ema1 and hist > 0 and w_fast_ma > w_slow_ma 
S_entry1 = close < ema1 and hist < 0 and w_fast_ma < w_slow_ma 

// -------------------------------------------------- Entry -----------------------------------------------
strategy.initial_capital = 50000
profit = strategy.netprofit
trade_amount = math.floor(strategy.initial_capital*leverage / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital+(profit*reinvest_percent*0.01))*leverage / close) 
else
    trade_amount := math.floor(strategy.initial_capital*leverage/ close) 


if L_entry1 //and window
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 //and window
    strategy.entry("Short", strategy.short, trade_amount)

// --------------------------------------------------- Exit Conditions -------------------------------------

L_exit1 = hist < 0 and w_fast_ma < w_slow_ma and w_fast_ma < -20
S_exit1 = hist > 0 and w_fast_ma > w_slow_ma and w_fast_ma > -80

// ----------------------------------------------------- Exit ---------------------------------------------

if L_exit1 //and window2
    strategy.close("Long")
    
if S_exit1 //and window2
    strategy.close("Short")

// if time(timeframe.period, "1530-1600:23456")
//     strategy.close_all()

Lebih banyak