
Die Strategie nutzt das Prinzip des Verteilerbruchs, um in Kombination mit Trendbeurteilungen über bewegliche Durchschnitte einen Durchbruch in die Richtung des Trends zu erzielen. Es wird ein Handelssignal erzeugt, wenn der Preis die Grenze des Verteilergraphen überschreitet. Gleichzeitig wird die Gesamttrendrichtung durch die Bestimmung der Positionsbeziehungen zwischen schnellen und langsamen beweglichen Durchschnittswerten bestimmt, um ein falsches Signal während der gesamten Pause zu vermeiden.
Berechnen Sie einen schnellen gleitenden Durchschnitt (< 20 Zyklen) und einen langsamen gleitenden Durchschnitt (< 50 Zyklen).
Berechnen Sie anhand der K-Linie, ob ein aufsteigender oder ein fallender Rechteck entstanden ist.
Beurteilen Sie, ob die Länge die höchste oder die niedrigste der vorherigen K-Linien überschritten hat. Wenn es sich um eine steigende Länge handelt, die die höchste der vorherigen K-Linien überschritten hat, wird ein Mehrkopf-Bruchsignal erzeugt. Wenn es sich um eine fallende Länge handelt, die die niedrigste der vorherigen K-Linien überschritten hat, wird ein Luftbruchsignal erzeugt.
Beurteilen Sie gleichzeitig, ob der schnelle bewegliche Durchschnitt über dem langsamen beweglichen Durchschnitt liegt, und wenn ja, beurteilen Sie ihn als einen mehrköpfigen Trend; umgekehrt beurteilen Sie ihn als einen leeren Trend.
Ein Mehrspitzen-Breakout-Signal ist nur dann wirksam, wenn ein schneller/langsamer Durchschnitt als mehrspitziger Trend beurteilt wird; ein mehrspitziger Durchbruch-Signal ist nur dann wirksam, wenn ein schneller/langsamer Durchschnitt als oberflächlicher Trend beurteilt wird. Dies vermeidet ein falsches Signal bei der Berechnung.
Wenn ein wirksames mehrköpfiges Durchbruchsignal erzeugt wird, werden mehrere Karten nach bestimmten Stop-and-Stop-Standards eröffnet. Wenn ein wirksames Luftbruchsignal erzeugt wird, werden leere Karten nach bestimmten Stop-and-Stop-Standards eröffnet.
Wenn der schnelle Moving Average und der langsame Moving Average sich abzweigen, wird die aktuelle Position ausgeglichen.
Die Verwendung von Verteilergrenzen als Durchbruchsöffnung bedeutet ein stärkeres Durchbruchssignal.
Gleichzeitig sollte die Richtung der Trends berücksichtigt werden, um Fehlsignale bei der Berechnung zu vermeiden und die Genauigkeit zu verbessern.
Trends und Breakthroughs werden berücksichtigt, damit die Strategie in einem Trendmodus gut abschneidet.
Durch die Optimierung der Parameter kann sie an verschiedene Sorten und Zeitspannen angepasst werden.
Das Risiko, dass ein Durchbruch fehlschlägt. Die Lösung besteht darin, einen größeren Durchbruch zu wählen, um sicherzustellen, dass die Durchbruchdynamik stärker ist.
Risiko für ungenaue Trendbestimmung. Die Lösung besteht darin, die Durchschnittsparameter anzupassen, aber auch andere Hilfsindikatoren für die Trendbestimmung hinzuzufügen.
Das Risiko, dass eine zu kleine Stop-Loss-Einstellung zu häufigen Stop-Losses führt. Die Lösung besteht darin, die Stop-Loss-Gradualität an die Dynamik der verschiedenen Sorten und Zeiträume anzupassen.
Das Risiko, dass der Gewinnraum zu klein eingestellt wird. Die Lösung besteht darin, unterschiedliche Gewinn- und Verlustquoten für verschiedene Sorten und Zeitzyklusdynamiken einzustellen.
Insgesamt müssen die Moving Average-Parameter, die Breakout-Parameter, die Stop-Loss-Margen und die Ertrags- und Verlustquote getestet und optimiert werden, um die Strategie-Parameter auf verschiedene Sorten und Zeitspannen anzupassen.
Verschiedene Arten von Moving Averages (z. B. EMA, SMA) können getestet werden, um nach geeigneteren Mittelwerten zu suchen.
Es können weitere Hilfsindikatoren wie Momentum und andere hinzugefügt werden, um eine bessere Genauigkeit bei der Beurteilung von Trends zu erzielen.
Die Parameter können dynamisch optimiert werden, z. B. durch maschinelles Lernen.
Die Durchbruchparameter können anhand der Erfolgsrate der Durchbrechungen statistisch erlernt und angepasst werden.
Die Strategie integriert Trend- und Breakout-Eigenschaften und kann in der Theorie eine große Anzahl von unwirksamen Signalen ausfiltern. Der Schlüssel ist, dass der Test und die Optimierung der Parameter berücksichtigt werden, so dass die Strategie für verschiedene Sorten und Zeiträume angepasst wird, um bessere Ergebnisse im tatsächlichen Handel zu erzielen. Zusätzlich bieten die Hilfsindikatoren und die maschinellen Lerntechniken eine Richtung für die Verbesserung der Strategie.
/*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='')