Chiến lược giao dịch chéo QQE nhanh dựa trên bộ lọc xu hướng

Tác giả:ChaoZhang, Ngày: 2024-01-25 11:34:58
Tags:

img

Tổng quan

Chiến lược giao dịch chéo QQE nhanh dựa trên bộ lọc xu hướng là một chiến lược giao dịch theo xu hướng sử dụng các chéo QQE nhanh với Mức trung bình động để lọc hướng xu hướng. QQE hoặc Đánh giá định lượng chất lượng dựa trên chỉ số sức mạnh tương đối nhưng sử dụng kỹ thuật làm mịn như một chuyển đổi bổ sung. Ba chéo có thể được chọn (tất cả được chọn theo mặc định):

  • Tín hiệu RSI vượt qua ZERO (XZERO)
  • Dấu hiệu RSI vượt qua đường RSIatr nhanh (XQQE)
  • Dấu hiệu RSI ra khỏi kênh RSI Threshold (BUY/SELL)

Các cảnh báo (BUY/SELL) có thể được lọc tùy chọn theo các đường trung bình động:

  • Đối với cảnh báo BUY, Close phải nằm trên MA nhanh và MA nhanh (EMA8) > MA trung bình (EMA20) > MA chậm (SMA50).
  • Đối với cảnh báo SELL, Close phải nằm dưới MA nhanh và MA nhanh (EMA8) < MA trung bình (EMA20) < MA chậm (SMA50).

và/hoặc bộ lọc hướng:

  • Đối với cảnh báo BUY, Close phải nằm trên MA chậm (SMA50) và MA hướng (EMA20) phải màu xanh lá cây.
  • Đối với cảnh báo SELL, Close phải nằm dưới MA chậm (SMA50) và MA hướng (EMA20) phải màu đỏ.

XZERO và XQQE không được bao gồm trong bộ lọc, chúng được sử dụng để chỉ báo các cảnh báo BUY / SELL đang chờ, đặc biệt là XZERO.

Chiến lược này nên hoạt động trên bất kỳ cặp tiền tệ và hầu hết các khung thời gian biểu đồ.

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

Ý tưởng cốt lõi của chiến lược này là sử dụng sự chéo hướng của chỉ số QQE nhanh như tín hiệu giao dịch và lọc các tín hiệu giao dịch ồn ào thông qua sự kết hợp của các đường trung bình động để nắm bắt hướng xu hướng.

Cụ thể, chiến lược sử dụng các chỉ số và tín hiệu sau:

Chỉ số QQE nhanhĐây là một chỉ số dựa trên RSI với sự làm bằng thêm để làm cho nó nhạy cảm và nhanh hơn. Chỉ số bao gồm ba đường: đường giữa là đường trung bình chuyển động theo cấp số nhân của RSI, đường trên là đường giữa + ATR nhanh * một yếu tố, và đường dưới là đường giữa - ATR nhanh * một yếu tố. Khi RSI vượt qua đường trên, đó là tín hiệu bán. Khi RSI xuống dưới đường dưới, đó là tín hiệu mua.

Zero Line Crossover: Nó tạo ra tín hiệu khi đường giữa của chỉ số RSI vượt qua đường không.

Phá vỡ kênh: Nó tạo ra tín hiệu khi đường giữa của RSI bước vào kênh ngưỡng đã đặt. Bước qua kênh trên là tín hiệu bán và bước qua kênh dưới là tín hiệu mua. Đây là các tín hiệu xu hướng mạnh hơn.

Combo trung bình di chuyển: Sử dụng sự kết hợp giữa các đường trung bình động nhanh (8 giai đoạn), trung bình (20 giai đoạn) và chậm (50 giai đoạn). Khi ba đường được sắp xếp như: nhanh > trung bình > chậm, đó là xu hướng tăng. Khi được sắp xếp như nhanh < trung bình < chậm, đó là xu hướng giảm. Sự kết hợp được sử dụng để xác định hướng xu hướng tổng thể.

Bộ lọc hướng xu hướng: Một tín hiệu mua chỉ được tạo ra khi giá đóng trên trung bình di chuyển chậm và trung bình di chuyển trung bình (20 giai đoạn) tăng lên (giá cao nhất của giai đoạn > giá thấp nhất). Một tín hiệu bán chỉ được tạo ra khi giá đóng dưới trung bình di chuyển chậm và trung bình di chuyển trung bình (20 giai đoạn) giảm xuống. Điều này có thể lọc ra một số tín hiệu giả ngược.

Bằng cách kết hợp việc sử dụng các tín hiệu chéo từ chỉ số QQE nhanh và lọc xu hướng từ đường trung bình động, nó ghi lại các điểm đảo ngược ngắn hạn trên các xu hướng khung thời gian chính để tạo thành một hệ thống giao dịch tương đối hoàn chỉnh.

