Chiến lược giao dịch định lượng MACD kép

Tác giả:ChaoZhang, Ngày: 2024-01-30 16:43:29
Tags:

img

Tổng quan

Chiến lược giao dịch định lượng MACD kép là một chiến lược giao dịch định lượng được thực hiện bằng cách sử dụng các chỉ số MACD hai khung thời gian. Nó đi dài khi chỉ số MACD hàng tuần tạo thành một đường chéo vàng và đóng vị trí khi chỉ số MACD hàng ngày tạo thành đường chéo chết. Khi vị trí trống, nếu chỉ số MACD hàng ngày tạo thành một đường chéo vàng khác, một vị trí dài mới có thể được mở.

Chiến lược logic

Chiến lược giao dịch định lượng MACD kép sử dụng sự kết hợp của các chỉ số MACD hàng tuần và MACD hàng ngày để xác định tín hiệu nhập và xuất.

Đầu tiên, khi đường MACD của chỉ số MACD hàng tuần vượt qua trên đường tín hiệu, một tín hiệu mua được tạo ra và một vị trí mua được mở. Sau đó, khi đường MACD của chỉ số MACD hàng ngày vượt qua dưới đường tín hiệu, một tín hiệu bán được tạo ra và vị trí được đóng.

Khi vị trí trống, nếu đường MACD của chỉ số MACD hàng ngày vượt qua trên đường tín hiệu một lần nữa, một vị trí dài mới sẽ được mở lại.

Lưu ý rằng chỉ có đường chéo chết của MACD hàng ngày sẽ đóng vị trí, nhưng mở lại chỉ được phép khi đường MACD của MACD hàng tuần nằm trên đường tín hiệu, trong Khung giao dịch.

Ưu điểm

Chiến lược giao dịch định lượng MACD kép kết hợp phân tích khung thời gian kép, có thể lọc hiệu quả các tín hiệu sai và cải thiện chất lượng tín hiệu.

  1. Khung thời gian hàng tuần đánh giá hướng xu hướng chính, giúp tránh giao dịch ngược lại.

  2. Khung thời gian hàng ngày xác định thời gian vào và ra, có thể nắm bắt kịp thời các cơ hội giao dịch ngắn hạn.

  3. Cơ chế Trading Window có thể tránh việc mở và đóng quá thường xuyên do điều chỉnh ngắn hạn.

  4. Các thông số chỉ số MACD có thể điều chỉnh và có thể được tối ưu hóa theo các giống và điều kiện thị trường khác nhau.

  5. Tích hợp các chức năng lấy lợi nhuận, dừng lỗ, dừng lỗ để kiểm soát rủi ro một cách hiệu quả.

Rủi ro

Chiến lược giao dịch định lượng MACD đôi cũng có một số rủi ro, chủ yếu bao gồm:

  1. Chỉ số MACD có xu hướng tạo ra tín hiệu sai và chéo thường xuyên, cần xác nhận từ các chỉ số khác.

  2. Xu hướng chính được xác định trong khung thời gian hàng tuần / hàng tháng có thể đảo ngược, cần phải dừng lỗ.

  3. Các thông số cần được tối ưu hóa và điều chỉnh liên tục theo giống và điều kiện thị trường.

  4. Không thể phụ thuộc quá nhiều vào kết quả backtest, hiệu suất trực tiếp có thể khác với backtest.

Các giải pháp tương ứng:

  1. Kết hợp với các chỉ số khác để xây dựng các hệ thống chiến lược với tối ưu hóa logic.

  2. Thiết lập stop loss hợp lý để tránh vượt quá mức lỗ tối đa được chấp nhận.

  3. Tiếp tục tối ưu hóa các tham số để tìm kết hợp tối ưu.

  4. Bắt đầu giao dịch trực tiếp từ vốn tối thiểu để xác nhận sự ổn định.

Tối ưu hóa

Chiến lược giao dịch định lượng MACD kép có chỗ cho việc tối ưu hóa thêm:

  1. Đưa ra Bollinger Bands, KDJ và các chỉ số khác để xây dựng các chiến lược kết hợp nhiều chỉ số và cải thiện chất lượng tín hiệu.

  2. Bao gồm các chỉ số khối lượng giao dịch để tránh các vụ phá vỡ sai với khối lượng không đủ.

  3. Sử dụng các phương pháp học máy để tự động tối ưu hóa các thông số và đạt được điều chỉnh năng động.

  4. Điều chỉnh rủi ro hơn nữa của chiến lược, chẳng hạn như thêm các phương pháp dừng lỗ tiên tiến như tỷ lệ lợi nhuận và lỗ.

  5. Chiến lược thử nghiệm khả năng & tối ưu hóa để tránh các vấn đề quá phù hợp.

Kết luận

Chiến lược giao dịch định lượng MACD kép tích hợp phân tích khung thời gian kép để xác định xu hướng chính và phụ và cung cấp đầy đủ các lợi thế của mỗi chỉ số. Vẫn còn tiềm năng lớn cho việc tối ưu hóa chiến lược, và dự kiến sẽ cải thiện hơn nữa hiệu suất chiến lược bằng cách giới thiệu các chỉ số khác, tối ưu hóa tham số tự động thông qua học máy, v.v. Xác minh giao dịch trực tiếp là một bước không thể thiếu và là cơ sở quan trọng để hoàn thiện thêm chiến lược.


