Xu hướng MACD sau chiến lược trong ngày

Tác giả:ChaoZhang, Ngày: 2023-12-19 11:16:44
Tags:

img

Tổng quan

MACD Trend Following Intraday Strategy là một chiến lược giao dịch trong ngày kết hợp các đường trung bình động, chỉ số MACD và chỉ số Williams. Nó sử dụng các kết hợp khác nhau của ba chỉ số để hình thành các tiêu chí nhập và xuất cho các vị trí dài và ngắn, nhằm nắm bắt các đặc điểm xu hướng của các biến động giá ngắn hạn.

Chiến lược logic

Logic giao dịch chính của chiến lược này dựa trên một số khía cạnh:

  1. Đi dài khi giá phá vỡ trên đường trung bình chuyển động biểu thức (EMA), và đi ngắn khi nó phá vỡ bên dưới;

  2. Đi dài khi đường nhanh MACD nằm trên đường chậm, và đi ngắn khi ở dưới;

  3. Đi dài khi đường MA nhanh của chỉ số William nằm trên đường MA chậm, và ngược lại;

  4. Sử dụng các kết hợp của ba kịch bản này làm điều kiện nhập cảnh;

  5. Ra ngoài khi có tín hiệu quay lại.

Bằng cách kết hợp EMA cho hướng xu hướng tổng thể và MACD cho đà ngắn hạn, chiến lược này có thể nắm bắt các biến động xu hướng giá tại các điểm đầu vào hợp lý cho lợi nhuận.

Ưu điểm

Cấu trúc kết hợp nhiều chỉ số này tạo ra một xu hướng ngắn hạn điển hình theo chiến lược, với các cạnh chính như:

  1. Kiểm tra chéo ba lần để giảm tín hiệu sai;

  2. EMA cho xu hướng chính, MACD cho đà ngắn hạn;

  3. Chỉ số Williams tránh đuổi theo đỉnh hoặc đánh bắt đáy trong khi di chuyển dễ bay hơi;

  4. Nhóm đảo ngược đảm bảo kiểm soát rủi ro phù hợp với lối ra.

Rủi ro

Ngoài ra còn có những rủi ro lớn cần lưu ý cho chiến lược này:

  1. Cấu trúc phức tạp làm cho điều chỉnh tham số khó khăn;

  2. Các giao dịch ngắn hạn thường xuyên có thể dẫn đến chi phí giao dịch cao hơn;

  3. Không phát hiện được các điểm đảo ngược xu hướng thực sự có thể dẫn đến tổn thất.

Các biện pháp giảm thiểu chính là tối ưu hóa tham số và dừng lỗ để tối đa hóa sự kết hợp lợi nhuận và kiểm soát tối đa lỗ giao dịch duy nhất.

Cơ hội gia tăng

Các khía cạnh chính để tăng cường chiến lược:

  1. Kiểm tra nhiều kết hợp tham số hơn cho bộ tối ưu;

  2. Thêm thêm nguồn cấp dữ liệu như khối lượng để xác nhận nhập;

  3. Sử dụng stop loss động hoặc trailing để tăng cường kiểm soát rủi ro;

  4. Kết hợp máy học để phát hiện sự đảo ngược thực sự.

Kết luận

Xu hướng MACD này sau chiến lược trong ngày kết hợp hiệu quả các chỉ số để xác định xu hướng ngắn hạn và quản lý rủi ro. Cải thiện thêm các thông số điều chỉnh, thiết lập mức dừng lỗ và kết hợp nhiều nguồn cấp dữ liệu hơn có thể nâng tỷ lệ chiến lược và lợi nhuận. Các khái niệm đáng nghiên cứu để tiến bộ chiến lược.


/*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()

Thêm nữa