롱앤숏 지표 전략


생성 날짜: 2023-09-25 17:34:46 마지막으로 수정됨: 2023-09-25 17:34:46
복사: 3 클릭수: 553
1
집중하다
1219
수행원

개요

이 전략의 핵심 아이디어는 다공간 지표와 기본 이동 평균을 결합하여 트렌드 추적과 트렌드 역전 거래를 구현하는 것입니다. 가격과 지표가 동향되면 트렌드 추적을 수행하고, 가격과 지표가 반대 방향으로 갈 때 역전 거래를 수행합니다.

전략 원칙

이 전략은 크게 세 가지 사용자 정의 지표에 기반합니다.

  1. 다공이 지표 ((Trend): 가격과 오버 바이 오버 셀 채널의 관계를 계산하고, 다공이 및 공이 트렌드를 판단하고, 1, 0, -1 세 가지 상태를 반환한다.

  2. 오버 구매 오버 판매 채널 ((Tsl): 참조 ATR 계산 상궤와 하궤, 가격 돌파 상궤는 오버 구매로, 돌파 하궤는 오버 판매로 간주.

  3. 기본 이동 평균 ((MA): 계산 20주기의 종식 가격 간단한 이동 평균 (SMP) 을 .

구체적으로 말하면, 전략은 다공이 지표 값에 따라 가격이 다면, 흔들림 또는 공백 상태에 있다고 판단한다. 다공이 지표가 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. “오버 바이 오버 세일 채널 (Over Buy and Oversell Channel) “을 철저히 준수하고, 신속한 상쇄를 실시한다.

  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)