
트렌드 필터 기반의 빠른 QQE 크로스 전략은 트렌드를 추적하는 거래 전략으로, 빠른 QQE 크로스 및 이동 평균을 사용하여 트렌드 방향을 필터링한다. QQE 또는 질적-량적 추정치는 상대 강도 지수를 기반으로 하지만, 평준화 기술을 추가 변환으로 사용합니다. 세 가지의 크로스를 선택할 수 있습니다.
구매/판매 신호는 이동 평균을 통해 선택적으로 필터링할 수 있습니다:
그리고/또는 트렌드 방향 필터:
XZERO와 XQQE는 필터링에 포함되지 않으며, 그들은 대기 중인 구매/판매 신호를 지시하기 위해 사용되며, 특히 XZERO。
이 전략은 모든 통화 쌍과 대부분의 시간 프레임의 차트에서 작동해야 합니다.
이 전략의 핵심 아이디어는 빠른 QQE 지표의 방향적 교차를 거래 신호로 사용하고 이동 평균의 조합을 통해 노이즈 거래 신호를 필터링하여 트렌드 방향을 포착하는 것입니다.
특히, 전략은 다음과 같은 지표와 신호를 사용합니다.
빠른 QQE 지표: 이것은 RSI를 기반으로 한 지표이며, 추가적인 부드러운 처리가되어 더 민감하고 빠르게 작동합니다. 지표는 세 개의 선으로 구성됩니다. 중앙 선은 RSI의 지수 이동 평균, 상단 선은 중도 + 빠른 ATR *의 계수, 하단 선은 중도 - 빠른 ATR *의 계수입니다.
0선 교차: RSI 중궤도선이 0선을 교차할 때 신호가 생성되며, 상향 교차는 구매 신호이며, 하향 교차는 판매 신호이다. 이러한 신호는 트렌드 변화의 전조를 나타낸다.
통로가 뚫렸다: RSI 중도 궤도가 설정된 마이너스 채널에 들어갈 때 신호가 발생하며, 상위 채널을 뚫는 것은 판매 신호이며, 하위 채널을 뚫는 것은 구매 신호입니다. 이것들은 더 강한 트렌드 신호입니다.
이동 평균 조합: 신속하고 느린 3 그룹 이동 평균을 사용하여, 빠른 선은 8 주기로, 중간 선은 20 주기로, 느린 선은 50 주기로. 3 개의 선이: 빠른> 중간> 느린 경우 상승 추세이며, 빠른 <중간> 느린 경우 하락 추세입니다. 조합은 전체 경향 방향을 판단하는 데 사용됩니다.
트렌드 방향 필터: 닫기 가격은 느린 이동 평균 위와 중간 이동 평균 위 (이 기간의 최고 가격> 최저 가격) 에서 구매 신호를 생성합니다. 닫기 가격은 느린 이동 평균 아래와 중간 이동 평균 아래로 판매 신호를 생성합니다. 이것은 일부 역전 된 가짜 신호를 필터링 할 수 있습니다.
빠른 QQE 지표의 교차 신호와 이동 평균의 트렌드 필터링을 조합하여, 더 큰 시간 프레임의 트렌드 방향에 대해 중단기 반전점을 잡을 수 있으며, 비교적 완전한 거래 시스템을 형성한다. 동시에, 지표의 매개 변수는 비교적 민감하게 설정되어, 트렌드의 반전점을 가능한 빨리 잡을 수 있다.
전체적으로, 이것은 중·장기 경향을 추적하는 전략으로, 빠른 지표를 통해 단기 반전 구매/판매 시기를 포착하고, 이동 평균 필터를 사용하여 반전의 위험을 줄이고, 수익을 극대화한다.
이 전략에는 몇 가지 잠재적인 위험도 있습니다.
대책과 해결책은 다음과 같습니다.
이 전략에는 더 많은 최적화 가능성이 있습니다:
변수 최적화, 더 많은 지표의 조합, 그리고 실질적으로 실행 가능한 자금 및 위험 관리 수단으로 보조 된 전략의 실전 성능을 향상시킬 수 있습니다.
전체적으로 볼 때, 트렌드 필터링을 기반으로 하는 빠른 QQE 교차 전략은 매우 고려할 가치가 있는 선택이다. 그것의 장점은 역전 거래 기회를 빠르게 포착하면서, 다중 모브링 평균을 사용하여 큰 트렌드를 판단하고, 역전 오류 거래를 최대한 피하는 것이다. 지표 파라미터와 필터링 조건을 최적화하고, 엄격한 자금 관리와 함께, 이 전략은 안정적인 투자 수익을 얻을 수 있다.
물론 위험도 무시할 수 없으며, 실습 검증과 지속적인 최적화 조정이 전략의 실용성과 신뢰성을 보장하기 위해 필요합니다. 일반적으로 투자자가 배우고 장기간 추적하는 연습에 가치가 있습니다. 알고리즘 거래 기술의 발전과 함께 빠른 지표와 트렌드 필터링을 기반으로 한 이러한 전략이 더 개선되고 보편화 될 것으로 믿습니다.
/*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