Chiến lược phân kỳ xu hướng theo nến Pythagoras của chỉ báo MACD


Ngày tạo: 2024-02-04 15:06:58 sửa đổi lần cuối: 2024-02-04 15:06:58
sao chép: 0 Số nhấp chuột: 745
1
tập trung vào
1617
Người theo dõi

Chiến lược phân kỳ xu hướng theo nến Pythagoras của chỉ báo MACD

Tổng quan

Chiến lược này tạo ra tín hiệu giao dịch bằng cách tính toán MACD và đường cột MACD của nó, để phát hiện tín hiệu sai lệch giữa đường cột MACD và xu hướng giá. Khi giá được phát hiện cao nhưng đường cột MACD không tạo ra một mức cao mới, tạo ra tín hiệu sai lệch giảm; khi giá được phát hiện thấp nhưng đường cột MACD không tạo ra mức thấp mới, tạo ra tín hiệu sai lệch giảm.

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

Nguyên tắc cốt lõi của chiến lược này là sử dụng các chỉ số MACD và các đặc tính của đường cột MACD để phản ánh sự thay đổi của xu hướng giá, để phát hiện các tín hiệu sai lệch giữa đường cột MACD và giá, làm điều kiện kích hoạt tín hiệu giao dịch.

Cụ thể, chiến lược này tính toán đường MACD, đường tín hiệu và đường MACD cột. Sau đó, bằng cách xác định hàm fractal, kiểm tra đỉnh và thung lũng của đường cột MACD, trích xuất các giá trị cực lớn và cực nhỏ.

Khi giá tạo ra một mức cao mới, nhưng đường MACD không tạo ra một mức cao mới, tạo ra tín hiệu regulark_bearish_div giảm đi; khi giá tạo ra mức thấp mới, nhưng đường MACD không tạo ra mức thấp mới, tạo ra tín hiệu regulark_bullish_div giảm đi.

Cuối cùng, chiến lược sẽ ra lệnh tháo dỡ và tháo dỡ lần lượt khi có tín hiệu tháo dỡ và tháo dỡ, và rút khỏi vị trí bằng ATR dừng lỗ, dừng lỗ.

Phân tích lợi thế

Chiến lược này có một số lợi thế:

  1. Sử dụng các đặc điểm của sự phân cách giữa đường MACD và giá, có thể bắt được sự thay đổi của xu hướng giá trước.

  2. ATR Stop Loss Stop được thiết lập hợp lý, có thể kiểm soát hiệu quả tổn thất tối đa của một giao dịch.

  3. Sử dụng phương pháp theo dõi xu hướng, bạn có thể giữ lợi nhuận tối đa.

  4. Cài đặt tham số hợp lý, có thể lọc một số tín hiệu giao dịch ồn.

  5. Lập luận chiến lược rõ ràng, dễ hiểu và dễ xác minh trên thực tế.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Nếu MACD lệch không nhất thiết phải dẫn đến sự đảo ngược giá, có một số rủi ro về tín hiệu giả.

  2. Thiết lập chặn lỗ không hợp lý có thể dẫn đến tổn thất quá lớn hoặc lợi nhuận quá nhỏ.

  3. Trở ra từ chu kỳ tín hiệu ngắn, có thể là do tiếng ồn, nên được lọc thích hợp.

  4. Các biến thể giao dịch và cài đặt tham số không phù hợp cũng ảnh hưởng đến hiệu quả của chiến lược.

Giải pháp tương ứng:

  1. Tăng kích thước phù hợp và độ rộng khác với yêu cầu, lọc tín hiệu giả.

  2. Sử dụng ATR làm chỉ số dừng lỗ và điều chỉnh ATR để kiểm soát rủi ro giao dịch đơn lẻ.

  3. Lựa chọn các tham số khác nhau cho các loại giao dịch khác nhau. Tối ưu hóa tham số để tìm ra sự kết hợp tham số tốt nhất.

Hướng tối ưu hóa

Chiến lược này cũng có thể được tối ưu hóa theo các hướng sau:

  1. Một xác nhận lệch lạc phức tạp hơn, chẳng hạn như xác nhận lệch lạc của Volume.

  2. Tối ưu hóa các tham số MACD, tìm kiếm sự kết hợp tốt nhất.

  3. Tối ưu hóa ATR Stop Loss Stop multiplier

  4. Thêm các thuật toán học máy để hỗ trợ đánh giá độ tin cậy của tín hiệu.

  5. Tăng khả năng dự đoán mô hình, xác định khả năng biến đổi giá.

  6. Điều chỉnh động các tham số chiến lược theo môi trường thị trường thay đổi.

Tóm tắt

Nhìn chung, BIDDAGO vẽ MACD chỉ số lệch khỏi chiến lược theo dõi xu hướng, sử dụng các đặc điểm lệch giữa đường cột MACD và giá, để thực hiện xu hướng. Thiết lập ATR Stop Loss là hợp lý, có thể kiểm soát rủi ro giao dịch đơn lẻ.