Tóm lại, đây là một chiến lược theo dõi xu hướng trung bình và dài hạn, sử dụng các chỉ số nhanh để nắm bắt thời gian đảo ngược ngắn hạn cho bước vào / bước ra, và sử dụng lọc trung bình động để giảm rủi ro giao dịch chống lại hướng và do đó tối đa hóa lợi nhuận.

Ưu điểm của Chiến lược

  • Sử dụng chỉ số QQE nhanh và nhạy cảm để nhanh chóng bắt tín hiệu đảo ngược
  • Áp dụng nhiều đường trung bình động để xác định hướng chu kỳ lớn và tránh giao dịch chống lại xu hướng
  • Bao gồm nhiều tín hiệu chéo có thể được sử dụng kết hợp để tăng cơ hội lợi nhuận
  • Các thông số có thể điều chỉnh có thể được tối ưu hóa cho các sản phẩm và khung thời gian khác nhau
  • Sử dụng tín hiệu thoát kênh của chỉ số thay vì vẽ các kênh riêng biệt, tránh sự phụ thuộc tham số
  • Có thể nắm bắt chuyển động đảo ngược ngắn hạn rất tốt trong chu kỳ xu hướng lớn
  • Các khái niệm đơn giản và rõ ràng, dễ hiểu và thực hiện

Rủi ro của chiến lược

Ngoài ra còn có một số rủi ro tiềm ẩn với chiến lược này:

  • Các chỉ số nhanh có xu hướng tạo ra các tín hiệu sai mà không thể được lọc hoàn toàn bằng đường trung bình động, nguy cơ theo dõi hướng sai tồn tại
  • Khi sự đảo ngược xu hướng chu kỳ lớn xảy ra, các tín hiệu giao dịch đảo ngược có xu hướng hình thành gây ra rủi ro
  • Không xem xét các yếu tố quản lý tiền, rủi ro giao dịch quá mức và lỗ tồn tại
  • Không có dừng lỗ tại chỗ, rủi ro mở rộng tổn thất là lớn
  • Rủi ro phù hợp với dữ liệu thử nghiệm sau, hiệu suất thực tế vẫn chưa được xác minh

Các biện pháp đối phó và giải pháp bao gồm:

  • Điều chỉnh các thông số trung bình động, sử dụng nhiều độ dài chu kỳ hơn để xác định xu hướng
  • Thêm các chỉ số khác như MACD, thiên vị vv cho bộ lọc combo
  • Thêm các chiến lược dừng lỗ để kiểm soát kích thước lỗ giao dịch duy nhất
  • Kiểm tra tiền thật, tối ưu hóa các thông số

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

Có chỗ cho việc tối ưu hóa thêm chiến lược này:

  1. Tối ưu hóa các thông số đường nhanh và chậm của chỉ số QQE để tìm kết hợp thông số tối ưu
  2. Kiểm tra nhiều combo trung bình động để tìm hiệu suất lọc tối ưu
  3. Thêm các chỉ số khác như MACD để lọc tín hiệu phụ trợ
  4. Áp dụng các chiến lược quản lý tiền để tối ưu hóa kích thước vị trí
  5. Thiết lập chiến lược dừng lỗ để kiểm soát rủi ro giảm theo giao dịch
  6. Tối ưu hóa các tham số dựa trên các sản phẩm khác nhau
  7. Xác định xu hướng trên các khung thời gian thậm chí còn dài hơn để tránh bị đánh lừa bởi sự đảo ngược ngắn hạn

Với tối ưu hóa tham số, kết hợp nhiều chỉ số hơn, và được hỗ trợ bởi tiền thực tế và thực tiễn quản lý rủi ro, hiệu suất của chiến lược này có thể được cải thiện cho giao dịch thực tế.

Kết luận

Nhìn chung, chiến lược giao dịch chéo QQE nhanh dựa trên bộ lọc xu hướng là một lựa chọn rất đáng kể. Sức mạnh của nó nằm trong việc nhanh chóng nắm bắt các cơ hội giao dịch đảo ngược trong khi sử dụng nhiều đường trung bình động để xác định xu hướng chính và tránh giao dịch chống lại chúng càng nhiều càng tốt. Với tối ưu hóa các thông số chỉ số và tiêu chí lọc, cùng với quản lý tiền chặt chẽ, chiến lược này có thể tạo ra lợi nhuận đầu tư tương đối ổn định.

