Chiến lược giao dịch theo xu hướng dựa trên chỉ báo MACD


Ngày tạo: 2023-09-27 16:46:38 sửa đổi lần cuối: 2023-09-27 16:46:38
sao chép: 1 Số nhấp chuột: 651
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này dựa trên chỉ số MACD để xác định hướng xu hướng và kết hợp với chỉ số Stoch để thực hiện giao dịch mua bán cụ thể. Chiến lược sử dụng MACD có chu kỳ dài để xác định xu hướng lớn và Stoch có chu kỳ ngắn để đưa ra thị trường.

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

  1. Sử dụng chỉ số MACD để đánh giá xu hướng

    • Tính toán đường EMA ngắn, đường chậm và đường MACD

    • So sánh sự thay đổi của MACD trong các giai đoạn khác nhau để đánh giá xu hướng

  2. Sử dụng chỉ số Stoch để xác định điểm mua và bán cụ thể

    • Tính toán % K và % D

    • Stoch xuất hiện ở khu vực bán lẻ bán lẻ và quay trở lại, như là một tín hiệu mua bán

  3. Kết hợp hướng xu hướng và tín hiệu Stoch để thực hiện giao dịch mua và bán

    • Khi MACD chu kỳ lớn tăng lên, Stoch mua tín hiệu xuất hiện, làm nhiều hơn

    • Khi MACD chu kỳ lớn giảm, Stoch bán tín hiệu xuất hiện, tháo lỗ

  4. Thiết lập Stop Loss Stop, tối ưu hóa quản lý tiền

Phân tích lợi thế

  • Chiến lược này kết hợp theo dõi xu hướng và chỉ số bán tháo để có thể nắm bắt hiệu quả xu hướng đường dài và đường trung.

  • MACD định hướng lớn, Stoch chi tiết giao dịch, có thể kiểm soát rủi ro hiệu quả

  • Tận dụng sự kết hợp giữa các chỉ số để hình thành chiến lược chỉ số

  • Thiết lập hệ thống chặn lỗ, quản lý rủi ro giao dịch

  • Các tham số chiến lược có thể được tối ưu hóa cho các môi trường thị trường khác nhau

Phân tích rủi ro

  • Có thể có sự sai lầm trong việc đánh giá xu hướng đường dài và đường trung, dẫn đến thua lỗ trong giao dịch ngược

  • Chỉ số Stoch tạo ra tín hiệu sai khiến lợi nhuận thấp hoặc thua lỗ

  • Khi xu hướng thay đổi, điểm dừng có thể bị phá vỡ, mở rộng tổn thất

  • Mục tiêu lợi nhuận quá lớn hoặc quá nhỏ sẽ ảnh hưởng đến hiệu quả chiến lược

  • Các tham số không phù hợp và không thích ứng với môi trường thị trường thay đổi có thể dẫn đến chiến lược không hiệu quả

  • Có thể giảm rủi ro bằng cách tối ưu hóa phương pháp phán đoán xu hướng, xác nhận tín hiệu Stoch, điều chỉnh vị trí dừng lỗ

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

  • Tối ưu hóa các tham số MACD để đánh giá chính xác các xu hướng

  • Cân nhắc các chỉ số Stoch với nhiều chu kỳ thời gian để tránh tín hiệu giả

  • Động lực điều chỉnh tỷ lệ dừng lỗ để thích ứng với biến động thị trường

  • Verifies kết hợp với các tín hiệu chỉ số khác để tăng hiệu quả tín hiệu

  • Các tham số được tối ưu hóa theo các đặc điểm khác nhau của giống và thời gian giao dịch

  • Thêm các thuật toán học máy để hỗ trợ định hướng xu hướng

  • Chỉ số năng lượng kết hợp, tránh không đủ hoặc quá theo dõi đà giảm

Tóm tắt

Chiến lược này tích hợp lợi thế của hai chỉ số MACD và Stoch để nắm bắt xu hướng đường dài và đường dài trong khi kiểm soát rủi ro. Hiệu quả của chiến lược được tăng cường thông qua các phương thức tối ưu hóa tham số, thiết lập dừng lỗ và xác minh tín hiệu. Nó có thể thích ứng với nhiều môi trường thị trường và có giá trị giao dịch thực tế.

