Chiến lược giao dịch định lượng nhiều khung thời gian dựa trên PSAR, MACD và RSI

Tác giả:ChaoZhang, Ngày: 2023-12-27 16:12:57
Tags:

img

Tổng quan

Chiến lược này kết hợp các chỉ số Parabolic SAR, MACD và RSI để thực hiện giao dịch dài và ngắn tự động trên nhiều khung thời gian.

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

  1. Chỉ số PSAR được sử dụng để xác định hướng giá và các điểm đảo ngược xu hướng.

  2. Chỉ số MACD đánh giá đà tăng giá. Đường MACD vượt trên đường SIGNAL lên là tín hiệu tăng trong khi vượt xuống là giảm.

  3. Chỉ số RSI đánh giá các điều kiện mua quá mức và bán quá mức.

  4. Kết hợp các tín hiệu từ ba chỉ số trên để tạo ra quyết định dài / ngắn cuối cùng.

  5. Sử dụng chỉ số Chop Index để lọc các thị trường hợp nhất để tránh chém.

  6. Sử dụng kích thước vị trí kim tự tháp ngược để quản lý năng động các mục tiêu rủi ro và lợi nhuận.

Ưu điểm

  1. Sự kết hợp của nhiều chỉ số đánh giá xu hướng, động lực và dao động cải thiện độ chính xác.

  2. Điều chỉnh các điều kiện thị trường bằng cách lọc các thị trường hợp nhất để tránh bị mắc kẹt trong bẫy.

  3. Quản lý rủi ro và lợi nhuận năng động thông qua định dạng vị trí kim tự tháp ngược với các điểm dừng và giới hạn thích nghi.

  4. Có thể tùy chỉnh cao với các tham số có thể điều chỉnh cho các sản phẩm và môi trường thị trường khác nhau.

  5. Hỗ trợ nhiều khung thời gian, linh hoạt cho các giao dịch vị trí ngắn hạn trong ngày hoặc trung hạn / dài hạn.

Phân tích rủi ro

  1. Các quyết định dài / ngắn phụ thuộc vào cài đặt tham số có thể gây ra lỗi nếu không phù hợp.

  2. Khả năng tín hiệu sai dẫn đến các quyết định chống lại xu hướng.

  3. Các thiết lập dừng lỗ và lấy lợi nhuận không phù hợp có thể làm tăng lỗ hoặc giảm lợi nhuận.

  4. Cần giám sát thường xuyên và điều chỉnh các thông số dẫn đến chi phí can thiệp của con người cao.

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

  1. Thêm mô-đun xác nhận mô hình để đánh giá các thiết lập tham số và hiệu quả tín hiệu.

  2. Tăng mô-đun học máy để tối ưu hóa tham số và mô hình tự động.

  3. Nạp nhiều nguồn dữ liệu hơn để làm phong phú không gian tính năng và cải thiện quyết định.

  4. Phát triển các hệ thống giám sát và bảo trì tự động để giảm can thiệp của con người.

  5. Thêm backtesting và đánh giá mô phỏng để xác nhận hiệu suất chiến lược.

Kết luận

Chiến lược này thực hiện giao dịch định lượng tự động bằng cách kết hợp nhiều chỉ số kỹ thuật hệ thống dựa trên quy tắc. Với không gian tối ưu hóa lớn và tính linh hoạt, nó phù hợp với điều chỉnh tham số, mở rộng tính năng và cải tiến học máy để phục vụ tốt hơn giao dịch trực tiếp.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00: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/
// © vikris

//@version=4
strategy("[VJ]Phoenix Force of PSAR +MACD +RSI", overlay=true, calc_on_every_tick = false,pyramiding=0)

// ********** Strategy inputs - Start **********

// Used for intraday handling
// Session value should be from market start to the time you want to square-off 
// your intraday strategy
// Important: The end time should be at least 2 minutes before the intraday
// square-off time set by your broker
var i_marketSession = input(title="Market session", type=input.session, 
     defval="0915-1455", confirm=true)

// Make inputs that set the take profit % (optional)
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01

shortProfitPerc = input(title="Short Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
     
// Set stop loss level with input options (optional)
longLossPerc = input(title="Long Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01

shortLossPerc = input(title="Short Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01    


// ********** Strategy inputs - End **********


// ********** Supporting functions - Start **********

// A function to check whether the bar or period is in intraday session
barInSession(sess) => time(timeframe.period, sess) != 0



// Figure out take profit price
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Determine stop loss price
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


// ********** Supporting functions - End **********


// ********** Strategy - Start **********
// See if intraday session is active
bool intradaySession = barInSession(i_marketSession)

// Trade only if intraday session is active

//=================Strategy logic goes in here===========================
 
psar = sar(0.02,0.02,0.2)
c1a = close > psar
c1v = close < psar

malen = input(50, title="MA Length")
mm200 = sma(close, malen)
c2a = close > mm200
c2v = close < mm200

fast = input(12, title="MACD Fast EMA Length")
slow = input(26, title="MACD Slow EMA Length")
[macd,signal,hist] = macd(close, fast,slow, 9)
c3a = macd >= 0
c3v = macd <= 0

rsilen = input(7, title="RSI Length")
th = input(50, title="RSI Threshold")
rsi14 = rsi(close, rsilen)
c4a = rsi14 >= th
c4v = rsi14 <= th

chopi = input(7, title="Chop Index lenght")
ci = 100 * log10(sum(atr(1), chopi) / (highest(chopi) - lowest(chopi))) / log10(chopi)

buy = c1a and c2a and c3a and c4a ? 1 : 0
sell = c1v and c2v and c3v and c4v ? -1 : 0


//Final Long/Short Condition
longCondition = buy==1 and ci <50
shortCondition = sell==-1 and ci <50 
 
//Long Strategy - buy condition and exits with Take profit and SL
if (longCondition and intradaySession)
    stop_level = longStopPrice
    profit_level = longExitPrice
    strategy.entry("My Long Entry Id", strategy.long)
    strategy.exit("TP/SL", "My Long Entry Id", stop=stop_level, limit=profit_level)


//Short Strategy - sell condition and exits with Take profit and SL
if (shortCondition and intradaySession)
    stop_level = shortStopPrice
    profit_level = shortExitPrice
    strategy.entry("My Short Entry Id", strategy.short)
    strategy.exit("TP/SL", "My Short Entry Id", stop=stop_level, limit=profit_level)
 
 
// Square-off position (when session is over and position is open)
squareOff = (not intradaySession) and (strategy.position_size != 0)
strategy.close_all(when = squareOff, comment = "Square-off")

// ********** Strategy - End **********

Thêm nữa