이중 추진력 표시 전략

저자:차오장, 날짜: 2023-09-25 17:34:46
태그:

전반적인 설명

이 전략의 핵심 아이디어는 트렌드 다음 및 트렌드 역전 거래를 구현하기 위해 이중 추진 지표와 기본 이동 평균 라인을 결합하는 것입니다. 가격이 지표와 같은 방향으로있을 때 트렌드를 따르고 가격이 지표의 반대 방향으로있을 때 역전 거래를 수행하십시오.

전략 논리

이 전략은 주로 세 가지 사용자 지정 지표에 기반합니다.

  1. 이중 추진 지표 (트렌드): 1, 0, -1 세 상태를 반환하여 상승 및 하락 추세를 결정하기 위해 가격과 과잉 구매 / 과잉 판매 채널 사이의 관계를 계산합니다.

  2. 과잉 구매/대판 채널 (Tsl): ATR를 기준으로 상부와 하부 레일을 계산합니다. 상부 레일을 뚫는 것은 과잉 구매로 간주되며, 하부 레일을 뚫는 것은 과잉 판매로 간주됩니다.

  3. 기본 이동 평균 라인 (MA): 종료 가격의 20 기간 간단한 이동 평균을 계산합니다.

구체적으로, 전략은 이중 추진 지표 값에 따라 가격이 상승, 측면 또는 하락 상태에 있는지 판단합니다. 이중 추진 지표가 1일 경우 상승 상태를 의미하며, 이중 추진 지표가 -1일 경우 하락 상태를 의미합니다. 이 시점에서 가격이 지표와 같은 방향으로 있다면, 올바른 지점에서 길거나 짧게가는 트렌드 다음 전략을 채택합니다. 가격이 지표의 반대 방향으로있는 경우, 예를 들어 가격이 하위 레일을 뚫고있는 동안 상승세를 보이는 지표와 같이, 수익을 얻기 위해 단위로 이동하여 역전 전략을 채택합니다.

또한, 이동 평균 라인에서의 가격의 돌파는 거래 방향을 안내하는 보조 신호로도 사용됩니다. 가격이 평균 라인을 상향으로 돌파할 때 길게 이동하고 가격이 평균 라인을 상향으로 돌파할 때 짧게 이동합니다.

롱 트레이드 전략은 다음과 같습니다.

  1. 이중 추진 지표 > 0, 상단 레일을 뚫기 위해 가격이 상승합니다.

  2. 이중 추진 지표 < 0, 가격 하락 하단 레일을 통과하기 위해, 트렌드 반전 속, 짧은 이동합니다.

  3. 종료 가격 > 개시 가격 > 피보트 수준, 길게 가기 위해 피보트를 깨는 것으로 간주됩니다.

  4. 닫기 가격은 상단 레일을 깨고 닫기 가격은 > 이동 평균 라인, 길게 이동합니다.

짧은 거래 전략은 다음과 같습니다.

  1. 이중 추진 지표 < 0, 가격 하락 하단 레일을 통해 깨고, 추세에 속하는, 짧은 이동합니다.

  2. 이중 추진 지표 > 0, 가격 상승은 트렌드 반전과 관련된 상부 레일을 깨고, 길게 간다.

  3. 오픈 가격 > 종료 가격 < 피보트 레벨, 피보트를 깨고 쇼트, 쇼트로 전환하는 것으로 간주됩니다.

  4. 닫기 가격은 하부 레일을 통과하고 닫기 가격은 < 이동 평균 라인, 짧은 이동합니다.

출구 전략은 간단합니다. 가격이 다시 과잉 구매/ 과잉 판매 채널을 넘어서면 손실을 멈추는 것입니다.

