Diese Strategie nutzt das Pinbar-Muster mit Trendbestimmung, indem sie durchschnittlich in die Richtung des Trends bewegt. Sie erzeugt Handelssignale, wenn der Preis aus dem vom Pinbar-Kerzen gebildeten Hoch/Tief bricht. Darüber hinaus verwendet sie schnelle und langsame gleitende Durchschnitte, um die allgemeine Trendrichtung zu bestimmen und falsche Signale während der preisgebundenen Aktion zu vermeiden.
Berechnen Sie schnelle (20-Perioden-) und langsame (50-Perioden-) gleitende Durchschnitte.
Identifizieren Sie auf der Grundlage des Leuchters bullische (schließen> öffnen) und bärische (schließen< öffnen) Pinbars.
Überprüfen Sie, ob der Pinbar-Hoch/Tief den Hohen/Tief der vorherigen Kerze durchbricht. Ein bullischer Pinbar, der den vorherigen Hohen durchbricht, gibt ein langes Signal. Ein bärischer Pinbar, der den vorherigen Tief durchbricht, gibt ein kurzes Signal.
Überprüfen Sie auch, ob der schnelle MA über dem langsamen MA liegt, um einen Aufwärtstrend zu bestimmen, und umgekehrt für einen Abwärtstrend.
Lange Signale sind nur gültig, wenn ein schneller/langsamer MA einen Aufwärtstrend anzeigt. Kurze Signale sind nur gültig, wenn ein schneller/langsamer MA einen Abwärtstrend anzeigt. Dies vermeidet falsche Signale während der Preisaktion im Bereich.
Bei gültigen Long-Signalen gehen Sie mit vordefinierten Stoploss und Takeprofit Long.
Wenn der schnelle MA unter den langsamen MA fällt, schließt man alle bestehenden Positionen.
Benutzt Pinbar-Hoch/Niedrig als Breakout-Niveaus, die einen starken Momentum darstellen.
Betrachtet die Trendrichtung, um falsche Signale während der Preisbewegung im Bereich zu vermeiden und die Genauigkeit zu verbessern.
Er erfasst Trends und Ausbrüche und schlägt sich in Trendmärkten gut ab.
Die Parameter können für verschiedene Produkte und Zeitrahmen optimiert werden.
Das Risiko eines fehlgeschlagenen Ausbruchs kann durch eine größere Ausbruchshöhe und eine stärkere Dynamik gemildert werden.
Ungenaueres Trendidentifizierungsrisiko, das durch Anpassung der MA-Parameter oder durch Hinzufügen anderer Trendindikatoren gemildert werden kann.
Stoploss zu eng, was zu einem vorzeitigen Ausstieg führt, kann den Stoploss dynamisch anhand von Produkt und Zeitrahmen anpassen.
Sie können dynamisch Gewinnziele und Risiko-Rendite-Verhältnisse festlegen.
Insgesamt lassen sich die Parameter MA, Breakout, Stoploss und Takeprofit für alle Produkte und Zeitrahmen für eine maßgeschneiderte Strategie optimieren.
Verschiedene MAs wie EMA, SMA usw. können getestet werden, um den optimalen Indikator zu finden.
Zusätzliche Indikatoren wie Momentum können die Trendgenauigkeit verbessern.
Die Parameter können mit Hilfe von Maschinellen Lerntechniken dynamisch optimiert werden.
Durch statistisches Lernen kann die Erfolgsquote verbessert werden.
Diese Strategie kombiniert Trend und Dynamik für theoretisch gefilterte Signale. Der Schlüssel ist eine robuste Parameteroptimierung über Produkte und Zeitrahmen hinweg für eine gute Leistung. Zusätzlich können Hilfsindikatoren und Machine-Learning-Techniken die Strategie weiter verbessern. Mit kontinuierlichen Verbesserungen kann dies zu einem robusten Trend-Breakout-Handelssystem werden.
/*backtest start: 2023-10-15 00:00:00 end: 2023-11-14 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //Backtested Time Frame: H1 //Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting. //Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK. //Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties. strategy("Pin Bar Strategy v1", overlay=true) // User Input usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false) atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=1.9,confirm=false) trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false) sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false) sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false) atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false) use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false) slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false) slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false) emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,confirm=false) ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false) // Create Indicators fastSMA = sma(close, sma_fast) slowSMA = sma(close, sma_slow) bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low))) bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low))) atr = atr(atr_valu) // Specify Trend Conditions smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4]) smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4]) candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10]) candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10]) // Specify Piercing Conditions bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA)) bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA)) // MA Slope Function angle(_source) => rad2degree=180/3.14159265359 ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu)) // Calculate MA Slope fastSlope=angle(fastSMA) slowSlope=angle(slowSMA) slopingUp = fastSlope > slp_long slopingDn = fastSlope < slp_shrt // Specify Entry Conditions longEntry = smaUpTrend and bullishPinBar and bullPierce shortEntry = smaDnTrend and bearishPinBar and bearPierce longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn // Specify Secondary Exit Conditions longExit = crossunder(fastSMA, slowSMA) shortExit = crossover(fastSMA, slowSMA) // Long Entry Function enterlong() => risk = usr_risk * 0.01 * strategy.equity stopLoss = low[1] - atr[1] * atr_mult entryPrice = high[1] units = risk / (entryPrice - stopLoss) takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss) strategy.entry("long", strategy.long, units, stop=entryPrice) strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit) // Short Entry Function entershort() => risk = usr_risk * 0.01 * strategy.equity stopLoss = high[1] + atr[1] * atr_mult entryPrice = low[1] units = risk / (stopLoss - entryPrice) takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice) strategy.entry("short", strategy.short, units, stop=entryPrice) strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit) // Execute Long Entry w/o Slope if (longEntry and use_slpe == false) enterlong() // Execute Long Entry w/ Slope if (longEntryWithSlope and use_slpe == true) enterlong() // Exit Long Due to Re-Cross if(longExit and strategy.position_size > 0 and emg_exit) strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size)) // Cancel the Long Entry strategy.cancel("long", barssince(longEntry) > ent_canc) // Execute Short Entry w/o Slope if (shortEntry and use_slpe == false) entershort() // Execute Short Entry w/ Slope if (shortEntryWithSlope and use_slpe == true) entershort() // Exit Short Due to Re-Cross if(shortExit and strategy.position_size < 0 and emg_exit) strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size)) // Cancel the Short Entry strategy.cancel("short", barssince(shortEntry) > ent_canc) // Plot Moving Averages to Chart plot(fastSMA, color=color.red) plot(slowSMA, color=color.blue) // Plot Pin Bars to Chart plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='') plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')