Tài nguyên đang được tải lên... tải...

Xu hướng MACD sau chiến lược giao dịch dựa trên chỉ số MACD

Tác giả:ChaoZhang, Ngày: 2023-09-27 16:46:38
Tags:

Tổng quan

Chiến lược này xác định hướng xu hướng dựa trên chỉ số MACD và đưa ra các quyết định mua và bán cụ thể bằng chỉ số Stoch.

Chiến lược logic

  1. Đánh giá hướng xu hướng chính bằng chỉ số MACD

    • Tính toán EMA nhanh, EMA chậm và biểu đồ MACD

    • So sánh các biến động MACD trong các chu kỳ khác nhau để xác định xu hướng

  2. Xác định các điểm mua và bán cụ thể bằng chỉ số Stoch

    • Tính toán đường %K và đường %D

    • Sự khác biệt gần khu vực mua quá mức hoặc bán quá mức, với Stoch bật trở lại như tín hiệu giao dịch

  3. Ra quyết định mua và bán dựa trên hướng xu hướng và tín hiệu Stoch

    • Đi dài khi MACD tăng và tín hiệu mua chứng khoán xuất hiện

    • Đi ngắn khi chu kỳ chính MACD giảm và chứng khoán bán tín hiệu xuất hiện

  4. Thiết lập dừng lỗ và lấy lợi nhuận để tối ưu hóa quản lý rủi ro

Phân tích lợi thế

  • Kết hợp các chỉ số theo xu hướng và mua quá mức giúp nắm bắt các xu hướng trung và dài hạn một cách hiệu quả

  • MACD xác định hướng chính trong khi Stoch làm việc chi tiết giao dịch làm giảm rủi ro

  • Sử dụng đầy đủ các kết hợp chỉ số để hình thành các chiến lược có hệ thống

  • Thiết lập stop loss và take profit kiểm soát rủi ro giao dịch

  • Các thông số tối ưu hóa thích nghi với các điều kiện thị trường khác nhau

Phân tích rủi ro

  • Phán quyết xu hướng trung và dài hạn không chính xác có thể dẫn đến tổn thất giao dịch ngược lại

  • Các tín hiệu sai từ Stoch gây ra lợi nhuận hoặc lỗ không đủ

  • Điểm dừng lỗ có thể bị phá vỡ khi xu hướng thay đổi, mở rộng lỗ

  • Mức mục tiêu lợi nhuận không phù hợp ảnh hưởng đến hiệu suất chiến lược

  • Các thông số không hiệu quả và không thích nghi với môi trường thay đổi có thể làm mất hiệu quả chiến lược

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

Hướng dẫn tối ưu hóa

  • Tối ưu hóa hỗn hợp tham số MACD để cải thiện độ chính xác đánh giá xu hướng

  • Xem xét nhiều chu kỳ Stoch để tránh tín hiệu sai

  • Điều chỉnh năng động tỷ lệ dừng lỗ và lấy lợi nhuận để điều chỉnh biến động thị trường

  • Thêm các tín hiệu chỉ số khác để xác minh và cải thiện tính hợp lệ

  • Tối ưu hóa các tham số dựa trên các đặc điểm sản phẩm khác nhau và các phiên giao dịch

  • giới thiệu các mô hình học máy để hỗ trợ đánh giá hướng xu hướng

  • Tích hợp các chỉ số âm lượng để tránh không đủ theo đuổi hoặc theo dõi quá mức

Kết luận

Chiến lược này tích hợp các điểm mạnh của các chỉ số MACD và Stoch để nắm bắt xu hướng trung hạn đến dài hạn trong khi kiểm soát rủi ro. Nó có thể có hiệu quả trong các điều kiện thị trường khác nhau bằng cách tối ưu hóa các thông số, thiết lập dừng lỗ và lấy lợi nhuận, xác minh tín hiệu, v.v. Vẫn còn chỗ để cải thiện bằng cách điều chỉnh thêm các thông số, cải thiện độ chính xác tín hiệu và kết hợp học máy. Chiến lược có thể toàn diện và thông minh hơn.


/*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 ="做空盈利")





Thêm nữa