Mã nguồn chiến lược
/*backtest
start: 2023-09-19 00:00:00
end: 2023-09-26 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy(title="自用策略v0.2",calc_on_order_fills=false,calc_on_every_tick =false, initial_capital=10000,commission_type=strategy.commission.percent, commission_value=0.00,overlay = true,default_qty_type = strategy.cash, default_qty_value = 10000)



//STOCH
periodD = input(3, title="%D Smoothing", minval=1)
periodK = input(14, title="%K Length", minval=1)
periodK2 = input(42, title="%K2 Length", minval=1)
periodK3 = input(126, title="%K3 Length", minval=1)
periodK4 = input(378, title="%K4 Length", minval=1)
periodK5 = input(14, title="%K5 Length", minval=1)
periodK6 = input(30, title="%K6 Length", minval=1)
smoothK = input(1, title="%K Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
k2 = sma(stoch(close, high, low, periodK2), smoothK*3)
k3 = sma(stoch(close, high, low, periodK3), smoothK*3*3)
k4 = sma(stoch(close, high, low, periodK4), smoothK*3*3*3)
d = sma(k, periodD)
all = (k+k2*3+k3*9+k4*18)/31
allp = sma(all, periodK6)



buffer = input(title="buffer", type=input.float, defval=0.3, minval = 0, step = 0.1)
b1 = close[1]* (1+buffer/100)
b2 = close[1]* (1-buffer/100)

//MACD
fast_length = input(title="Fast Length", defval=144)
slow_length = input(title="Slow Length", defval=312)

src = input(title="Source", defval=close)
signal_length = input(title="Signal Smoothing",  minval = 1, maxval = 200, defval = 108)
sma_source = input(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
MACDCHA = input(title="MACDCHA步长", defval=30)
MACDCHA2 = input(title="MACDCHA步长2", defval=20)
MACDCHA3 = input(title="MACDCHA步长3", defval=10)
MACDCHA4 = input(title="MACDCHA步长4", defval=5)
MACDCHA5 = input(title="MACDCHA步长5", defval=3)
MACDCHA6 = input(title="MACDCHA步长6", defval=1)
HISTCHA = input(title="hist步长", defval=50)
macdcha = hist - hist[MACDCHA]
macdcha2 = hist - hist[MACDCHA2]
macdcha3 = hist - hist[MACDCHA3]
macdcha4 = hist - hist[MACDCHA4]
macdcha5 = hist - hist[MACDCHA5]
macdcha6 = hist - hist[MACDCHA6]
histcha = hist[HISTCHA]
var true2 = 0
var true2_1 = 0
var true2_2 = 0
var true2_3 = 0
var true2_4 = 0//延伸
var fangxiang =0
//确认方向
if(macdcha>=0 and macdcha2>=0 and macdcha3>=0 and macdcha4>=0 and macdcha5>=0 and macdcha6>=0)
    fangxiang := 1
    true2_2 := 0
if(macdcha<=0 and macdcha2<=0 and macdcha3<=0 and macdcha4<=0 and macdcha5<=0 and macdcha6<=0)
    fangxiang :=-1
    true2_1 := 1
//k3min = min(k3,k3[1],k3[2],k3[3],k3[4],k3[5],k3[6],k3[7],k3[8],k3[9],k3[10],k3[11],k3[12],k3[13],k3[14],k3[15],k3[16],k3[17],k3[18],k3[19],k3[20],k3[21],k3[22],k3[23],k3[24],k3[25],k3[26],k3[27],k3[28],k3[29],k3[30],k3[31],k3[32],k3[33],k3[34],k3[35],k3[36],k3[37],k3[38],k3[39],k3[40],k3[41],k3[42],k3[43],k3[44],k3[45],k3[46],k3[47],k3[48],k3[49],k3[50])
//k3max = max(k3,k3[1],k3[2],k3[3],k3[4],k3[5],k3[6],k3[7],k3[8],k3[9],k3[10],k3[11],k3[12],k3[13],k3[14],k3[15],k3[16],k3[17],k3[18],k3[19],k3[20],k3[21],k3[22],k3[23],k3[24],k3[25],k3[26],k3[27],k3[28],k3[29],k3[30],k3[31],k3[32],k3[33],k3[34],k3[35],k3[36],k3[37],k3[38],k3[39],k3[40],k3[41],k3[42],k3[43],k3[44],k3[45],k3[46],k3[47],k3[48],k3[49],k3[50])
allpmax = max(allp[1],allp[2],allp[3],allp[4],allp[5],allp[6])
allpmin = min(allp[1],allp[2],allp[3],allp[4],allp[5],allp[6])
if(histcha < 0 and macdcha>=0 and macdcha2>=0 and macdcha3>=0 and macdcha4>=0 and macdcha5>=0 and macdcha6>=0 and d < 20 and volume > volume[1] and true2_1 == 1 and allp>allp[1] and allp <80)//and k3max < 80  //and k3min < 30 and k3 >20 and k2<50
    strategy.entry("开多", true, comment = "开多") // and close > close[1] and cci1> MEA1
    true2_1 :=0
if(d >80)
    strategy.close( "开多", comment = "平多")
    true2_1 :=1

stop_loss=input(4, "做多止损 %", minval = 1, step = 1)
sl = strategy.position_avg_price * (1-stop_loss/100)
close_Stop = close < sl
if(close_Stop or(allp<20 and allp[1]>20))
    strategy.close( "开多", comment = "做多止损")
    true2_1 :=1
Target_profit=input(10, "做多止盈 %", minval = 1, step = 1)
tp = strategy.position_avg_price * (1+Target_profit/100)
close_Target = close > tp
strategy.close("开多", when = close_Target, comment ="做多盈利")


//空
if(histcha > 0 and macdcha<=0 and macdcha2<=0 and macdcha3<=0 and macdcha4<=0 and macdcha5<=0 and macdcha6<=0 and d > 80 and volume > volume[1] and true2_2 == 1 and allp<allp[1] and allp >20) // and k3max>70 and k3<80
    //strategy.entry("开空", comment = "开空") 
    strategy.entry("开空", strategy.short,comment ="开空")
    true2_2 := 0
if( d <20)
   // strategy.close(  comment = "平空")
    strategy.close("开空",  comment = "平空")
    true2_2 := 1

stop_loss2=input(4, "做空止损 %", minval = 1, step = 1)
sl2 = strategy.position_avg_price * (1+stop_loss2/100)
close_Stop2 = close > sl2
if(close_Stop2 or(allp>80 and allp[1]<80))
    strategy.close( "开空", comment = "做空止损")
    true2_2 == 1
Target_profit2=input(10, "做空止盈 %", minval = 1, step = 1)
tp2 = strategy.position_avg_price * (1-Target_profit2/100)
close_Target2 = close < tp2
strategy.close("开空", when = close_Target2, comment ="做空盈利")