피벗 포인트 반전을 기반으로 한 양적 전략


생성 날짜: 2024-02-20 14:22:13 마지막으로 수정됨: 2024-02-20 14:22:13
복사: 0 클릭수: 654
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

피벗 포인트 반전을 기반으로 한 양적 전략

개요

이 전략의 핵심 아이디어는 중심축을 이용해서 거래하는 것이다. 중요한 중심축의 최고점과 낮은 곳을 찾아서, 가격이 이러한 핵심점을 돌파했을 때, 반전 거래를 한다.

전략 원칙

이 전략은 먼저 축의 높고 낮은 점을 찾는 함수 pivotHighSig() 와 pivotLowSig() 를 정의한다. 이 두 함수는 좌측과 우측에서 합격한 축의 점을 찾는다.

구체적으로, 축의 높이에 대해, 그것은 왼쪽에서 연속적으로 더 높은 높이를 찾고, 오른쪽에서 연속적으로 더 낮은 높이를 찾습니다. 따라서 축의 높이는 상대적으로 더 높은 위치에 있습니다. 축의 낮은 점의 판단 조건은 반대로, 그것은 왼쪽과 왼쪽의 두쪽에 더 높은 낮은 점을 찾습니다.

축의 높낮이를 찾은 후, 전략은 축의 축점, 즉 축점의 중요한 점을 추가로 선택합니다. 이것은 축의 높낮이의 여러 역사 변수를 정의하여 구현됩니다.

마지막으로, 가격이 축의 축점을 돌파했을 때, 반전 거래가 진행됩니다.

전략적 이점

이러한 축점 기반의 양적 전략은 다음과 같은 장점이 있습니다.

  1. 시장의 지지 및 저항 영역을 활용하여 가격 반전의 기회 지점으로 사용한다.
  2. 동시에 중요한 고점과 낮은 점을 찾아 다중공간 거래가 가능해졌습니다.
  3. 축점은 비교적 돋보이는 extremum점이며, 돌파점과 같은 점들은 신호가 더 강하다.
  4. 축의 축점을 이용해서 신호를 더 안정적으로 만들 수 있다.

위험과 해결책

이 전략에는 몇 가지 위험도 있습니다.

  1. 축점을 잘못 판단하여 잘못된 신호가 발생한다. 해결 방법은 좌우 간격 변수를 조정하여 축점 식별을 더 정확하게 보장하는 것이다.
  2. 돌파 가짜 돌파. 해결책은 더 많은 요소를 결합하여 신호를 필터링하는 것이다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 더 많은 손실을 막고 더 안정적인 전략
  2. 더 많은 지표와 함께 신호를 필터링합니다.
  3. 리버스 PRED 전략을 개발하여 ML을 사용하여 축점 예측을 더 최적화합니다.
  4. 추가 변수 적응 기능

요약하다

이 전략은overall 잘 수행하고, 핵심 아이디어는 중요한 축점을 발견하고 그 돌파구에 반전 거래를하는 것입니다. 추가적으로 최적화하면,이 전략은 더 안정적이고 신뢰할 수있는 신호를 얻을 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Pivot of Pivot Reversal Strategy [QuantNomad]", shorttitle = "PoP Reversal Strategy [QN]", overlay=true)

// Inputs 
leftBars   = input(4,   title = 'PP Left Bars')
rightBars  = input(2,   title = 'PP Right Bars')
atr_length = input(14,  title = 'ATR Length')
atr_mult   = input(0.1, title = 'ATR Mult')

// Pivot High Significant Function
pivotHighSig(left, right) =>
    pp_ok = true
    atr   = atr(atr_length)
    
    for i = 1 to left
        if (high[right] < high[right+i] + atr * atr_mult)
            pp_ok := false
    for i = 0 to right-1
        if (high[right] < high[i] + atr * atr_mult)
            pp_ok := false
    
    pp_ok ? high[right] : na

// Pivot Low Significant Function
pivotLowSig(left, right) =>
    pp_ok = true
    atr   = atr(atr_length)
    
    for i = 1 to left
        if (low[right] > low[right+i] - atr * atr_mult)
            pp_ok := false
    for i = 0 to right-1
        if (low[right] > low[i] - atr * atr_mult)
            pp_ok := false
    
    pp_ok ? low[right] : na


swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig (leftBars, rightBars)

swh_cond = not na(swh)

hprice = 0.0
hprice := swh_cond ? swh : hprice[1]

le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])

swl_cond = not na(swl)

lprice = 0.0
lprice := swl_cond ? swl : lprice[1]

se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])

// Pivots of pivots
ph1 = 0.0
ph2 = 0.0
ph3 = 0.0

pl1 = 0.0
pl2 = 0.0
pl3 = 0.0

pphprice = 0.0
pplprice = 0.0

ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1])
ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1])
ph1 := swh_cond ? hprice     : nz(ph1[1])

pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1])
pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1])
pl1 := swl_cond ? lprice     : nz(pl1[1])

pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1])
pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1])


if (le)
    strategy.entry("PP_RevLE", strategy.long, comment="PP_RevLE", stop=pphprice + syminfo.mintick)

if (se)
    strategy.entry("PP_RevSE", strategy.short, comment="PP_RevSE", stop=pplprice - syminfo.mintick)
    
// Plotting 
plot(lprice, color = color.red,   transp = 55)
plot(hprice, color = color.green, transp = 55)

plot(pplprice, color = color.red,   transp = 0, linewidth = 2)
plot(pphprice, color = color.green, transp = 0, linewidth = 2)