Chiến lược đảo ngược định lượng dựa trên MFI và MA

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

img

Tổng quan

Chiến lược này sử dụng chỉ số MFI để xác định các khu vực mua quá mức và bán quá mức kết hợp với MA để lọc hướng đảo ngược giá.

Chiến lược logic

Chiến lược này sử dụng chỉ số MFI để đánh giá các điều kiện mua quá mức và bán quá mức trên thị trường. Khi MFI giảm xuống dưới 20 vào vùng bán quá mức, nó báo hiệu rằng tài sản được định giá thấp và đáy đang hình thành, ngụ ý một tín hiệu dài. Khi MFI tăng trên 80 vào khu vực mua quá mức, nó cho thấy tài sản được định giá quá mức và có thể sẽ sớm điều chỉnh thấp hơn, kích hoạt tín hiệu ngắn.

Để tránh đảo ngược sai, chiến lược cũng sử dụng chỉ số MA để xác định hướng xu hướng.

Logic giao dịch cụ thể là:

  1. Khi MFI phá vỡ dưới 20 vào khu vực bán quá mức và đóng cửa đứng trên đường MA, một tín hiệu mua được tạo ra.

  2. Khi MFI vượt qua mức 80 vào vùng mua quá mức và kết thúc vượt qua đường MA, một tín hiệu bán được kích hoạt.

Với xác nhận hai chỉ số, chiến lược có thể xác định hiệu quả các cơ hội đảo ngược với các tín hiệu nhập cảnh đáng tin cậy.

Ưu điểm

  1. Xác nhận hai chỉ số tránh sự đột phá sai và đảm bảo độ tin cậy tín hiệu cao.

  2. Sử dụng các bước đảo ngược mua quá mức / bán quá mức là một kỹ thuật giao dịch cổ điển và đã được thử nghiệm trong thời gian.

  3. Kết hợp lọc xu hướng làm cho tín hiệu chính xác và đáng tin cậy hơn.

  4. Áp dụng trên nhiều thị trường khác nhau với khả năng thích nghi mạnh mẽ.

Rủi ro

  1. Thị trường có thể có xu hướng tăng hoặc giảm liên tục dẫn đến dừng lỗ.

  2. Cần phải cảnh giác với những rủi ro có hệ thống trong điều kiện thị trường cực đoan gây ra các điểm đảo ngược bị bỏ lỡ.

  3. Tần suất giao dịch cao có thể dẫn đến chi phí giao dịch tăng lên.

Hạn chế:

  1. Cho phép dừng lỗ rộng hơn để cho chiến lược nhiều không gian hơn.

  2. Tăng kích thước vị trí một cách thận trọng trong khi xem các biểu đồ khung thời gian cao hơn cho các tín hiệu rủi ro hệ thống.

  3. Tối ưu hóa các thông số để tránh giao dịch không cần thiết.

Cơ hội gia tăng

  1. Tối ưu hóa các thông số MA để phù hợp với các đặc điểm của công cụ giao dịch.

  2. Điều chỉnh mức mua quá mức / bán quá mức dựa trên tinh thần thị trường thay đổi.

  3. Bao gồm các quy tắc kích thước vị trí để kiểm soát lợi nhuận nhiều hơn.

Kết luận

Chiến lược này tích hợp các kỹ thuật phân tích cổ điển với các phương pháp lượng tử hiện đại.


/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 00:00:00
period: 1m
basePeriod: 1m
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]Thor for MFI", 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=1) * 0.01

shortProfitPerc = input(title="Short Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=1) * 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=0.5) * 0.01

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

i_MFI = input(3, title="MFI Length")
OB=input(100, title="Overbought Level")
OS=input(0, title="Oversold Level")
barsizeThreshold=input(.5, step=.05, minval=.1, maxval=1, title="Bar Body Size, 1=No Wicks")
i_MAFilter = input(true, title="Use MA Trend Filter")
i_MALen = input(80, title="MA Length")
// ********** 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 = true

// Trade only if intraday session is active

//=================Strategy logic goes in here===========================
 

MFI=mfi(close,i_MFI)
barsize=high-low
barbodysize=close>open?(open-close)*-1:(open-close)
shortwicksbar=barbodysize>barsize*barsizeThreshold
SMA=sma(close, i_MALen)
MAFilter=close > SMA



BUY = MFI[1] == OB and close > open and shortwicksbar and (i_MAFilter ? MAFilter : true)

SELL = MFI[1] == OS and close < open and shortwicksbar and (i_MAFilter ? not MAFilter : true) 

//Final Long/Short Condition
longCondition = BUY
shortCondition = SELL
 
//Long Strategy - buy condition and exits with Take profit and SL
if (longCondition and intradaySession)
    stop_level = longStopPrice
    profit_level = longExitPrice
    strategy.entry("Buy", strategy.long)
    strategy.exit("TP/SL", "Buy", 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("Sell", strategy.short)
    strategy.exit("TP/SL", "Sell", 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