
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 sử dụng chỉ số MACD của hai khung thời gian. Chiến lược này mở nhiều vị trí khi chỉ số MACD tuần tròn hình thành một chiếc gai vàng và đóng cửa khi chỉ số MACD mặt trời hình thành một chiếc gai chết. Khi vị trí trống, nếu chỉ số MACD mặt trời hình thành một lần nữa, bạn có thể mở nhiều vị trí.
Chiến lược giao dịch định lượng MACD kép sử dụng sự kết hợp của chỉ số MACD hàng tuần và chỉ số MACD hàng ngày để đánh giá tín hiệu vào và ra.
Đầu tiên, một tín hiệu mua được tạo ra khi MACD của tuần đi qua đường tín hiệu trên đường MACD, tại thời điểm đó mở thêm vị trí; và sau đó một tín hiệu bán được tạo ra khi MACD của MACD của ngày đi qua đường tín hiệu dưới đường MACD, tại thời điểm đó.
Khi vị trí trống, nếu đường MACD của MACD Nhật Bản đi qua đường tín hiệu một lần nữa, thì vị trí được mở lại nhiều hơn. Nói cách khác, ngã vàng của MACD Nhật Bản trở thành điều kiện để mở lại vị trí.
Cần lưu ý rằng, một cái chết của MACD chỉ số trong ngày sẽ được thanh toán, nhưng nó phải được phép mở lại trong cửa sổ giao dịch giá trị của MACD chỉ số MACD hàng tuần cao hơn đường tín hiệu.
Chiến lược giao dịch định lượng MACD kép kết hợp với phân tích khung thời gian kép, có thể lọc hiệu quả các tín hiệu giả và nâng cao chất lượng tín hiệu. Cụ thể, có một số lợi thế chính sau:
Các khung thời gian hàng tuần giúp đánh giá xu hướng chính và tránh giao dịch ngược.
Các khung thời gian ban ngày sẽ xác định thời gian vào và ra để nắm bắt các cơ hội giao dịch ngắn hạn.
Cơ chế đóng cửa sổ giao dịch forex có thể giúp tránh quá thường xuyên mở và đóng các vị thế vì điều chỉnh ngắn hạn.
Các tham số của chỉ số MACD có thể điều chỉnh, có thể được tối ưu hóa cho các loại khác nhau và môi trường thị trường.
Tích hợp các chức năng dừng, dừng và di chuyển để kiểm soát rủi ro hiệu quả.
Chiến lược giao dịch số lượng MACD kép cũng có một số rủi ro, bao gồm:
Chỉ số MACD dễ tạo ra tín hiệu sai và giao thoa thường xuyên, cần kết hợp các chỉ số khác để xác nhận.
Xu hướng quan trọng trong việc đánh giá khung thời gian tuần tháng có thể bị đảo ngược và cần phải dừng lại kịp thời.
Các thông số cần phải được tối ưu hóa và điều chỉnh liên tục cho các giống và môi trường khác nhau.
Không nên phụ thuộc quá nhiều vào kết quả kiểm tra lại, đĩa cứng có thể khác với kiểm tra lại.
Giải pháp tương ứng:
Nó được sử dụng với các chỉ số khác để xây dựng một hệ thống chiến lược tối ưu hóa logic.
Thiết lập mức dừng lỗ hợp lý để tránh vượt quá mức tổn thất tối đa có thể chịu được.
Luôn luôn tối ưu hóa các tham số, tìm kiếm sự kết hợp tham số tốt nhất.
Bắt đầu với số tiền tối thiểu để chứng minh sự ổn định của chiến lược.
Chiến lược giao dịch số lượng MACD đôi có thể được tối ưu hóa hơn nữa:
Có thể giới thiệu các chỉ số khác như đường Brin, KDJ, xây dựng chiến lược kết hợp nhiều chỉ số, cải thiện chất lượng tín hiệu.
Có thể kết hợp với chỉ số khối lượng giao dịch để tránh đột phá giả mà giá tăng nhưng khối lượng giao dịch không đủ.
Có thể sử dụng phương pháp học máy để tự động tối ưu hóa tham số và thực hiện điều chỉnh động của tham số.
Có thể điều chỉnh rủi ro hơn nữa cho chiến lược, chẳng hạn như thêm các phương pháp dừng lỗ cao như tỷ lệ lợi nhuận / lỗ hổng.
Kiểm tra phù hợp với chiến lược và điều chỉnh tối ưu hóa, tránh các vấn đề quá phù hợp.
Chiến lược giao dịch định lượng MACD kép tích hợp phân tích hai khung thời gian để đánh giá xu hướng chủ yếu và phụ để tận dụng lợi thế của chỉ số riêng của họ. Có rất nhiều không gian để tối ưu hóa chiến lược, có khả năng nâng cao hiệu quả chiến lược hơn nữa bằng cách giới thiệu các chỉ số khác, sử dụng máy học để tối ưu hóa tham số và các phương pháp khác. Xác minh thực tế là một bước bắt buộc và là cơ sở quan trọng để hoàn thiện chiến lược hơn nữa.
/*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)