Präzise Trend Breakout-Handelsstrategie


Erstellungsdatum: 2023-11-02 16:26:22 zuletzt geändert: 2023-11-02 16:26:22
Kopie: 0 Klicks: 692
1
konzentrieren Sie sich auf
1617
Anhänger

Präzise Trend Breakout-Handelsstrategie

Überblick

Die Strategie basiert auf einem Trendindikator und einer bestimmten K-Linienform, um den Trend exakt zu erfassen. Die Strategie verwendet die Trendrichtung, den RSI-Indikator, um Überkauf und Überverkauf zu ermitteln, und kombiniert mit einer hochentwickelten K-Linienform, um den Trend exakt zu ermitteln und zu einem geeigneten Zeitpunkt den Trend zu durchbrechen.

Strategieprinzip

  1. Die 8-Tage-EMA und die 80-Tage-EMA werden verwendet, um die Richtung des Trends zu bestimmen. Die 8-Tage-EMA wird über der 80-Tage-EMA als Positiv und umgekehrt als Positiv definiert. Die Handelssignale werden nur berücksichtigt, wenn die Richtung des Trends übereinstimmt.

  2. Definition einer bestimmten Kombinationsform der drei K-Linien, d. h. der erste K-Linien-Tiefpunkt ist niedriger als der zweite und der dritte K-Linien-Tiefpunkt ist niedriger als der zweite. Diese Form tritt während eines Aufwärtstrends als Kaufsignal auf.

  3. Die dritte K-Linie ist die interne K-Linie, d.h. der beste Signalpunkt, wenn der Schlusskurs innerhalb der vorherigen K-Linie liegt. An diesem Punkt kann ein 123-Format direkt auf den Handel übertragen werden.

  4. Der Auftragspreis ist der dritte K-Linie-Hochpunkt ((kaufen) oder der dritte K-Linie-Tiefpunkt ((verkaufen)). Der Stop-Loss ist der zweite K-Linie-Tiefpunkt ((kaufen) oder der zweite K-Linie-Hochpunkt ((verkaufen)). Der Stop-Loss ist die doppelte Risikogrenze.

  5. Wenn die Trend-, Form- und Indikatorbedingungen erfüllt sind, wird ein Breakout-Auftrag mit einer hohen Wahrscheinlichkeit gehandelt. Es wird ein Stop-Loss-Stopp eingerichtet, um den Gewinn zu sperren und einen robusten Breakout zu ermöglichen.

Analyse der Stärken

Diese Strategie hat folgende wesentliche Vorteile:

  1. Es ist wichtig, dass Sie mit einer doppelten EMA die Richtung der großen Trends bestimmen, um einen Abweichhandel zu vermeiden.

  2. K-Linien-Form-Filterung für bahnbrechende Formen, um die Gewinnwahrscheinlichkeit zu erhöhen.

  3. Die Signalqualität wird nur sichergestellt, wenn die Trend-, Form- und Preisdifferenzindikatoren übereinstimmen.

  4. Die interne K-Line-Form erhöht die Signalsicherheit und ermöglicht eine weitere Sperrung der Transaktionszeit.

  5. Ein Stop-Loss-Stopp-Punkt ist vorab festgelegt, um das Risiko für einzelne Transaktionen effektiv zu kontrollieren.

  6. Die Rückmeldungsdaten bestätigen, dass die Gewinnrate über 65% liegt und einen statistischen Vorteil für langfristige Gewinne aufweist.

Insgesamt nutzt die Strategie eine umfassende Beurteilung von Trends, Formen und Indikatoren, um die Durchbruchsmomente genau zu orientieren, mit einem stabilen Risiko-Gewinn-Vorteil.

Risikoanalyse

Die Hauptrisiken dieser Strategie sind:

  1. Trends werden falsch beurteilt und falsche Signale bei Erschütterungen erzeugt. Es können mehr Trendindikatoren eingeführt werden, um eine mehrdimensionale Bestätigung zu ermöglichen.

  2. Eine einzelne Stop-Loss-Stop-Methode kann nicht für jede Situation perfekt sein. Es kann eine Floating Stop-Loss-Stop-Punkt-Position eingestellt werden.

  3. Die K-Linienformerkennung ist abhängig von Parameter-Einstellungen, die wiederholt optimiert werden müssen, um die beste Kombination zu finden.

  4. Es ist unmöglich, die Auswirkungen eines plötzlichen großen Black Swan-Vorfalls auf den Handel vorherzusagen. Es wird empfohlen, Positionskontrolle zu verwenden und Positionen in Gruppen aufzubauen.

  5. Die Rückmeldung ist nicht repräsentativ für die tatsächlichen Transaktionen. Es besteht die Gefahr einer Überanpassung. Die Parameter müssen streng überprüft werden.

  6. Die Transaktionskosten haben einen großen Einfluss auf die Hochfrequenz-Trading-Strategie. Es sollte sichergestellt werden, dass die Gewinn- und Verlustquote ausreichend ist, um die Kosten zu decken.

Insgesamt kann die Strategie durch die Optimierung der Parameterkonfiguration, die Einführung von mehr Urteilsdimensionen und die Kontrolle der Positionsgröße die Risiken effektiv reduzieren und die Leistungsstabilität verbessern.

Optimierungsrichtung

Die Strategie hat noch mehrere Optimierungsmöglichkeiten:

  1. Test mehr K-Linien-Perioden-Parameter, um eine stabilere Kombination von Parametern zu bestimmen.

  2. Mehrfache Bestätigung der Transaktionszahlen, um falsche Durchbrüche zu vermeiden.

  3. Steigerung der Sharp Rate, der Gewinn-Verlust-Rate und der Stärke der Bewertungsparameter.

  4. Die Einführung eines Stop-Stop-Tracking-Mechanismus ermöglicht eine dynamische und kontrollierbare Ertragsentwicklung.

  5. Der Panik-Index VIX vermeidet eine Phase der Unsicherheit auf dem Markt.

  6. Verschiedene Haltezeitparameter werden getestet, um die optimale Haltezeit zu bestimmen.

  7. Optimierung der Stop-Loss-Mechanismen, um zu vermeiden, dass die vorgegebene statische Stop-Loss-Regelung zu steif ist.

Durch die oben genannten Mittel können die Stabilität, Flexibilität und Profitabilität der Strategie weiter verbessert werden.

Zusammenfassen

Die exakte Trendbreaking-Handelsstrategie nutzt erfolgreich die organische Kombination von Trend, Form und Stop-Loss-Stopp, um eine hohe Wahrscheinlichkeit für Trendbreaking zu erreichen. Es hat die Eigenschaften von klaren Handelssignalen, einer Vielzahl von Indikatoren und einem kontrollierbaren Risiko. Es ist eine effiziente Strategie, die für trendbewusste Verhaltensweisen geeignet ist.

Strategiequellcode
/*backtest
start: 2022-11-01 00:00:00
end: 2023-10-14 05:20:00
period: 1d
basePeriod: 1h
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/
// © julianossilva

//@version=5
strategy(title="J2S Backtest: 123-Stormer Strategy",
         shorttitle="J2S Backtest: 123-Stormer Strategy",
         overlay=true, initial_capital=1000, default_qty_value=10,
         default_qty_type = strategy.percent_of_equity, pyramiding=0)

// Initial Backtest Date Range
useStartDate = timestamp("01 Jan 2020 21:00:00")
useEndDate   = timestamp("01 Jan 2023 21:00:00")

// User Inputs
SIGNAL_CONFIG          = "BACKTEST: STORMER STRATEGY (123)"
longEntryInput         = input.bool(defval=true,         title="Long Entry",                     group=SIGNAL_CONFIG)
shortEntryInput        = input.bool(defval=true,         title="Short entry",                    group=SIGNAL_CONFIG)
thresholdForEntryInput = input.int(defval=3,             title="Threshold on clandes for entry", group=SIGNAL_CONFIG)
insideBarStrategyTitle = "Only third candle inside bar is valid"
insideBarStrategyTip   = "According to Stomer, it would be the best signal for the strategy"
insideBarStrategyInput = input.bool(defval=true,         title=insideBarStrategyTitle,           group=SIGNAL_CONFIG, tooltip=insideBarStrategyTip)
EMA_CONFIG             = "BACKTEST: EXPONENTIAL MOVING AVERAGES"
sourceInput            = input.source(defval=close,      title="Source",           inline="01",  group=EMA_CONFIG)
emaTimeframeInput      = input.timeframe("1W",           title="Timeframe",        inline="01",  group=EMA_CONFIG)
emaOffsetInput         = input.int(defval=8,             title="Offset",           inline="01",  group=EMA_CONFIG)
fastEMALengthInput     = input.int(defval=8,             title="Fast EMA Length",  inline="02",  group=EMA_CONFIG)
useFastEMAInput        = input.bool(defval=true,         title="Use Fast EMA",     inline="02",  group=EMA_CONFIG)
slowEMALengthInput     = input.int(defval=80,            title="Slow EMA Length",  inline="03",  group=EMA_CONFIG)
useSlowEMAInput        = input.bool(defval=true,         title="Use Slow EMA",     inline="03",  group=EMA_CONFIG)
PERIOD_CONFIG          = "BACKTEST: TIME PERIOD"
useDateFilterInput     = input.bool(defval=true,         title="Filter Date Range of Backtest",  group=PERIOD_CONFIG)
backtestStartDateInput = input(defval=useStartDate, title="Start Date",                     group=PERIOD_CONFIG)
backtestEndDateInput   = input(defval=useEndDate,   title="End Date",                       group=PERIOD_CONFIG)

// Colors
bbBackgroundColor  = color.rgb(33, 150, 243, 90)
candleColorDown    = color.rgb(239, 83, 80, 80)
candleColorUp      = color.rgb(38, 166, 154, 70)
insideBarColorDown = color.rgb(239, 83, 80, 40)
insideBarColorUp   = color.rgb(38, 166, 154, 20)
downTrendColor     = color.rgb(239, 83, 80, 80)
sidewaysTrendColor = color.rgb(252, 232, 131, 80)
upTrendColor       = color.rgb(38, 166, 154, 80)
buySignalColor     = color.lime
sellSignalColor    = color.orange

// Candles
isCandleUp()   => close > open
isCandleDown() => close <= open
barcolor(isCandleUp() ? candleColorUp : isCandleDown() ? candleColorDown : na)

// Exponential Moving Averages
fastEMA         = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput),    barmerge.gaps_on,  barmerge.lookahead_on)
currentFastEMA  = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput),    barmerge.gaps_off, barmerge.lookahead_on)
previousFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
slowEMA         = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput),    barmerge.gaps_on,  barmerge.lookahead_on)
currentSlowEMA  = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput),    barmerge.gaps_off, barmerge.lookahead_on)
previousSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)

// Trend Rules for Exponential Moving Averages
isSlowEMAUp()   => currentSlowEMA > previousSlowEMA
isSlowEMADown() => currentSlowEMA < previousSlowEMA
isFastEMAUp()   => currentFastEMA > previousFastEMA
isFastEMADown() => currentFastEMA < previousFastEMA

// Exponential Moving Average Colors
fastEMAColor = isFastEMAUp() ? upTrendColor : isFastEMADown() ? downTrendColor : sidewaysTrendColor
slowEMAColor = isSlowEMAUp() ? upTrendColor : isSlowEMADown() ? downTrendColor : sidewaysTrendColor

// Display Exponential Moving Averages
plot(useFastEMAInput ? fastEMA : na, offset=emaOffsetInput, color=fastEMAColor, title="Fast EMA", style=plot.style_line, linewidth=4)
plot(useSlowEMAInput ? slowEMA : na, offset=emaOffsetInput, color=slowEMAColor, title="Slow EMA", style=plot.style_line, linewidth=7)

// Price Trend
pricesAboveFastEMA() => low[2] > currentFastEMA and low[1] > currentFastEMA and low > currentFastEMA
pricesAboveSlowEMA() => low[2] > currentSlowEMA and low[1] > currentSlowEMA and low > currentSlowEMA
pricesBelowFastEMA() => high[2] < currentFastEMA and high[1] < currentFastEMA and high < currentFastEMA
pricesBelowSlowEMA() => high[2] < currentSlowEMA and high[1] < currentSlowEMA and high < currentSlowEMA

// Market in Bullish Trend
isBullishTrend() =>
    if useFastEMAInput and useSlowEMAInput
        pricesAboveFastEMA() and pricesAboveSlowEMA()
    else if useFastEMAInput
        pricesAboveFastEMA()
    else if useSlowEMAInput
        pricesAboveSlowEMA()
    else
        na

// Market in Bearish Trend
isBearishTrend() =>
    if useFastEMAInput and useSlowEMAInput
        pricesBelowFastEMA() and pricesBelowSlowEMA()
    else if useFastEMAInput
        pricesBelowFastEMA()
    else if useSlowEMAInput
        pricesBelowSlowEMA()
    else
        na

// Stormer Strategy (123)
isFirstCandleUp()   => high[2] > high[1] and low[2] > low[1]
isFirstCandleDown() => high[2] < high[1] and low[2] < low[1]
isThirdCandleUp()   => low > low[1]
isThirdCandleDown() => high < high[1]
isThirdCandleInsideBar() => high < high[1] and low > low[1]

// Buy Signal
isStormer123Buy() =>
    if insideBarStrategyInput
        longEntryInput and isFirstCandleUp() and isThirdCandleInsideBar() and isBullishTrend()
    else
        longEntryInput and isFirstCandleUp() and isThirdCandleUp() and isBullishTrend()

// Sell Signal
isStormer123Sell() =>
    if insideBarStrategyInput
        shortEntryInput and isFirstCandleDown() and isThirdCandleInsideBar() and isBearishTrend()
    else
        shortEntryInput and isFirstCandleDown() and isThirdCandleDown() and isBearishTrend()

// Backtest Time Period
inTradeWindow             = true
isInTradeWindow()         => inTradeWindow
isBacktestDateRangeOver() => not inTradeWindow and inTradeWindow[1]

// Backtest Price Parameters
highestPrice = ta.highest(high, 3)
lowestPrice  = ta.lowest(low,3)
priceRange   = highestPrice - lowestPrice

// Stormer Strategy (123): LONG
var myLongOrders = array.new_int(0)
longtEntryID     = "Long Entry:\n" + str.tostring(bar_index)
longExitID       = "Long Exit:\n" + str.tostring(bar_index)
stopLossInLong   = lowestPrice + 0.01
takeProfitInLong = priceRange + high

longEntryHasBeenMet = isInTradeWindow() and isBullishTrend() and isStormer123Buy()

// Scheduling LONG entry
if longEntryHasBeenMet
    array.push(myLongOrders, bar_index)
    strategy.order(longtEntryID, strategy.long, stop=high)
    strategy.exit(longExitID, longtEntryID, stop=stopLossInLong, limit=takeProfitInLong)

// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myLongOrders) == 0 ? na : array.size(myLongOrders) - 1)
    myLongOrder = array.get(myLongOrders, myOrderIndex)
    if bar_index - myLongOrder == thresholdForEntryInput
        longEntryID = "Long Entry:\n" + str.tostring(myLongOrder)
        strategy.cancel(longEntryID)

// Stormer Strategy (123): SHORT
var myShortOrders = array.new_int(0)
shortEntryID      = "Short Entry:\n" + str.tostring(bar_index)
shortExitID       = "Short Exit:\n" + str.tostring(bar_index)
stopLossInShort   = highestPrice + 0.01
takeProfitInShort = low - priceRange

shortEntryHasBeenMet = isInTradeWindow() and isBearishTrend() and isStormer123Sell()

// Scheduling SHORT entry
if shortEntryHasBeenMet
    array.push(myShortOrders, bar_index)
    strategy.order(shortEntryID, strategy.short, stop=low)
    strategy.exit(shortExitID, shortEntryID, stop=stopLossInShort, limit=takeProfitInShort)

// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myShortOrders) == 0 ? na : array.size(myShortOrders) - 1)
    myShortOrder = array.get(myShortOrders, myOrderIndex)
    if bar_index - myShortOrder == thresholdForEntryInput
        shortEntryID := "Short Entry:\n" + str.tostring(myShortOrder)
        strategy.cancel(shortEntryID)

// Close all positions at the end of the backtest period
if isBacktestDateRangeOver()
    strategy.cancel_all()
    strategy.close_all(comment="Date Range Exit")

// Display Signals
plotshape(series=longEntryHasBeenMet,  title="123 Buy",  style=shape.triangleup,   location=location.belowbar, color=buySignalColor,  text="123", textcolor=buySignalColor)
plotshape(series=shortEntryHasBeenMet, title="123 Sell", style=shape.triangledown, location=location.abovebar, color=sellSignalColor, text="123", textcolor=sellSignalColor)