Tất nhiên rủi ro không thể bỏ qua. Kiểm tra tiền thật và điều chỉnh tối ưu hóa liên tục là cần thiết để đảm bảo tính thực tế và độ tin cậy của chiến lược. Kết luận, điều đáng để các nhà đầu tư nghiên cứu và theo dõi thực hành dài hạn. Người ta tin rằng với sự tiến bộ của các công nghệ giao dịch thuật toán, loại chiến lược này dựa trên các chỉ số nhanh và lọc xu hướng sẽ thấy sự cải thiện và phổ biến hơn nữa.


/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
//
// Title:   [STRATEGY][UL]QQE Cross v1.1
// Author:  JustUncleL
// Date:    22-Oct-2016
// Version: v1.1
//
// Description:
//  A trend following trading Strategy that uses fast QQE crosses with Moving Averages
//  for trend direction filtering. QQE or Qualitative Quantitative Estimation is based 
//  on the relative strength index, but uses a smoothing technique as an additional 
//  transformation. Three crosses can be selected (all selected by default): 
//    - RSI signal crossing ZERO (XZERO)
//    - RSI signal crossing Fast RSIatr line (XQQE)
//    - RSI signal exiting the RSI Threshhold Channel (BUY/SELL)
//  The (BUY/SELL) alerts can be optionally filtered by the Moving averages:
//    - For BUY alert the Close must be above the fast MA and 
//        fast MA (EMA8) > medium MA (EMA20) > slow MA (SMA50).
//    - For SELL alert the Close must be below the fast MA and
//        fast MA (EMA8) < medium MA (EMA20) < slow MA (SMA50).
//  and/or directional filter:
//    - For BUY alert the Close must be above the slow MA (SMA50) and the
//      directional MA (EMA20) must be green.
//    - For SELL alert the Close must be below the slow MA (SMA50) and the
//      directional MA (EMA20) must be red.
//. The XZERO and XQQE are not included in the filtering, they are used to indicate
//  pending BUY/SELL alerts, particularly the XZERO. 
//
//  This Strategy should work on any currency pair and most chart timeframes.
//  *** USE AT YOUR OWN RISK ***
//  
// 
//
// Mofidifications:
//  1.1 - Added Target Profit option, cleaned up the risk management code.
//        Changed Trade Close to EMA20 direction change instead of opposite BUY/SELL
//        signal, which will be earlier, this means stop loss setting should not be
//        required when an AutoTrader is available.
//        Modified code to prevent potential repaint issues.
//  1.0 - original
//
// References:
//  Some Code borrowed from:
//  - "Scalp Jockey - MTF MA Cross Visual Strategizer by JayRogers"
//  - "QQE MT4 by glaz"
//  - "Strategy Code Example by JayRogers"  
//  Inspiration from:
//  - http://www.forexstrategiesresources.com/binary-options-strategies-ii/189-aurora-binary-trading/
//  - http://www.forexstrategiesresources.com/metatrader-4-trading-systems-v/652-qqe-smoothed-trading/
//  - http://dewinforex.com/forex-indicators/qqe-indicator-not-quite-grail-but-accurately-defines-trend-and-flat.html
//

strategy(title='[STRATEGY][UL]QQE Cross v1.1', pyramiding=0, overlay=true )


// - INPUTS START
// Fast MA - type, source, length
type1   = input(defval="EMA", title="Fast MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, ZEMA ( case sensitive )")
len1    = input(defval=8, title="Fast - Length", minval=1)
// Medium Fast MA - type, source, length
type2   = input(defval="EMA", title="Medium Fast MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, ZEMA ( case sensitive )")
len2    = input(defval=20, title="Medium Fast - Length", minval=1)
// Slow MA - type, source, length
type3   = input(defval="SMA", title="Slow MA Type: SMA, EMA, WMA, VWMA, SMMA, DEMA, TEMA, HullMA, LSMA, ZEMA ( case sensitive )")
len3    = input(defval=50, title="Slow Length", minval=1)
//
// QQE rsi Length, Smoothing, fast ATR factor, source
RSILen  = input(6,title='RSI Length')
SF      = input(3,title='RSI Smoothing Factor')
QQE     = input(2.618,title='Fast QQE Factor')
threshhold = input(10, title="RSI Threshhold")
//
sQQEx   = input(false,title="Show QQE Signal crosses")
sQQEz   = input(false,title="Show QQE Zero crosses")
//
filter  = input(false,title="Use Moving Average Filter")
dfilter = input(true, title="Use Trend Directional Filter" )
RSIsrc  = input(close,title="Source")
srcclose= RSIsrc

// - INPUTS END

// - FUNCTIONS

// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = wma(src, len)                                                  // Weighted
    v4 = vwma(src, len)                                                 // Volume Weighted
    v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v6 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    v10 = ema1+(ema1-ema2)                                              // Zero Lag Exponential
    // return variant, defaults to SMA if input invalid.
    type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="ZEMA"?v10 : v1

// - FUNCTIONS END

// - Fast ATR QQE
//
Wilders_Period = RSILen * 2 - 1
//
Rsi = rsi(RSIsrc,RSILen)
RSIndex = ema(Rsi, SF)
AtrRsi = abs(RSIndex[1] - RSIndex)
MaAtrRsi = ema(AtrRsi, Wilders_Period)
DeltaFastAtrRsi = ema(MaAtrRsi,Wilders_Period) * QQE
//
newshortband=  RSIndex + DeltaFastAtrRsi
newlongband= RSIndex - DeltaFastAtrRsi
longband=RSIndex[1] > longband[1] and RSIndex > longband[1] ? max(longband[1],newlongband) : newlongband
shortband=RSIndex[1] < shortband[1] and  RSIndex < shortband[1] ? min(shortband[1],newshortband) : newshortband
trend=cross(RSIndex, shortband[1])? 1 : cross(longband[1], RSIndex) ? -1 : nz(trend[1],1)
FastAtrRsiTL = trend==1 ? longband : shortband


// - SERIES VARIABLES
// MA's
ma_fast    = variant(type1, srcclose, len1)
ma_medium  = variant(type2, srcclose, len2)
ma_slow    = variant(type3, srcclose, len3)
// Get Direction From Medium Moving Average
direction = rising(ma_medium,3) ? 1 : falling(ma_medium,3) ? -1 : 0
//
// Find all the QQE Crosses
QQExshort = sQQEx and crossover(FastAtrRsiTL, RSIndex)
QQExlong  = sQQEx and crossunder(FastAtrRsiTL, RSIndex)
// Zero cross
QQEzlong = sQQEz and crossover(RSIndex,50)
QQEzshort  = sQQEz and crossunder(RSIndex,50)
//  
// Thresh Hold channel Crosses give the BUY/SELL alerts.
QQEclong = RSIndex>(50+threshhold) ? na(QQEclong[1]) ? 1 : QQEclong[1]+1 : 0
QQEcshort = RSIndex<(50-threshhold) ? na(QQEcshort[1]) ? 1 : QQEcshort[1]+1 : 0

//
// Check Filtering.
QQEflong = (not filter or (srcclose>ma_fast and ma_medium>ma_slow and ma_fast>ma_medium)) and 
  (not dfilter or (direction>0 and srcclose>ma_slow))
QQEfshort = (not filter or (srcclose<ma_fast and ma_medium<ma_slow and ma_fast<ma_medium)) and
  (not dfilter or (direction<0 and srcclose<ma_slow))
//
// Get final BUY / SELL alert determination
buy = QQEclong>0 and QQEflong ? na(buy[1]) ? 1 : buy[1]+1 : 0
sell= QQEcshort>0 and QQEfshort ? na(sell[1]) ? 1 : sell[1]+1 : 0

// - SERIES VARIABLES END

// - PLOTTING
// Ma's
plot(ma_fast, title="MA Fast", color=olive, linewidth=2, transp=20)
plot(ma_medium, title="MA Medium Fast", color=direction<0?red:green, linewidth=3, transp=0)
plot(ma_slow, title="MA Slow", color=blue, linewidth=2, transp=20)
// QQE crosses
plotshape(QQExlong and buy!=1, title="QQE Cross Over", style=shape.triangleup, location=location.belowbar, text="XQQE", color=blue, transp=20, size=size.tiny)
plotshape(QQExshort and sell!=1, title="QQE Cross Under", style=shape.triangledown, location=location.abovebar, text="XQQE", color=black, transp=20, size=size.tiny)
// Signal crosses zero line
plotshape(QQEzlong and buy!=1 and not QQExlong, title="QQE Zero Cross Over", style=shape.triangleup, location=location.belowbar, text="XZERO", color=aqua, transp=20, size=size.tiny)
plotshape(QQEzshort and sell!=1 and not QQExshort, title="QQE Zero Cross Under", style=shape.triangledown, location=location.abovebar, text="XZERO", color=fuchsia, transp=20, size=size.tiny)

// - PLOTTING END

// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
shunt = 0
c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)


//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 100, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry(id = "Buy", long = true, when = buy[shunt]==1 )// use function or simple condition to decide when to get in
strategy.close(id = "Buy", when = direction[shunt]!=direction[shunt+1])// ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry(id = "Sell", long = false, when = sell[shunt]==1)
strategy.close(id = "Sell", when = direction[shunt]!=direction[shunt+1])

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

//eof

Thêm nữa