
이 전략은 슈퍼 트렌드 지표 (Super Trend), 축점 (Pivot Points) 및 평균 실제 파장 (Average True Range, ATR) 이 형성하는 동적 스톱 로드 라인을 결합하고 평균 방향 지수 (Average Directional Movement Index, ADX) 지표가 트렌드를 판단하고 추적합니다. 이 전략은 짧은 라인 거래에 적합하며, 중간 디스크를 정리한 후 트렌드 연장 부분을 캡처 할 수 있으며, 회수 제어도 잘합니다.
초 트렌드 지표는 중심축점과 ATR 스톱로드를 결합하여 가격의 동적 스톱로드를 뚫는 방향을 판단하여 포지션 방향을 결정한다. 한편, ADX 지표는 트렌드 강도를 판단하여 트렌드가 충분히 강할 때만 거래 신호를 낸다.
구체적으로 말하면, 축 지점은 가장 최근의 지원 저항을 얻습니다. 다음에는 지난 2 일의 수학적 평균과 동적 중간값을 형성합니다. ATR을 계산하고 ATR 인수를 곱한 다음 동적 중간값과 더하여 상승과 하락을 얻습니다. 가격이 상승 궤도를 돌파 할 때 낙점하고 하락 궤도를 돌파 할 때 낙점합니다. ADX 지표는 트렌드의 강도를 판단하고 트렌드가 충분히 강할 때만 거래에 참여합니다.
스톱 라인은 최신 가격과 ATR 값에 따라 동적으로 조정되며, 트렌드를 잘 추적할 수 있다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
트렌드 지표는 트렌드 방향에 따라 움직이며, 흔들리는 시장에 의해 수익이 고정되지 않습니다.
ADX 지표로 트렌드 강도를 판단하여 재조정 시 잘못된 거래를 피하십시오.
스톱로스 라인이 동적으로 조정되어 수익을 최대한 고정합니다.
RSI와 결합하면 매매를 피할 수 있습니다.
전체적으로, 정책 파라미터가 합리적으로 설정되어 있고, dframe 선택에서 연속성을 고려하고, 스티프 스티프 손실 설정도 좋습니다.
이 전략에는 몇 가지 위험도 있습니다.
트렌드 지표와 MA 지표는 충돌 신호를 발산할 수 있다.
ADX 지표는 14주기로 설정되어 있으며, 급격한 사건에 대한 민감도가 낮다.
RSI 파라미터는 기본값으로 설정되어 있으며, 거래가 완전히 피할 수 없습니다.
“이런 일이 벌어진다면, 어떤 일이 일어날까요?“라고 묻습니다.
대응방법:
MA 주기를 조정하여 초 트렌드 지표와 일치시킵니다.
ADX 사이클을 짧게 하고, 돌발적 사건에 대한 민감도를 높여보세요.
RSI 파라미터를 최적화하여 최적의 값을 찾습니다.
뉴스를 필터링하는 모듈에 가입하여 주요 뉴스를 피하십시오.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
기계 학습 모델의 추세 판단을 증가시켜 거래 결정을 더 똑똑하게 만듭니다.
감정 지표와 같은 대안 ADX 지표를 도입해 트렌드 강도를 판단해 보세요.
자율적 인 손해 방지 모듈을 추가하여 손해 방지 기능을 더욱 역동적이고 정확하게 사용할 수 있습니다.
더 많은 특징을 추출하고, 전체적인 전략을 최적화하기 위해 딥러닝 기술을 사용합니다.
파이썬과 같은 고급 언어를 사용하여 정책 개발을 수행하고, 정책의 확장성을 증가시킵니다.
이 전략은 전체적으로 매우 실용적입니다. 핵심은 트렌드 운행 방향을 추적하고 트렌드가 충분히 강할 때 참여하는 것입니다. 중지 및 중지 설정은 또한 이익을 최대한 고정하고 손실을 방지하는 데 적합합니다. 물론, 여전히 많은 최적화 공간이 있습니다.
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Bendre ADX STrend", 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 = 21, title = "ATR Period")
StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window() => true
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)
//
// DMI - Direction Movement Index
//
[diplus1, diminus1, adx] = ta.dmi(14, 14)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy and vrsi > overBought and adx > 19)
// .order // Tuned version
strategy.entry("Buy", strategy.long, when = window())
// 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 and adx > 25)
strategy.entry("Sell", strategy.short, when = window())
if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
strategy.close("Sell", "close Sell")
// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
// strategy.entry("Sell", strategy.short, when = window())
// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0 and (buy))
// strategy.close("Sell", "close Sell")