이점 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 이중 추진 지표는 시장 동향을 정확하게 결정할 수 있으며 전략의 핵심 지표입니다.

  2. 과잉 매수/ 과잉 판매 채널과 함께 지표는 잠재적인 역전 기회를 발견할 수 있습니다.

  3. 기본 이동평균선은 거짓 파장을 피하기 위해 보조 필터링 신호로 사용될 수 있습니다.

  4. 이중 추진 지표와 결합된 피보트 포인트는 높은 확률의 거래 지점을 형성합니다.

  5. 더 많은 수익 기회를 얻기 위해 트렌드 따라와 역전 거래 기능을 모두 가지고 있습니다.

  6. 과도한 매수/ 과도한 매수 채널의 스톱 로스는 간단하고 명확하며, 이는 위험 통제에 유리합니다.

위험 분석

이 전략은 또한 다음과 같은 위험을 가지고 있습니다.

  1. 이중 추진 지표는 잘못된 신호를 줄 수 있으며 다른 지표로 필터링해야합니다.

  2. 브레이크오웃 거래는 함정에 빠지기 쉽기 때문에 엄격한 스톱 로스가 필요합니다.

  3. 부적절한 이동평균 기간 설정은 트렌드를 놓칠 수 있거나 잘못된 신호를 생성할 수 있습니다.

  4. 피워트 포인트는 확률 신뢰성을 확인하기 위해 백테스팅이 필요합니다.

  5. 과잉 구매/대량 판매 채널은 다양한 제품에 적응하기 위해 매개 변수를 최적화해야 합니다.

  6. 지표 매개 변수들의 부합이 빈번한 거래로 이어질 수 있습니다.

이러한 위험을 해결하기 위해 다음과 같은 조치를 취할 수 있습니다.

  1. K-라인, 부피와 같은 다른 지표들을 조합해서 이중 추진 지표 신호를 확인합니다.

  2. 급속한 스톱 손실을 위해 과잉 구매/ 과잉 판매 채널 스톱 손실 전략을 엄격히 따르십시오.

  3. 다양한 이동 평균 기간 매개 변수를 테스트하여 최적의 매개 변수를 찾습니다.

  4. 피보트 포인트 전략의 확률을 완전히 뒤검어보죠

  5. 매 제품마다 최적의 조합을 찾기 위해 매개 변수를 최적화합니다.

  6. 전체 시스템이 원활하게 작동하도록 지표 매개 변수를 조정합니다.

최적화 방향

이 전략은 다음 측면에서도 최적화 될 수 있습니다.

  1. 기계 학습 알고리즘을 늘려 두 개의 추진 지표를 빅데이터로 훈련시켜 정확도를 높이고 잘못된 신호를 줄일 수 있습니다.

  2. 적응 채널을 추가하여 시장 변동성에 따라 채널 매개 변수를 자동으로 조정합니다. 이것은 브레이크오웃 정확도를 향상시킬 수 있습니다.

  3. 딥러닝을 사용하여 더 많은 변화 가능한 지표를 추출하여 진입 및 출구 전략을 최적화합니다.

  4. 스톱 로즈 트렌드를 추적할 수 있는 고급 스톱 로즈 알고리즘을 추가하여 역행에 의해 중단되는 것을 피합니다.

  5. 전체 전략 안정성을 향상시키기 위해 매개 변수 최적화 및 조합 테스트를 수행합니다.

  6. 더 과학적인 위험 통제를 위해 위험 관리 모듈을 추가합니다.

요약

이 전략은 트렌드 추적과 트렌드 역전을 유기적으로 결합하여 이중 추진 지표로 시장 구조를 판단하고 채널과 이동 평균 라인을 통해 거래 신호를 생성합니다. 좋은 지표 효과, 풍부한 거래 기회 및 명확한 스톱 손실의 장점이 있습니다. 동시에 안정성을 향상시키기 위해 추가 최적화가 필요한 특정 위험도 있습니다. 전반적으로 전략은 트렌드 거래와 역 거래의 아이디어를 완전히 통합하고 추가 연구 및 응용 가치가 있습니다.


