
Chiến lược này tổng hợp các tín hiệu ngã ba vàng của chỉ số MACD, mối quan hệ giữa giá đóng cửa đường K và đường trung bình, đặc điểm biến động giá để đánh giá thời gian vào và ra, đồng thời thiết lập cơ chế nhập lại và sửa đổi nhập cảnh để kiểm soát rủi ro đồng thời đạt được nhiều cơ hội giao dịch hơn và đạt được lợi nhuận ổn định.
Chiến lược này dựa trên các nguyên tắc sau:
Sử dụng phân tích MACD của đường nhanh và đường chậm để đánh giá thị trường nhiều đầu và trống, và điểm vào cụ thể.
Sử dụng mối quan hệ giữa giá đóng cửa K và đường trung tâm để đánh giá liệu xu hướng đa không có kết thúc hay không, và điểm khởi đầu.
Thiết lập cơ chế tái gia nhập để tăng cơ hội kiếm tiền nếu MACD tiếp tục phù hợp với xu hướng sau khi kết thúc đợt này.
Thiết lập một cơ chế sửa đổi nhập cảnh, nếu giá có điều chỉnh một phần nhưng chưa đảo ngược, sẽ thêm vị trí, điều chỉnh trong xu hướng.
Tích hợp các điểm trên, động điều chỉnh vị trí, thu được nhiều lợi nhuận nhất có thể trong xu hướng và thoát khỏi xu hướng khi xu hướng kết thúc.
Cụ thể, chiến lược đầu tiên đánh giá liệu dòng MACD nhanh và chậm có xảy ra hiện tượng gai vàng hoặc gai chết, nếu gai vàng thì làm nhiều, nếu gai chết thì làm trống; sau đó đánh giá liệu dòng K có chạm vào đường trung tâm, nếu chạm sẽ được đánh giá là kết thúc xu hướng và thanh toán.
Ngoài ra, chiến lược cũng thiết lập cơ chế re-entry, tức là sau khi xu hướng của hướng ban đầu kết thúc, nếu MACD tiếp tục hiển thị tín hiệu theo cùng hướng, chiến lược sẽ mở vị trí theo dõi xu hướng một lần nữa; đồng thời cũng thiết lập cơ chế sửa đổi vào, nếu giá có điều chỉnh nhỏ nhưng chưa đảo ngược hoàn toàn, chiến lược sẽ tăng vị trí thích hợp, đây là hành vi điều chỉnh bình thường trong xu hướng.
Với các thiết lập này, chiến lược có thể điều chỉnh vị trí theo xu hướng, có nhiều lần ra vào và thu được lợi nhuận cao hơn với điều kiện kiểm soát rủi ro.
Chiến lược tổng hợp này sử dụng nhiều chỉ số và có những ưu điểm chính như sau:
MACD có thể nhận ra xu hướng và điểm đảo ngược, xác định điểm vào cụ thể.
Kết thúc của xu hướng có thể được xác định chính xác bằng cách xác định mối quan hệ giữa giá đóng cửa và đường trung bình.
Cơ chế tái nhập cảnh đã tăng số lần mở cửa và tăng hiệu quả sử dụng vốn.
Các cơ chế nhập cảnh được sửa đổi để có thể nắm bắt được các xu hướng.
Tỷ lệ chiến lược hoạt động cao nhưng rủi ro có thể kiểm soát được, dễ dàng nhận được các yếu tố lợi nhuận cao hơn.
Các tham số có thể được điều chỉnh và có thể được tối ưu hóa cho các giống và trường hợp khác nhau.
Chiến lược của nó rất rõ ràng, dễ hiểu, mã viết ngắn gọn, và hoạt động trên ổ đĩa rất dễ dàng.
Dữ liệu phản hồi đầy đủ, độ tin cậy cao, hiệu quả trên đĩa đơn dễ xác minh.
Chiến lược này cũng có những rủi ro chính như:
MACD có khả năng phát ra tín hiệu sai, cần kết hợp các chỉ số khác để xác minh.
Các thiết lập dừng lỗ ở cấp độ lớn quá nhỏ có thể bị chấn động bởi các biến động lớn.
Việc gia tăng tần suất hoạt động nhập cảnh và sửa đổi nhập cảnh, cần kiểm soát tỷ lệ sử dụng vốn.
Việc điều chỉnh nhập cảnh trong thời gian hồi phục có thể dẫn đến tổn thất lớn.
Các biến thể giao dịch và các thiết lập tham số cần được tối ưu hóa và không áp dụng cho tất cả các biến thể.
Cần phải liên tục đánh giá và tối ưu hóa, điều chỉnh các tham số theo thị trường.
Trong trường hợp này, bạn cần phải tính đến chi phí của điểm trượt.
Các biện pháp quản lý rủi ro đối phó bao gồm: thiết lập điểm dừng để đảm bảo hạn chế tổn thất đơn lẻ; đánh giá tỷ lệ sử dụng vốn, duy trì dự trữ tiền mặt hợp lý; kiểm tra lại các tham số phù hợp cho lựa chọn giống; liên tục chú ý đến sự thay đổi của đặc điểm thị trường để tối ưu hóa các tham số; xem xét tác động của chi phí trượt trong kiểm tra lại và mô phỏng.
Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:
Kết hợp các chỉ số khác để xác nhận tín hiệu, tăng độ chính xác tín hiệu. Như chỉ số KDJ.
Thiết lập các tiêu chuẩn tự điều chỉnh động để ngăn chặn thiệt hại.
Tối ưu hóa và điều chỉnh logic điều kiện nhập học.
Các tham số phân giống được tối ưu hóa, thiết lập các tham số tối ưu nhất.
Tối ưu hóa tỷ lệ sử dụng vốn, thiết lập giới hạn tiền cho việc nhập học trở lại và sửa đổi.
Chỉ số tích hợp năng lượng, tránh thua lỗ theo dõi trong thời gian phục hồi.
Thêm cơ chế ra sân, chẳng hạn như thiết lập dừng di chuyển.
Cân nhắc việc đóng gói chiến lược thành một robot giao dịch để thực hiện giao dịch tự động.
Thêm các yếu tố cân nhắc của ổ cứng, chẳng hạn như chi phí điểm trượt.
Thông qua những cải tiến này, chúng ta có thể nâng cao hơn nữa tính ổn định, khả năng thích ứng, mức độ tự động hóa và hiệu quả thực tế của chiến lược.
Chiến lược này tích hợp tín hiệu giao dịch sử dụng chỉ số MACD, phân tích giá đóng cửa K và cơ chế nhập cảnh nhiều lần, kiểm soát rủi ro trong khi nắm bắt xu hướng, là một chiến lược chiến lược giao dịch định lượng hiệu quả cao. Chiến lược này có lợi thế như tần suất hoạt động cao, sử dụng vốn tốt và khó thực hiện, nhưng cũng cần chú ý đến kiểm soát rủi ro và tối ưu hóa chiến lược, có giá trị thực tế và mở rộng rất mạnh.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
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/
// © Puckapao
//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)
// Get date
startDate = input(title="Start Date", type=input.integer,
defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
defval=2017, minval=1800, maxval=2100)
endDate = input(title="End Date", type=input.integer,
defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
defval=2021, minval=1800, maxval=2100)
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true
reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])
sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])
close_cnt = 0
close_cnt := nz(close_cnt[1])
on_long = false
on_long := nz(on_long[1])
on_short = false
on_short := nz(on_short[1])
sculp = false
reenter = false
slowdown = false
ema = ema(close, ema_period)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)
cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)
if (inDateRange)
over_macd = macd > 0 and signal > 0 ? true : false
under_macd = macd < 0 and signal < 0 ? true : false
over_water = close > ema ? true : false
under_water = close < ema ? true : false
slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
if(reenter == true)
if(reenter_cnt < reenter_delay)
reenter_cnt := reenter_cnt + 1
else
if(reenter_cnt > 0)
reenter_cnt := reenter_cnt - 1
if(sculp == true)
if(sculp_cnt < sculp_delay)
sculp_cnt := sculp_cnt + 1
else
if(sculp_cnt > 0)
sculp_cnt := sculp_cnt - 1
if(slowdown == false)
if(close_cnt < 2)
close_cnt := close_cnt + 1
else
close_cnt := 0
// plotchar(fork_cnt, "fork count", "")
// plotchar(spoon_cnt, "spoon count", "")
// Entry
if (cross_up == true)
strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
on_long := true
on_short := false
if (cross_down == true)
strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
on_short := true
on_long := false
// Sculp bottom / top
if (sculp == true and sculp_cnt >= sculp_delay)
if (hist >= 0)
strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
else
strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
sculp_cnt := 0
sculp := false
// Re-Entry
if (reenter == true and reenter_cnt >= reenter_delay)
if (hist >= 0)
strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
else
strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
reenter_cnt := 0
reenter := false
// Close
strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
if (slowdown)
if (hist >= 0)
on_long := false
else
on_short := false
plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")