
Chiến lược ngắn theo dõi xu hướng MACD là một chiến lược giao dịch ngắn kết hợp moving average, MACD indicator và William indicator. Chiến lược này sử dụng các kết hợp khác nhau của ba chỉ số để tạo điều kiện vào và ra của vị trí đa vị trí để nắm bắt các đặc điểm xu hướng của giá ngắn.
Các giao dịch chính trong chiến lược này dựa trên:
Xem cao khi giá vượt qua đường trung bình Exponential Moving Average (EMA) và xem thấp khi giá vượt qua đường trung bình;
Nhìn cao khi đường MACD nhanh cao hơn đường dài, nhìn thấp khi đường nhanh thấp hơn đường dài;
Chỉ số William có đường trung bình chuyển động nhanh cao hơn đường trung bình chuyển động chậm, ngược lại là đường trung bình chuyển động chậm.
Kết hợp 3 điều kiện này để xét tuyển.
Trong trường hợp ngược lại,
Bằng cách kết hợp EMA để xác định hướng của xu hướng lớn và MACD để xác định động lực giá trong ngắn hạn, chiến lược này có thể nắm bắt các đặc điểm xu hướng của giá tại các điểm vào tốt, do đó có thể kiếm được lợi nhuận. Trong khi chỉ số William có thể được sử dụng để xác minh hơn nữa tình trạng quá mua quá bán của các loại, tránh phá vỡ giả.
Cấu trúc kết hợp đa chỉ số này là một chiến lược theo dõi xu hướng ngắn điển hình, có một số lợi thế:
Ba chỉ số xác thực lẫn nhau để giảm khả năng của tín hiệu sai;
EMA đánh giá xu hướng chủ đạo, MACD đánh giá động lực đường ngắn là mạnh;
Chỉ số William đã tránh được những biến động dữ dội.
Các chỉ số này được kết hợp chặt chẽ với các biện pháp kiểm soát rủi ro.
Chiến lược này cũng có những rủi ro chính như:
Cấu trúc kết hợp đa chỉ số phức tạp, khó điều chỉnh tham số;
Các hoạt động ngắn gọn thường xuyên và có thể có chi phí giao dịch cao;
Không thể đánh giá chính xác điểm đảo chiều thực sự của xu hướng, có nguy cơ mất mát.
Phương pháp điều chỉnh chủ yếu là tìm kiếm sự kết hợp tốt nhất của các tham số điều chỉnh và dừng lỗ, và đặt mức dừng lỗ phù hợp để kiểm soát tổn thất tối đa cho mỗi giao dịch.
Chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:
Kiểm tra nhiều hơn các kết hợp các tham số chỉ số để tìm ra tham số tối ưu;
Thêm thêm các nguồn dữ liệu hỗ trợ, chẳng hạn như số lượng giao dịch;
Thiết lập dừng động hoặc theo dõi dừng để tăng cường kiểm soát rủi ro;
Các mô hình học máy kết hợp với các mô hình học máy để xác định điểm thay đổi thực sự.
MACD theo dõi xu hướng chiến lược đường ngắn sử dụng lợi thế của nhiều chỉ số để kiểm soát rủi ro trong việc xác định xu hướng đường ngắn. Bằng cách tối ưu hóa tham số, thiết lập mức dừng lỗ và giới thiệu nhiều nguồn dữ liệu, có thể làm tăng thêm tỷ lệ chiến thắng và lợi nhuận của 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()