
트렌드 추적 이동 중지 전략은 트렌드 판단 지표와 이동 중지 메커니즘을 결합한 양적 거래 전략이다. 이 전략은 슈퍼 트렌드 지표를 사용하여 현재 트렌드 방향을 판단하고 이동 중지 라인을 사용하여 실시간 가격 변화를 추적하여 트렌드 추적 및 위험 관리를 구현한다.
이 전략은 먼저 슈퍼 트렌드 지표를 계산하여 현재 상승 추세 또는 하향 추세에 있는지 판단한다. 슈퍼 트렌드 지표는 ATR 지표와 중추점을 결합하여 트렌드 방향을 더 정확하게 판단 할 수 있다. 슈퍼 트렌드 지표가 상승 추세로 판단되면 구매 신호가 발생하며, 하향 추세로 판단되면 판매 신호가 발생한다.
구매 신호를 생성할 때, 이 전략은 더 많은 위치를 열고; 동시에, 그것은 실시간으로 이동하는 중지 라인을 계산합니다. 이 중지 라인은 ATR 지표의 값을 빼고 중앙 지점으로 계산됩니다. 현재 종료 가격이 이 중지 라인보다 높으면, 중지 라인은 실시간으로 이동하여 항상 합리적인 중지 위치에 유지됩니다. 가격이 중지 라인을 넘어지면, 평평한 중지 손실입니다.
이 전략은 ADX 지표와 RSI 지표를 결합하여 부적절한 거래 신호를 필터링합니다. ADX가 설정된 마이너스보다 크고 RSI가 합리적인 수준일 때만 슈퍼 트렌드 지표의 신호를 받아 입장을 개설합니다.
이 전략의 가장 큰 장점은 트렌드 방향을 잘 파악하고 트렌드 추적을 구현하는 데 있습니다. 슈퍼 트렌드 지표는 간단한 이동 평균보다 더 정확하며 전환점을 신속하게 판단 할 수 있습니다. 동시에, 이동 중지 메커니즘은 자동으로 중지 지점을 조정하여 수익을 최대한 고정하고 위험을 효과적으로 제어 할 수 있습니다.
또한, 이 전략은 ADX와 RSI 지표에 파동을 포함시켜 시장의 변동성이 큰 시기에 잘못된 거래를 피할 수 있습니다. ADX 지표는 충분한 경향성을 보장하고 RSI 지표는 과매매 현상을 피하여 수익률을 높입니다.
이 전략의 가장 큰 위험은 트렌드를 잘못 판단하고, 슈퍼 트렌드 지표가 잘못된 신호를 보내는 확률이다. 슈퍼 트렌드 지표가 간단한 이동 평균보다 우수함에도 불구하고, 복잡한 상황에서도 오류를 판단하는 것은 불가피하다. 이때는 손실을 제어하기 위해 상쇄 장치에 의존해야 한다.
또한, 전략 파라미터를 잘못 설정하는 것도 위험할 수 있다. 예를 들어 ATR 파라미터는 회의가 지나서 스톱 라인이 너무 급진적으로 조정된다. ADX 및 RSI의 파라미터를 잘못 설정하는 것도 거래 기회를 놓치거나 잘못된 거래의 가능성을 증가시킬 수 있다. 이것은 많은 역사 회귀를 통해 최적의 파라미터를 찾는 것이 필요하다.
이 전략은 다음의 몇 가지 측면에서 더 개선될 수 있습니다.
DMI, KDJ 등과 같은 다른 추세 판단 지표와 슈퍼 추세 지표의 조합을 시도하여 다중 인자 판단 시스템을 형성하여 판단 정확도를 향상시킬 수 있습니다.
기계 학습 기반의 적응 변수 최적화 모듈을 추가하여 ATR 변수, ADX 변수, RSI 변수 등이 단순한 고정 값이 아닌 실시간 시장에 따라 조정 될 수 있습니다.
감정 지표와 같은 대체 RSI 지표를 도입하여 신호를 필터링한다. RSI 지표는 복잡한 상황을 판단하는 것이 바람직하지 않으며, 사회적 감정 지표는 시장의 열기를 더 잘 판단할 수 있다.
포지션 관리 모듈을 추가하여, 스톱 라인이 현재 가격으로부터의 거리에 따라 포지션 크기를 동적으로 조정한다. 스톱 라인에서 멀리 떨어져 있을수록 포지션을 적절하게 확대하여 수익 공간을 높일 수 있다.
트렌드 추적 모바일 스톱 전략은 트렌드 분석, 모바일 스톱 및 다중 요소 필터링과 같은 방법을 통합하여 트렌드를 포착하면서 위험을 엄격하게 제어하는 것이 더成熟한 정량화 전략입니다. 이 전략의 최적화 공간은 여전히 넓고 더 복잡한 시장 환경에 적응하도록 개선하기 위해 더 많은 연구를 할 가치가 있습니다.
/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Bendre ADX Sup Trend", overlay = true)
///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////
src = input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 18, title = "ATR Period")
StartDate = input(timestamp("1 Dec 2022"), title="Start Date")
EndDate = input(timestamp("12 Jan 2023"), title="End Date")
var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)
float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph
if lastpp > 0
if na(center)
center := lastpp
else
center := (center * 2 + lastpp) / 3
Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))
var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend")
bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl
///////
// ADX
//////
lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)
//////
// MA
/////
lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)
//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy and vrsi > overBought)
// .order // Tuned version
strategy.entry("Buy", strategy.long)
// strategy.close("Sell", "close Sell")
if (sell) and (strategy.position_size > 0)
// strategy.entry("Sell", strategy.short)
strategy.close("Buy", "Close Buy")
// if(sell and vrsi < overSold )
// strategy.entry("Sell", strategy.short)
// if(buy) and (strategy.position_size > 0)
// strategy.close("Sell", "close Sell")