/*backtest
start: 2023-01-29 00:00:00
end: 2024-01-11 05:20:00
period: 1d
basePeriod: 1h
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/
// © maxits

// Long Position: Weekly Macd line crosses above Signal line   
// [Trading Window Macd Line > Signal Line] (Weekly)
// Close Position: Daily Macd Line crosses above Daily Signal line.  
// Re Entry Condition: Macd line crosses above Signal line only if [Trading Window MacdLine > Sgnal Line] (Weekly)

//@version=4
strategy("Dual MACD Strategy",
         shorttitle="Dual Macd Tester",
         overlay=false,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0)



// Define user inputs
i_time     = input(defval = timestamp("01 May 2018 13:30 +0000"), title = "Start Time", type = input.time) // Starting  time for Backtesting
f_time     = input(defval = timestamp("9 Sep 2021 13:30 +0000"), title = "Finish Time", type = input.time) // Finishing time for Backtesting

sep1          = input(false, title="------ Profit & Loss ------")

enable_TP     = input(true, title="Enable Just a Profit Level?")
enable_SL     = input(false, title="Enable Just a S.Loss Level?")
enable_TS     = input(true, title=" Enable Only Trailing Stop")
long_TP_Input = input(30.0,   title='Take Profit %',      type=input.float, minval=0)/100
long_SL_Input = input(1.0,   title='Stop Loss %',        type=input.float, minval=0)/100
long_TS_Input = input(5.0,   title='Trailing Stop %',    type=input.float, minval=0)/100
cl_low_Input  = input(low,   title="Trailing Stop Source")
long_TP       = strategy.position_avg_price * (1 + long_TP_Input)
long_SL       = strategy.position_avg_price * (1 - long_SL_Input)
long_TS       = cl_low_Input * (1 - long_TS_Input)

sep2       = input(false, title="------ Macd Properties ------")

d_res      = input(title="Short Term TimeFrame", type=input.resolution, defval="D") // Daily Time Frame
w_res      = input(title="Long Term TimeFrame", type=input.resolution, defval="W")  // Weekly Time Frame
src        = input(close, title="Source")                                           // Indicator Price Source
fast_len   = input(title="Fast Length", type=input.integer, defval=12)              // Fast MA Length
slow_len   = input(title="Slow Length", type=input.integer, defval=26)              // Slow MA Length
sign_len   = input(title="Sign Length", type=input.integer, defval=9)               // Sign MA Length
d_w        = input(title="Daily or Weekly?", type=input.bool, defval=true)          // Plot Daily or Weekly MACD

// Color Plot for Macd

col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350

// BG Color

bg_color = color.rgb(127, 232, 34, 75)

// Daily Macd

[d_macdLine, d_singleLine, d_histLine] = security(syminfo.tickerid, d_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? d_macdLine   : na, color=color.blue)
plot(d_w ? d_singleLine : na, color=color.orange)
plot(d_w ? d_histLine   : na, style=plot.style_columns,
     color=(d_histLine>=0 ? (d_histLine[1] < d_histLine ? col_grow_above : col_fall_above) : 
     (d_histLine[1] < d_histLine ? col_grow_below : col_fall_below)))
    
// Weekly Macd

[w_macdLine, w_singleLine, w_histLine] = security(syminfo.tickerid, w_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? na : w_macdLine,   color=color.blue)
plot(d_w ? na : w_singleLine, color=color.orange)
plot(d_w ? na : w_histLine,   style=plot.style_columns,
     color=(w_histLine>=0 ? (w_histLine[1] < w_histLine ? col_grow_above : col_fall_above) : 
     (w_histLine[1] < w_histLine ? col_grow_below : col_fall_below)))

///////////////////////////////// Entry Conditions
inTrade    = strategy.position_size != 0       // Posición abierta
notInTrade = strategy.position_size == 0       // Posición Cerrada
start_time = true

trading_window = w_macdLine > w_singleLine   // Weekly Macd Signal enables a trading window 
bgcolor(trading_window ? bg_color : na)
buy_cond       = crossover (w_macdLine, w_singleLine)
sell_cond      = crossunder(d_macdLine, d_singleLine)
re_entry_cond  = crossover (d_macdLine, d_singleLine) and trading_window

// Entry Exit Conditions

trailing_stop  = 0.0        // Code for calculating Long Positions Trailing Stop Loss
trailing_stop := if (strategy.position_size != 0)
    stopValue = long_TS
    max(trailing_stop[1], stopValue)
else 
    0

if (buy_cond and notInTrade and start_time)
    strategy.entry(id="First Entry", long=strategy.long, comment="First Long")

if (sell_cond and inTrade)
    strategy.close(id="First Entry", comment="Close First Long")
    
if (re_entry_cond and notInTrade and start_time)
    strategy.entry(id="Further Entry", long=strategy.long, comment="Further Entry")

if (sell_cond and inTrade)
    strategy.close(id="Further Entry", comment="Close First Long")

if enable_TP
    if (enable_TS and not enable_SL)
        strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = trailing_stop)
        strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = trailing_stop)
    else
        if (enable_SL and not enable_TS)
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = long_SL)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP)
else
    if not enable_TP 
        if (enable_TS and not enable_SL)
            strategy.exit("Long TP & TS FiEn", "First Entry",   stop = trailing_stop)
            strategy.exit("Long TP & TS FuEn", "Further Entry", stop = trailing_stop)
        else
            if (enable_SL and not enable_TS)
                strategy.exit("Long TP & TS FiEn", "First Entry",   stop = long_SL)
                strategy.exit("Long TP & TS FuEn", "Further Entry", stop = long_SL)

plot(enable_TP ? long_TP : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(enable_SL ? long_SL : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(enable_TS and trailing_stop ? trailing_stop : na, title="TS Level", color=color.red, style=plot.style_linebr, linewidth=2)


Thêm nữa