
PPO 가격 감수성 동력 쌍방향 거래 전략은 가격 감수성 동력 지표를 사용하여 가격 쌍방향 형성 경향을 추적하는 거래 전략이다. PPO 지표의 쌍방향 형성 판단과 가격 동력 특징 판단을 결합하여 가격 쌍방향 전환점의 정밀한 위치를 구현하여 거래 신호를 생성한다.
이 전략은 PPO 지표를 사용하여 가격의 이중 바닥 특성을 판단하고, 가격의 최저점을 판단하는 동시에 PPO 지표가 바닥 특성이 나타나는지 실시간으로 모니터링한다. PPO 지표가 아래에서 위로 역전되는 이중 바닥 형태가 나타나면 현재 구매 기회 지점에 있음을 나타냅니다.
다른 한편으로, 이 전략은 가격의 최소값을 판단하여 가격이 낮은 수준에 있는지 판단한다. 가격이 낮은 수준에 있을 때, PPO 지표가 밑바닥 특성을 나타낸다면, 구매 신호를 발생시킨다.
PPO 지표 반전 특성을 판단하고 가격 위치를 확인하는 이중 판단을 통해 가격 반전 기회를 효과적으로 식별하여 몇 가지 가짜 신호를 필터링하여 신호의 질을 향상시킬 수 있습니다.
PPO 지표의 이중 하위 형태를 이용하여 정확한 구매 시점을 파악할 수 있다.
가격 위치 결정과 결합하여 높은 지점에서 발생하는 가짜 신호를 필터링하여 신호 품질을 향상시킬 수 있다.
PPO 지표는 가격 변화의 트렌드를 빠르게 포착할 수 있는 민감한 지표이며, 트렌드 추적에 적합하다.
이중 확인 메커니즘을 사용하면 거래 위험을 효과적으로 줄일 수 있습니다.
PPO 지표는 거짓 신호를 발생하기 쉽다. 다른 지표로 확인해야 한다. 평평선 지표 또는 변동 지표가 보조할 수 있다.
이중 바닥 반전이 지속될 필요는 없으며, 다시 하락할 위험이 있다. 스톱로스를 설정하고, 포지션 관리를 최적화할 수 있다.
잘못된 매개 변수 설정으로 인해 누락 또는 잘못된 구매의 위험이 발생할 수 있다. 매개 변수 조합을 반복적으로 테스트하여 최적화해야 한다.
더 많은 코드가 있으면 계속 모듈화할 수 있고, 반복되는 코드가 줄어들 수 있다.
스톱로스 모듈을 추가하고, 포지션 관리 전략을 최적화한다.
평균선 지표 또는 변동 지표 보조 확인이 추가된다.
모듈화 코드는 반복적인 판단 논리를 줄여줍니다.
계속 최적화하고 안정성을 높여라.
더 많은 품종의 중매를 시험해보세요.
PPO 가격 감수성 동력 쌍방향 거래 전략은 PPO 지표의 쌍방향 특성을 포착하여 가격 위치 판단에 따른 이중 확인을 통해 가격 역전점에 대한 효과적인 지지를 달성한다. 단일 지표 판단에 비해 판단 정확도와 필터 잡음보다 뛰어난 장점을 가지고 있다. 그러나 이 전략에는 특정 잘못된 위험 신호가 존재하며 지표 포트폴리오를 계속 최적화 할 필요가 있으며 엄격한 포지션 관리 전략에 보조되어 현실에서 안정적으로 수익을 올릴 수 있다.
/*backtest
start: 2024-01-27 00:00:00
end: 2024-01-28 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/
// © luciancapdefier
//@version=4
strategy("PPO Divergence ST", overlay=true, initial_capital=30000, calc_on_order_fills=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// time
FromYear = input(2019, "Backtest Start Year")
FromMonth = input(1, "Backtest Start Month")
FromDay = input(1, "Backtest Start Day")
ToYear = input(2999, "Backtest End Year")
ToMonth = input(1, "Backtest End Month")
ToDay = input(1, "Backtest End Day")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false
source = close
topbots = input(true, title="Show PPO high/low triangles?")
long_term_div = input(true, title="Use long term divergences?")
div_lookback_period = input(55, minval=1, title="Lookback Period")
fastLength = input(12, minval=1, title="PPO Fast")
slowLength=input(26, minval=1, title="PPO Slow")
signalLength=input(9,minval=1, title="PPO Signal")
smoother = input(2,minval=1, title="PPO Smooth")
fastMA = ema(source, fastLength)
slowMA = ema(source, slowLength)
macd = fastMA - slowMA
macd2=(macd/slowMA)*100
d = sma(macd2, smoother) // smoothing PPO
bullishPrice = low
priceMins = bullishPrice > bullishPrice[1] and bullishPrice[1] < bullishPrice[2] or low[1] == low[2] and low[1] < low and low[1] < low[3] or low[1] == low[2] and low[1] == low[3] and low[1] < low and low[1] < low[4] or low[1] == low[2] and low[1] == low[3] and low[1] and low[1] == low[4] and low[1] < low and low[1] < low[5] // this line identifies bottoms and plateaus in the price
oscMins= d > d[1] and d[1] < d[2] // this line identifies bottoms in the PPO
BottomPointsInPPO = oscMins
bearishPrice = high
priceMax = bearishPrice < bearishPrice[1] and bearishPrice[1] > bearishPrice[2] or high[1] == high[2] and high[1] > high and high[1] > high[3] or high[1] == high[2] and high[1] == high[3] and high[1] > high and high[1] > high[4] or high[1] == high[2] and high[1] == high[3] and high[1] and high[1] == high[4] and high[1] > high and high[1] > high[5] // this line identifies tops in the price
oscMax = d < d[1] and d[1] > d[2] // this line identifies tops in the PPO
TopPointsInPPO = oscMax
currenttrough4=valuewhen (oscMins, d[1], 0) // identifies the value of PPO at the most recent BOTTOM in the PPO
lasttrough4=valuewhen (oscMins, d[1], 1) // NOT USED identifies the value of PPO at the second most recent BOTTOM in the PPO
currenttrough5=valuewhen (oscMax, d[1], 0) // identifies the value of PPO at the most recent TOP in the PPO
lasttrough5=valuewhen (oscMax, d[1], 1) // NOT USED identifies the value of PPO at the second most recent TOP in the PPO
currenttrough6=valuewhen (priceMins, low[1], 0) // this line identifies the low (price) at the most recent bottom in the Price
lasttrough6=valuewhen (priceMins, low[1], 1) // NOT USED this line identifies the low (price) at the second most recent bottom in the Price
currenttrough7=valuewhen (priceMax, high[1], 0) // this line identifies the high (price) at the most recent top in the Price
lasttrough7=valuewhen (priceMax, high[1], 1) // NOT USED this line identifies the high (price) at the second most recent top in the Price
delayedlow = priceMins and barssince(oscMins) < 3 ? low[1] : na
delayedhigh = priceMax and barssince(oscMax) < 3 ? high[1] : na
// only take tops/bottoms in price when tops/bottoms are less than 5 bars away
filter = barssince(priceMins) < 5 ? lowest(currenttrough6, 4) : na
filter2 = barssince(priceMax) < 5 ? highest(currenttrough7, 4) : na
//delayedbottom/top when oscillator bottom/top is earlier than price bottom/top
y11 = valuewhen(oscMins, delayedlow, 0)
y12 = valuewhen(oscMax, delayedhigh, 0)
// only take tops/bottoms in price when tops/bottoms are less than 5 bars away, since 2nd most recent top/bottom in osc
y2=valuewhen(oscMax, filter2, 1) // identifies the highest high in the tops of price with 5 bar lookback period SINCE the SECOND most recent top in PPO
y6=valuewhen(oscMins, filter, 1) // identifies the lowest low in the bottoms of price with 5 bar lookback period SINCE the SECOND most recent bottom in PPO
long_term_bull_filt = valuewhen(priceMins, lowest(div_lookback_period), 1)
long_term_bear_filt = valuewhen(priceMax, highest(div_lookback_period), 1)
y3=valuewhen(oscMax, currenttrough5, 0) // identifies the value of PPO in the most recent top of PPO
y4=valuewhen(oscMax, currenttrough5, 1) // identifies the value of PPO in the second most recent top of PPO
y7=valuewhen(oscMins, currenttrough4, 0) // identifies the value of PPO in the most recent bottom of PPO
y8=valuewhen(oscMins, currenttrough4, 1) // identifies the value of PPO in the SECOND most recent bottom of PPO
y9=valuewhen(oscMins, currenttrough6, 0)
y10=valuewhen(oscMax, currenttrough7, 0)
bulldiv= BottomPointsInPPO ? d[1] : na // plots dots at bottoms in the PPO
beardiv= TopPointsInPPO ? d[1]: na // plots dots at tops in the PPO
i = currenttrough5 < highest(d, div_lookback_period) // long term bearish oscilator divergence
i2 = y10 > long_term_bear_filt // long term bearish top divergence
i3 = delayedhigh > long_term_bear_filt // long term bearish delayedhigh divergence
i4 = currenttrough4 > lowest(d, div_lookback_period) // long term bullish osc divergence
i5 = y9 < long_term_bull_filt // long term bullish bottom div
i6 = delayedlow < long_term_bull_filt // long term bullish delayedbottom div
//plot(0, color=gray)
//plot(d, color=black)
//plot(bulldiv, title = "Bottoms", color=maroon, style=circles, linewidth=3, offset= -1)
//plot(beardiv, title = "Tops", color=green, style=circles, linewidth=3, offset= -1)
bearishdiv1 = (y10 > y2 and oscMax and y3 < y4) ? true : false
bearishdiv2 = (delayedhigh > y2 and y3 < y4) ? true : false
bearishdiv3 = (long_term_div and oscMax and i and i2) ? true : false
bearishdiv4 = (long_term_div and i and i3) ? true : false
bullishdiv1 = (y9 < y6 and oscMins and y7 > y8) ? true : false
bullishdiv2 = (delayedlow < y6 and y7 > y8) ? true : false
bullishdiv3 = (long_term_div and oscMins and i4 and i5) ? true : false
bullishdiv4 = (long_term_div and i4 and i6) ? true : false
bearish = bearishdiv1 or bearishdiv2 or bearishdiv3 or bearishdiv4
bullish = bullishdiv1 or bullishdiv2 or bullishdiv3 or bullishdiv4
greendot = beardiv != 0 ? true : false
reddot = bulldiv != 0 ? true : false
if (reddot and window())
strategy.entry("Buy Id", strategy.long, comment="BUY")
if (greendot and window())
strategy.entry("Sell Id", strategy.short, comment="SELL")
alertcondition( bearish, title="Bearish Signal (Orange)", message="Orange & Bearish: Short " )
alertcondition( bullish, title="Bullish Signal (Purple)", message="Purple & Bullish: Long " )
alertcondition( greendot, title="PPO High (Green)", message="Green High Point: Short " )
alertcondition( reddot, title="PPO Low (Red)", message="Red Low Point: Long " )
// plotshape(bearish ? d : na, text='▼\nP', style=shape.labeldown, location=location.abovebar, color=color(orange,0), textcolor=color(white,0), offset=0)
// plotshape(bullish ? d : na, text='P\n▲', style=shape.labelup, location=location.belowbar, color=color(#C752FF,0), textcolor=color(white,0), offset=0)
plotshape(topbots and greendot ? d : na, text='', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0, size=size.tiny)
plotshape(topbots and reddot ? d : na, text='', style=shape.triangleup, location=location.belowbar, color=color.lime, offset=0, size=size.tiny)
//barcolor(bearishdiv1 or bearishdiv2 or bearishdiv3 or bearishdiv4 ? orange : na)
//barcolor(bullishdiv1 or bullishdiv2 or bullishdiv3 or bullishdiv4 ? fuchsia : na)
//barcolor(#dedcdc)