Xu hướng MACD theo chiến lược ngắn hạn


Ngày tạo: 2023-12-19 11:16:44 sửa đổi lần cuối: 2023-12-19 11:16:44
sao chép: 0 Số nhấp chuột: 605
1
tập trung vào
1621
Người theo dõi

Xu hướng MACD theo chiến lược ngắn hạn

Tổng quan

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.

Nguyên tắc chiến lược

Các giao dịch chính trong chiến lược này dựa trên:

  1. 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;

  2. 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;

  3. 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.

  4. Kết hợp 3 điều kiện này để xét tuyển.

  5. 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ả.

Lợi thế chiến lược

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ế:

  1. Ba chỉ số xác thực lẫn nhau để giảm khả năng của tín hiệu sai;

  2. EMA đánh giá xu hướng chủ đạo, MACD đánh giá động lực đường ngắn là mạnh;

  3. Chỉ số William đã tránh được những biến động dữ dội.

  4. 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.

Rủi ro chiến lược

Chiến lược này cũng có những rủi ro chính như:

  1. Cấu trúc kết hợp đa chỉ số phức tạp, khó điều chỉnh tham số;

  2. Các hoạt động ngắn gọn thường xuyên và có thể có chi phí giao dịch cao;

  3. 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.

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa từ các khía cạnh sau:

  1. 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;

  2. Thêm thêm các nguồn dữ liệu hỗ trợ, chẳng hạn như số lượng giao dịch;

  3. 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;

  4. 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ự.

Tóm tắt

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.

Mã nguồn 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()