Mustererkennung – Hanging-Neck-Trading-Strategie


Erstellungsdatum: 2023-09-18 14:14:51 zuletzt geändert: 2023-09-18 14:14:51
Kopie: 0 Klicks: 692
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie realisiert Preis-Form-Trading durch die Identifizierung von K-Line-Formen. Sie sucht nach den kürzlich aufgetretenen Pendel-Line-Formen, um nach den Formensignalen zu über- oder unterzugehen. Der Händler kann ein Multiplikator für den Stop-Loss festlegen.

Strategieprinzip

Identifizieren Sie, ob die aktuelle K-Linie den Formenanforderungen der Hängelinie entspricht: Die Entität befindet sich in der unteren Hälfte, der Schlusskurs und der Eröffnungskurs nähern sich den Tiefpunkten. Wenn Sie mehrere Signale machen, befinden Sie sich in der oberen Hälfte, der Schlusskurs nähert sich dem Hochpunkt.

Nach dem Eintritt beginnt die Trendverfolgung, die Stop-Line wird schrittweise in Richtung Gewinn bewegt, die Stop-Loss-Linie bleibt unverändert, bis der Stop oder der Stop-Loss ausgelöst wird.

Analyse der Stärken

  • Nutzung von Signalen zur Identifizierung von Preisformeln, um häufige Transaktionen zu vermeiden
  • Die Stop-Loss-Multiplier sind individuell anpassbar und berücksichtigen Risiken und Erträge.
  • Trend-Tracking-Stopp-Losses lockern mehr Gewinne ein
  • Das ist eine sehr schwierige Aufgabe, die ich nicht bewältigen kann.

Risikoanalyse

  • Die Formerkennung ist nicht zu 100% korrekt.
  • Eine zu geringe Stop-Loss-Range kann durch Preisschwankungen beeinträchtigt werden.
  • Trend-Tracking erfordert eine zeitnahe Bewegung des Stopps.

Das Risiko kann durch Optimierung von Parametern und Hilfsindikatoren verringert werden.

Optimierungsrichtung

  • Verschiedene Stop-Loss-Einstellungen testen
  • In Kombination mit anderen Indikatoren filtern falsche Signale
  • Optimierte Formenerkennungskonditionslogik
  • Testparameter für die Robustheit in verschiedenen Sorten

Zusammenfassen

Die Strategie nutzt die Gestalterkennung, um Handelschancen zu entdecken und zu testen. Die Strategie funktioniert gut. Die Stop-Loss-Einstellung ist vernünftig und kann das Risiko eines einzelnen Handels kontrollieren.

Strategiequellcode
/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// 
// Pinbar strategy script by samgozman (https://github.com/samgozman)
// 
// Detailed instruction how to use this script: https://github.com/samgozman/pinbar-strategy-tradingview
//
// If you liked the script and want to support me: https://paypal.me/sgozman
// 
// ++++++++++ Warning: The script is provided for educational purposes only. ++++++++++ //

strategy('Pinbar strategy', default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000)

profitMultiplier = input.float(2.0, "Profit multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from high")
lossMultiplier =  input.float(1.0, "Loss multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from low")

isTrailingStop = input.bool(true, "Use trailing stops?", group="Trading options", tooltip="Highly recommended!")
isCloseOnOppositSignal = input.bool(false, "Close trade if opposit signal occures?", group="Trading options", tooltip="Close long on short signal")
isLongEligible = input.bool(true, "Enter long trades?", group="Trading options")
isShortEligible = input.bool(true, "Enter short trades?", group="Trading options")

useDateFilter = input.bool(true, title="Begin Backtest at Start Date", group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2021"), title="Start Date", group="Backtest Time Period")

// Predefined time trading zone for back testing
inTradeWindow = true

// HELPER FUNCTIONS //

// calculate candle size for N bars back. Use 0 for current
calcCandle(int periods) =>
    math.abs(high[periods] - low[periods])

// if body is below 50% and close/open below 30%
isBearishPinbar(float candle) =>
    lower30 = low + candle * 0.30
    bottomHalf1 = close < hl2
    bottomHalf2 = open < hl2
    lowerRegion1 = close < lower30
    lowerRegion2 = open < lower30
    
    con1 = bottomHalf1 and bottomHalf2
    con2 = lowerRegion1 and lowerRegion2
    con3 = high > high[1]
    
    con1 and con2 and con3

// if body is above 50% and close/open above 30%  
isBullishPinbar(float candle) =>
    upper30 = high - candle * 0.30
    topHalf1 = close > hl2
    topHalf2 = open > hl2
    upperRegion1 = close > upper30
    upperRegion2 = open > upper30
    
    con1 = topHalf1 and topHalf2
    con2 = upperRegion1 and upperRegion2
    con3 = low < low[1]
    
    con1 and con2 and con3
    
barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na

// Calculate trading signals
currentCandle = calcCandle(0)
longSignal = isBullishPinbar(currentCandle) and inTradeWindow
shortSignal = isBearishPinbar(currentCandle) and inTradeWindow

// ENTER THE TRADE //
if longSignal and isLongEligible
    strategy.entry("buy", strategy.long, when = strategy.position_size == 0)

if shortSignal and isShortEligible 
    strategy.entry("sell", strategy.short, when = strategy.position_size == 0)

// CALCULATE STOPS //
barsSinceEntry = barsSinceLastEntry()
candleFromEntry = calcCandle(barsSinceEntry)
// long
long_take_limit = strategy.position_avg_price + (candleFromEntry*profitMultiplier)
long_target_percent_profit = long_take_limit / strategy.position_avg_price - 1
long_target_percent_loss = (long_target_percent_profit / profitMultiplier) * lossMultiplier
long_stop_limit = low[barsSinceEntry] * (1 - long_target_percent_loss)
//short
short_take_limit = strategy.position_avg_price - (candleFromEntry*profitMultiplier)
short_target_percent_profit = strategy.position_avg_price / short_take_limit - 1
short_target_percent_loss = (short_target_percent_profit / profitMultiplier) * lossMultiplier
short_stop_limit = high[barsSinceEntry] * (1 + short_target_percent_loss)

// EXIT THE TRADE //
if strategy.position_size > 0 or strategy.position_size < 0
    if isTrailingStop
        strategy.exit(id="exit", from_entry="buy", trail_price = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", trail_price = short_take_limit, stop=short_stop_limit)
    else
        strategy.exit(id="exit", from_entry="buy", limit = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", limit = short_take_limit, stop=short_stop_limit)
    if isCloseOnOppositSignal
        strategy.close("buy", when = shortSignal)
        strategy.close("sell", when = longSignal)

// PLOT SIGNALS //
plotshape(longSignal, style=shape.arrowup, color=color.new(color.green, 0), size=size.large, location=location.belowbar)
plotshape(shortSignal, style=shape.arrowdown, color=color.new(color.red, 0), size=size.large, location=location.abovebar)