/*backtest
start: 2023-08-25 00:00:00
end: 2023-09-24 00:00:00
period: 2h
basePeriod: 15m
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/
// © amysojexson

//@version=3
strategy(title="Pivots strategy", overlay=true)

// Input settings
// Create a pull-down menu for the pivot type
pivotType = input(title="Pivot Type",
     options=["Daily", "Intraday", "Weekly"], defval="Daily")

// Make toggles for pivot level options
plotPP   = input(title="Plot PP", type=bool, defval=true)
plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true)
plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true)
plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true)
plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true)
// Configure session options
sessRange = input(title="Trading Session",  defval="0800-1600")
showSess  = input(title="Highlight Session?", type=bool, defval=false)

// Enable or disable pivot labels
showLabels = input(title="Show Labels?", type=bool, defval=false)

// Step 2. Calculate indicator values
// Create a function to fetch daily and weekly data
GetData(res, data) =>
    security(syminfo.tickerid, res, data[1],
         lookahead=barmerge.lookahead_on)

// Fetch daily and weekly price data
dailyHigh  = GetData("D", high)
dailyLow   = GetData("D", low)
dailyClose = GetData("D", close)

weeklyHigh  = GetData("W", high)
weeklyLow   = GetData("W", low)
weeklyClose = GetData("W", close)

// Determine session pivot data
// First see how the price bar relates to
// the session time range
inSession = not na(time(timeframe.period, sessRange)[1])
sessStart = inSession and not inSession[1]
sessEnd   = not inSession and inSession[1]

// Determine session price data
sessHigh  = 0.0
sessLow   = 0.0
sessClose = 0.0

sessHigh := sessStart ? high :
     inSession ? max(high, sessHigh[1]) : na
sessLow := sessStart ? low :
     inSession ? min(low, sessLow[1]) : na
sessClose := sessEnd ? close[1] : na

// Compute high, low, close from previous intra-day session
highPrevSess  = 0.0
lowPrevSess   = 0.0
closePrevSess = 0.0

highPrevSess  := sessEnd ? fixnan(sessHigh) : highPrevSess[1]
lowPrevSess   := sessEnd ? fixnan(sessLow) : lowPrevSess[1]
closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1]

// Now figure out which kind of price data
// to use for the pivot calculation
theHigh = if (pivotType == "Daily")
    dailyHigh
else
    if (pivotType == "Intraday")
        highPrevSess
    else
        weeklyHigh

theLow = if (pivotType == "Daily")
    dailyLow
else
    if (pivotType == "Intraday")
        lowPrevSess
    else
        weeklyLow

theClose = if (pivotType == "Daily")
    dailyClose
else
    if (pivotType == "Intraday")
        closePrevSess
    else
        weeklyClose

// Finally calculate the pivot levels
pp = (theHigh + theLow + theClose) / 3
bc= (theHigh + theLow)/2
tc= (pp-bc)+pp

r1 = pp+(.382*(theHigh-theLow))
s1 = pp-(.382*(theHigh-theLow))
r2 = pp +(.618*(theHigh-theLow))
s2 = pp -(.618*(theHigh-theLow))
r3 = pp +(1*(theHigh-theLow))
s3 = pp -(1*(theHigh-theLow))

// Step 3. Output indicator data
// Plot the various pivot levels
plot(series=plotS3R3 ? r3 : na, title="R3",
     style=circles, linewidth=1, color=#0023FF)
plot(series=plotS2R2 ? r2 : na, title="R2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS1R1 ? r1 : na, title="R1",
     style=circles, linewidth=1, color=#09E0F3)

plot(series=plotTCBC ? tc : na, title="TC",
     style=circles, linewidth=.75, color=#FF00D1)
plot(series=plotPP ? pp : na, title="PP",
     style=circles, linewidth=1, color=#000000)
plot(series=plotTCBC ? bc : na, title="BC",
     style=circles, linewidth=.75, color=#FF00D1)

plot(series=plotS1R1 ? s1 : na, title="S1",
     style=circles, linewidth=1, color=#09E0F3)
plot(series=plotS2R2 ? s2 : na, title="S2",
     style=circles, linewidth=1, color=#1E90FF)
plot(series=plotS3R3 ? s3 : na, title="S3",
     style=circles, linewidth=1, color=#0023FF)

// Display the pivot names on the chart, if applicable
newPivots = (showLabels == false) ? false :
     (pivotType == "Intraday") ? sessEnd :
     (pivotType == "Daily") ? dayofmonth != dayofmonth[1] :
     dayofweek == monday and dayofmonth != dayofmonth[1]

plotchar(series=newPivots and plotS3R3 ? r3 : na,
     char='', text="R3", offset=1,
     location=location.absolute,
     color=#0023FF, title="R3 label")

plotchar(series=newPivots and plotS2R2 ? r2 : na,
     char='', text="R2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="R2 label")

plotchar(series=newPivots and plotS1R1 ? r1 : na,
     char='', text="R1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="R1 label")

plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="TC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="TC label")
     
plotchar(series=newPivots and plotTCBC ? r1 : na,
     char='', text="BC", offset=1,
     location=location.absolute,
     color=#FF00D1, title="BC label")

plotchar(series=newPivots and plotS1R1 ? s1 : na,
     char='', text="S1", offset=1,
     location=location.absolute,
     color=#09E0F3, title="S1 label")

plotchar(series=newPivots and plotS2R2 ? s2 : na,
     char='', text="S2", offset=1,
     location=location.absolute,
     color=#1E90FF, title="S2 label")

plotchar(series=newPivots and plotS3R3 ? s3 : na,
     char='', text="S3", offset=1,
     location=location.absolute,
     color=#0023FF, title="S3 label")

// Highlight the intra-day price data session on the chart
bgcolor(color=showSess and inSession and (pivotType == "Intraday") ?
     orange : na, transp=95)

// Step 4. Create indicator alerts
alertcondition(condition=cross(close, s3),
     title="Pivot S3 Cross",
     message="Prices crossed Pivot S3 level")

alertcondition(condition=cross(close, s2),
     title="Pivot S2 Cross",
     message="Prices crossed Pivot S2 level")

alertcondition(condition=cross(close, s1),
     title="Pivot S1 Cross",
     message="Prices crossed Pivot S1 level")
     
alertcondition(condition=cross(close, tc),
     title="Pivot TC Cross",
     message="Prices crossed Pivot TC level")

alertcondition(condition=cross(close, pp),
     title="Pivot PP Cross",
     message="Prices crossed the main Pivot Point level")
     
alertcondition(condition=cross(close, bc),
     title="Pivot BC Cross",
     message="Prices crossed Pivot BC level")

alertcondition(condition=cross(close, r1),
     title="Pivot R1 Cross",
     message="Prices crossed Pivot R1 level")

alertcondition(condition=cross(close, r2),
     title="Pivot R2 Cross",
     message="Prices crossed Pivot R2 level")

alertcondition(condition=cross(close, r3),
     title="Pivot R3 Cross",
     message="Prices crossed Pivot R3 level")
    
MA = sma(close, 20)
plot(MA, color=red)

Factor				= input(2, type=float)
Pd					= input(10, minval=1,maxval = 100)
Up					= hl2-(Factor*atr(Pd))
Dn					= hl2+(Factor*atr(Pd))
TrendUp				= 0.0
TrendUp				:= close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown			= 0.0
TrendDown			:= close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend				= 0.0
Trend 				:= close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl 				= Trend==1? TrendUp: TrendDown

plot(Tsl, color=blue)

if close>open
    if open<pp
        if close>pp
            if close>MA
                strategy.entry("long", true) 
if close<open
    if open>pp
        if close<pp
            if close<MA
                strategy.entry("short", false) 
                
strategy.close("long", when = open<Tsl)
strategy.close("short", when = open>Tsl)

더 많은