Trend MACD Berikutan Strategi Intraday

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

img

Ringkasan

MACD Trend Following Intraday Strategy adalah strategi perdagangan intraday yang menggabungkan purata bergerak, penunjuk MACD dan Penunjuk Williams. Ia menggunakan kombinasi yang berbeza dari tiga penunjuk untuk membentuk kriteria masuk dan keluar untuk kedudukan panjang dan pendek, bertujuan untuk menangkap ciri-ciri trend pergerakan harga jangka pendek.

Logika Strategi

Logik perdagangan utama strategi ini adalah berdasarkan beberapa aspek:

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

  2. Pergi panjang apabila garis cepat MACD berada di atas garis perlahan, dan pergi pendek apabila di bawah;

  3. Pergi panjang apabila garis MA cepat William Indicator berada di atas garis MA perlahan, dan sebaliknya;

  4. Menggunakan gabungan tiga senario ini sebagai syarat kemasukan;

  5. Keluar pada isyarat pembalikan.

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

Kelebihan

Struktur gabungan pelbagai penunjuk ini membuat trend jangka pendek yang tipikal mengikut strategi, dengan tepi utama seperti:

  1. Pengesahan silang tiga kali untuk mengurangkan isyarat palsu;

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

  3. Penunjuk Williams mengelakkan mengejar atas atau memancing bawah semasa pergerakan yang tidak menentu;

  4. Kombo pembalikan memastikan kawalan risiko sejajar dengan pintu keluar.

Risiko

Terdapat juga risiko besar untuk diperhatikan untuk strategi ini:

  1. Struktur yang kompleks menjadikan penyesuaian parameter mencabar;

  2. Perdagangan jangka pendek yang kerap boleh membawa kepada kos transaksi yang lebih tinggi;

  3. Kegagalan untuk mengesan titik pembalikan trend yang benar boleh mengakibatkan kerugian.

Pengurangan utama adalah pengoptimuman parameter dan stop loss untuk memaksimumkan kombinasi keuntungan dan mengawal kerugian perdagangan tunggal maksimum.

Peluang Peningkatan

Aspek utama untuk meningkatkan strategi:

  1. Uji lebih banyak kombinasi parameter untuk set optimum;

  2. Tambah lebih banyak suapan data seperti jumlah untuk pengesahan kemasukan;

  3. Menggunakan stop loss dinamik atau trailing untuk mengukuhkan kawalan risiko;

  4. Masukkan pembelajaran mesin untuk mengesan pembalikan sebenar.

Kesimpulan

Trend MACD berikut strategi intraday ini secara berkesan menggabungkan penunjuk untuk mengenal pasti trend jangka pendek dan menguruskan risiko. Penambahbaikan lebih lanjut pada parameter penyesuaian, menetapkan paras stop loss dan menggabungkan lebih banyak suapan data dapat meningkatkan kadar kemenangan strategi dan keuntungan.


/*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 lanjut