Grundlegende Handelsstrategie für Pinbar

Schriftsteller:ChaoZhang, Datum: 2023-11-15 15:25:57
Tags:

img

Übersicht

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.

Strategie Logik

  1. Berechnen Sie schnelle (20-Perioden-) und langsame (50-Perioden-) gleitende Durchschnitte.

  2. Identifizieren Sie auf der Grundlage des Leuchters bullische (schließen> öffnen) und bärische (schließen< öffnen) Pinbars.

  3. Ü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.

  4. Ü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.

  5. 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.

  6. Bei gültigen Long-Signalen gehen Sie mit vordefinierten Stoploss und Takeprofit Long.

  7. Wenn der schnelle MA unter den langsamen MA fällt, schließt man alle bestehenden Positionen.

Vorteile

  • 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.

Risiken und Minderung

  • 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.

Möglichkeiten zur Verbesserung

  • 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.

Zusammenfassung

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='')

Mehr