Mã nguồn chiến lược
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bigwin_sun
// copyright: Tradingvue Limited    

//@version = 5
strategy(title = "Demigod : CDMA histogram Divergence strategy", shorttitle = "Demigod strategy", overlay = false, pyramiding = 100)

//macd input
fastMA = input.int(13, title = "fast Length", minval = 1,     group = "CDMA")
slowMA = input.int(34, title = "slow Length", minval = 1,     group = "CDMA")
src          = input.source(title = "source", defval = close, group = "CDMA")
signalSmooth = input.int(9, title="ma Length", minval = 1,    group = "CDMA")
//Divergenc
divLength    = input.int(title = "Divergenc Length",   defval = 5, minval = 1,   maxval = 50,  inline = "ATRLength",  group = "Divergence")
divStren     = input.float(title="Divergenc Strength", defval = 2, minval = 1.0, maxval = 5.0, inline = "ATRLength",  group = "Divergence")

//atr input
atrLength = input.int(13, title = "ATR Length", minval = 1,   inline = "ATRLength", group = "ATR")
m         = input.float(1.0,  "ATR multyple",   minval = 0.5, inline = "ATRLength", group = "ATR", step = 0.5)
collong   = input.color(color.teal, title = "upper color",  inline = "ATR显示", group = "ATR")
colshort  = input.color(color.red,  title = "under color",  inline = "ATR显示", group = "ATR")

// MACD---------------------------------------------------------------------------------------------------------------------------------
DivOffset = -2
macdLine   = ta.ema(src, fastMA) - ta.ema(src, slowMA)    
signalLine = ta.ema(macdLine, signalSmooth)
histogram  = macdLine - signalLine

histogramColor = if histogram > 0
    histogram > histogram[1] ? color.lime : color.green
else 
    histogram < histogram[1] ? color.maroon : color.red

// cdma histogram
plot(histogram, title = "MACD histogram", linewidth = 2, style = plot.style_histogram, color = histogramColor)
plot(0,         title = "zero line",      linewidth = 1,                               color = color.gray)

// Divergenc calculation-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//peak / valley fundation
f_top_fractal(_src)=>_src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0] and _src > 0
f_bot_fractal(_src)=>_src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0] and _src < 0
f_fractalize(_src)=>f_top_fractal(_src) ? 1 : f_bot_fractal(_src) ? -1 : 0

//peak / valley value
fractal_top1 = f_fractalize(histogram) > 0 ? true : false //histogram[2] : na
fractal_bot1 = f_fractalize(histogram) < 0 ? true : false //histogram[2] : na

//previouse peak or valley
high_prev1  = ta.valuewhen(fractal_top1, histogram[2], 0)[2]
high_price1 = ta.valuewhen(fractal_top1, high[2], 0)[2]
low_prev1   = ta.valuewhen(fractal_bot1, histogram[2], 0)[2]
low_price1  = ta.valuewhen(fractal_bot1, low[2], 0)[2]

//Divergenc : cdma histogram against candle value
regular_bearish_div1 = high[2] > high_price1 + divStren and histogram[2] < high_prev1 / divStren and ta.barssince(fractal_top1[1]) > divLength
regular_bullish_div1 = low[2]  < low_price1 - divStren  and histogram[2] > low_prev1 / divStren  and ta.barssince(fractal_bot1[1]) > divLength

//-------------------------cdma Divergenc range------------------------------------------------
//histogramColor
col1 = regular_bearish_div1 ? color.red : na
col2 = regular_bullish_div1 ? #00FF00EB : na
//plot
plot(title='看跌背离', series= fractal_top1 ? histogram[2] : na, color=col1, linewidth=3, offset=DivOffset)
plot(title='看涨背离', series= fractal_bot1 ? histogram[2] : na, color=col2, linewidth=3, offset=DivOffset)

// calculate ATR				--------------------------------------------------------------------------------------------------------------------------------------------------
atr = ta.ema(ta.tr(true), atrLength) * m
up = atr + high
dw = low - atr

//stratety : enrty and exit---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if regular_bearish_div1 and fractal_top1
//if regular_bullish_div1 and fractal_bot1
    //label.new(bar_index, histogram[2], text = "Short", textcolor = color.white, color = color.gray,  style = label.style_label_lower_left)
    strategy.entry("Short", strategy.short, qty = 1)
    strategy.exit("exitShort", "Short", stop = up, limit = dw - atr)
if regular_bullish_div1 and fractal_bot1
//if regular_bearish_div1 and fractal_top1   
    //label.new(bar_index, histogram[2], text = "Long", textcolor = color.white, color = color.fuchsia, style = label.style_label_upper_left)
	strategy.entry("Long", strategy.long, qty = 1)
    strategy.exit("exitLong", "Long", stop = dw, limit = up + atr)