PPO Preissensitive Momentum-Double-Bottom-Directional-Trading-Strategie


Erstellungsdatum: 2024-01-29 11:38:42 zuletzt geändert: 2024-01-29 11:38:42
Kopie: 0 Klicks: 619
1
konzentrieren Sie sich auf
1617
Anhänger

PPO Preissensitive Momentum-Double-Bottom-Directional-Trading-Strategie

Überblick

Die PPO-Price Sensitivity Dynamics Binary-Orientierung ist eine Handelsstrategie, bei der der Preis-Sensitivity-Dynamics-Indikator genutzt wird, um Trends zu verfolgen, die die Preis-Dynamics bilden. Es kombiniert die Binary-Bildung der PPO-Indikatoren mit der Preis-Dynamics-Charakteristik, um die genaue Position des Preis-Dynamics-Wendepunkts zu ermitteln und somit ein Handelssignal zu erzeugen.

Strategieprinzip

Die Strategie nutzt die PPO-Anzeige, um die doppelte Basis zu bestimmen, und die niedrigsten Punkte in Verbindung mit dem Preis zu bestimmen, um in Echtzeit zu überwachen, ob die PPO-Anzeige eine Bottom-Charakteristik aufweist. Wenn die PPO-Anzeige eine doppelte Basis aufweist, die von unten nach oben umgedreht wird, zeigt dies, dass sie sich derzeit an einem Kaufgelegenheitspunkt befindet.

Auf der anderen Seite arbeitet die Strategie mit dem Preisminimum zusammen, um zu bestimmen, ob der Preis in einem niedrigen Bereich ist. Wenn der Preis in einem niedrigen Bereich ist, erzeugt der PPO-Indikator ein Kaufsignal, wenn ein Bodenzeichen auftritt.

Durch die doppelte Beurteilung der PPO-Indikator-Umkehrcharakteristik und der Bestätigung der Preisposition kann die Chance auf eine Preisumkehr effektiv erkannt, einige falsche Signale gefiltert und die Qualität der Signale verbessert werden.

Analyse der Stärken

  1. Die Doppel-Boden-Form des PPO-Indikators ermöglicht eine genaue Bestimmung des Kaufzeitpunkts.

  2. In Kombination mit der Bestimmung der Preisposition kann das falsche Signal, das von höheren Punkten erzeugt wird, gefiltert und die Signalqualität verbessert werden.

  3. Die PPO-Indikatoren sind empfindlich und können schnell Trendveränderungen bei den Preisen erfassen. Sie sind geeignet, Trends zu verfolgen.

  4. Die Verwendung von Doppelbestätigungsmechanismen verringert das Transaktionsrisiko.

Risiken und Lösungen

  1. PPO-Indikatoren sind leicht zu falschen Signalen und müssen mit anderen Indikatoren bestätigt werden. Sie können mit einem Gleichgewichts- oder Schwankungsindikator unterstützt werden.

  2. Die doppelte Bottom-Reversal ist nicht dauerhaft, es besteht die Gefahr, wieder zu fallen. Sie können einen Stop-Loss-Punkt setzen, um die Positionsverwaltung zu optimieren.

  3. Unkorrekt eingestellte Parameter können zu einem Risiko von Leakage oder Fehlverkäufen führen. Die Parameterkombinationen müssen wiederholt getestet und optimiert werden.

  4. Es gibt eine große Menge an Code, der weiter modularisiert werden kann, wodurch die Anzahl der Duplikate reduziert wird.

Optimierungsrichtung

  1. Die Einführung eines Stop-Loss-Moduls und die Optimierung der Positionsmanagement-Strategie.

  2. Zusätzliche Bestätigung durch die Einführung von Mittellinien- oder Schwankungsindikatoren.

  3. Modularisierte Codes, reduziert die Logik der Wiederholung der Urteile.

  4. Weiter optimieren, um die Stabilität zu verbessern.

  5. Test der Anwendung von Arbitrage bei weiteren Sorten.

Zusammenfassen

Die PPO-Preissensitivitätsdynamik bi-Basis-orientierte Handelsstrategie ermöglicht die effektive Positioning für die Preiswendepunkte durch die Erfassung der doppelten Basis-Charakteristik des PPO-Indikators in Verbindung mit der doppelten Bestätigung der Preisposition. Im Vergleich zu einer einzelnen Indikatorentscheidung hat die Strategie den Vorteil, dass sie eine genauere Urteilsfähigkeit und ein besseres Geräuschfilter hat.

Strategiequellcode
/*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)