Ausbruch mit fester Stop-Loss-Strategie


Erstellungsdatum: 2023-11-03 14:31:21 zuletzt geändert: 2023-11-03 14:31:21
Kopie: 0 Klicks: 638
1
konzentrieren Sie sich auf
1621
Anhänger

Ausbruch mit fester Stop-Loss-Strategie

Überblick

Die Hauptidee dieser Strategie ist die Verwendung von Breakouts, um die Richtung des Trends zu erkennen und in Verbindung mit einem festen Stop-Loss Risikomanagement durchzuführen. Die Strategie berechnet zuerst die höchsten und niedrigsten Preise innerhalb eines bestimmten Zeitraums, um eine Breakout-Band zu bilden.

Strategieprinzip

Die Strategie besteht hauptsächlich aus vier Teilen: Positionsmanagement, Breakout-Band-Erkennung, Stop-Loss-Einstellung und Quantifizierung.

Zunächst muss die Strategie feststellen, ob eine Position bereits gehalten wurde. Wenn eine Position bereits gehalten wurde, wird kein neues Signal erzeugt.

Zweitens berechnet die Strategie die Höchst- und Tiefstpreise innerhalb eines bestimmten Zeitraums, um eine Breakout-Band zu bilden. Es wird ein Handelssignal erzeugt, wenn der Preis von der Innenseite des Breakout-Bands nach außen bricht.

Wenn mehrere Signale erzeugt werden, wird die Strategie auch die Breakout-Band-Mitte als Stop-Loss eingestellt. Wenn ein Short-Signal erzeugt wird, wird auch ein Stop-Loss eingestellt. Um den Stop-Loss zu verfolgen, wird die Strategie auch den Stop-Loss in Echtzeit während der Positionshaltung anpassen.

Schließlich erlaubt die Strategie, einen festen Stop-Loss-Betrag festzulegen. Wenn ein Signal erzeugt wird, berechnet die Strategie die Punktentfernung zwischen dem Stop-Loss-Punkt und dem aktuellen Preis. In Kombination mit Faktoren wie Angebotseinheiten und Wechselkursen berechnet die Strategie den Betrag, der durch die Preisänderung zwischen den Stop-Loss-Punkten dargestellt wird.

Das sind die wichtigsten Prinzipien der Strategie. Die Kernidee der Strategie besteht darin, die Richtung der Trends durch eine brechende Band zu identifizieren und die Risiken mit festen Stop-Losses zu kontrollieren.

Analyse der Stärken

Diese Strategie bietet folgende Vorteile:

  1. Die Strategie verwendet einen festen Stop-Loss-Betrag anstelle eines festen Stop-Distance. Dies vermeidet das Problem des unfesten Risikos, das durch unterschiedliche Punktwerte zwischen verschiedenen Sorten verursacht wird. Aus Sicht der Risikomanagement ist der Fixed-Rate-Stop-Loss weiter fortgeschritten.

  2. Die Strategie ist in der Lage, die Anzahl der Geschäfte anhand eines festen Stop-Loss-Betrags intelligent zu berechnen, so dass jeder einzelne Verlust kontrollierbar ist und somit die Risikolockage vernünftigerweise kontrolliert wird.

  3. Durchbruch ist einfach und effektiv. Die Identifizierung von Durchbruchsgrenzen ist einfach und direkt und ermöglicht eine effektive Identifizierung der Trendrichtung. Diese Erkennung von Durchbruchsgrenzen verhindert falsche Signale, die mehr von der Trendrichtung abweichen, als nur ein bestimmtes Preisniveau zu durchbrechen.

  4. Die Strategie kann die Stop-Loss-Position in Echtzeit anpassen, um die Stop-Loss-Verfolgung durchzuführen und dabei zu helfen, mehr Gewinne zu erzielen.

  5. Die Strategie ist für jede Sorte geeignet und hat eine sehr breite Anwendbarkeit, wenn die Parameter so eingestellt sind, dass die Risikokontrolle mit einem festen Stop-Loss erfolgen kann.

  6. Die Code-Struktur ist klar. Die Strategie-Code-Struktur ist klar, die einzelnen Funktionsmodule sind gut aufgelöst, um sie zu verstehen und zu optimieren.

Risikoanalyse

Obwohl diese Strategie die oben genannten Vorteile hat, gibt es einige Risiken, die beachtet werden müssen:

  1. Die Qualität der durchbrochenen Form kann nicht beurteilt werden. Die Qualität der durchbrochenen Form kann nicht in der Strategie beurteilt werden und kann zu Signalen niedriger Qualität führen. Die Filterung muss in Verbindung mit anderen Indikatoren durchgeführt werden.

  2. Fixed Stops können zu mechanisch sein. Marktpreise weisen häufig die Eigenschaften von Hochschauprozessen auf. Fixed Stops können zu sehr auf Regeln angewiesen sein, die nicht flexibel angepasst werden können.

  3. Die Strategie kann die Häufigkeit der Transaktionen nicht begrenzen. Es kann zu häufig gespielt werden. Die Häufigkeit muss in Kombination mit anderen Regeln begrenzt werden.

  4. Die Einstellung des Fixed Stop Losses hängt von den Parametern ab. Die Einstellung des Fixed Stop Losses bezieht sich auf die Gesamthöhlensteuerung und muss in Bezug auf die Größe des Kapitals, die Risikopräferenzen und andere Aspekte angemessen eingestellt werden.

  5. Die Breakout-Richtung kann ein falsches Signal erzeugen. Es kann ein falsches Breakout-Signal erzeugt werden, wenn der Preis schwankt oder rückläuft. Die Optimierung muss mit mehreren Bedingungen kombiniert werden.

  6. Fehlen einer Stop-Loss-Einstellung. Die Strategie hat derzeit keine Stop-Loss-Mechanismen und kann die Gewinne nicht aktiv bestimmen. Dies kann zu unerwünschten Gewinnen führen.

In Bezug auf die oben genannten Risiken können wir Optimierungen in folgenden Bereichen vornehmen:

  1. Hinzufügen von Kennzahlen zur Formbeurteilung, Filter für die Signalqualität.

  2. In Kombination mit dem Durchbruchstärke-Indikator wird die Qualität des Durchbruchs bewertet.

  3. Erhöhung der Frequenzbeschränkung.

  4. Optimieren Sie die Logik der Feststop-Einstellungen. Zum Beispiel ändern Sie die Prozentsatz-Stop-Einstellungen nach bestimmten Schwellenwerten.

  5. Hinzufügen anderer Filterbedingungen, wie z. B. verstärkte Stop-Losses, Preisschwankungen usw.

  6. Hinzufügen von Stopp-Strategien, z. B. Stopp bei der Nähe von Widerstandspunkten

Optimierungsrichtung

Nach den oben beschriebenen Analysen kann die Strategie in folgenden Bereichen optimiert werden:

  1. Erhöhen Sie die Filterbedingungen und verbessern Sie die Signalqualität. Es können verschiedene technische Indikatoren hinzugefügt werden, um die Qualität der Trends zu beurteilen und unerwünschte Durchbruchsignale zu vermeiden. Es kann auch die Durchbruchstärke beurteilt werden.

  2. Optimierung der Stop-Loss-Strategie, um mehr Flexibilität zu bieten. Es ist möglich, den Stop-Loss-Abstand nach einem bestimmten Abstand der Durchbruchsanpassung in einen prozentualen Stop-Loss zu ändern.

  3. Die Frequenz des Handels wird kontrolliert, um Überhändlungen zu vermeiden. Filterbedingungen können für Zeiträume oder Häufigkeit gesetzt werden, um die Frequenz des Handels zu verringern.

  4. In Kombination mit Trend-Kennzahlen wird die Eintrittszeit gewählt. Zum Beispiel wird optimiert, um nach der Trendbestätigung wieder einzutreten.

  5. Optimierung der Stop-Off-Strategie und Erhöhung der Profitabilität. Sie können Zielgewinn, Move-Stop, Variable-Stop usw. festlegen.

  6. Optimierung der Risikoparameter. Es ist möglich, eine bessere Kombination von Parametern zu setzen, die auf den Rückmeldungen basieren, wie z. B. ein fester Stop-Loss-Betrag, eine Breakout-Periode usw.

  7. Verbesserte Code-Struktur, erweiterte Skalierbarkeit. Signalgenerierung, Filterung, Windkontrolle, Gewinnung und andere Module werden weiter entschlüsselt.

  8. Erproben Sie mehr Arbitrageflächen. Beurteilen Sie die Arbitragevorteile verschiedener Artenkombinationen.

Durch diese vielseitige Optimierung kann die Stabilität und Profitabilität der Breakthrough Stop-Loss-Strategie weiter verbessert werden. Gleichzeitig wird die Grundlage für die zukünftige Ausweitung auf weitere Strategie-Kombinationen geschaffen.

Zusammenfassen

Die Strategie ist in ihrer Gesamtheit vernünftig, indem sie Trends mit Durchbruchströmen erkennt und Risikokontrollen mit Fixed-Losses durchführt. Dies ist im Risikomanagement fortschrittlich. Die Methode, die die Anzahl der Geschäfte berechnet, ist auch vernünftig und kann jeden einzelnen Verlust kontrollieren. Die Strategie kann jedoch in vielerlei Hinsicht optimiert werden, um die Signalqualität, die Flexibilität der Stop-Loss-Strategie und die Gewinnqualität zu verbessern.

Strategiequellcode
/*backtest
start: 2023-10-26 00:00:00
end: 2023-10-28 03:00:00
period: 10m
basePeriod: 1m
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/
//@version=4
//@author=Takazudo

strategy("Fixed price SL",
  overlay=true,
  default_qty_type=strategy.fixed,
  initial_capital=0,
  currency=currency.USD)

var COLOR_TRANSPARENT = color.new(#000000, 100)
var COLOR_ENTRY_BAND = color.new(#43A6F5, 30)

//============================================================================
// config
//============================================================================

// Money management
_g1 = 'Money management'
var config_riskPrice = input(100, minval=1, title="Risk price for each entry", group=_g1)
var config_depositCurrency = input(title="Deposit currency", type=input.string, defval="USD", options=["USD"], group=_g1)

// Entry strategy
_g2 = 'Entry strategy'
var config_entryBandBars = input(defval = 100, title = "Entry band bar count",  minval=1, group=_g2)

// Backtesting range
_g3 = 'Backtesting range'
fromYear  = input(defval = 2018, title = "From Year",  minval = 1970, group=_g3)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12, group=_g3)
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31, group=_g3)
toYear  = input(defval = 2020, title = "To Year",  minval = 1970, group=_g3)
toMonth = input(defval = 12,    title = "To Month", minval = 1, maxval = 12, group=_g3)
toDay   = input(defval = 31,    title = "To Day",   minval = 1, maxval = 31, group=_g3)

//============================================================================
// exchange caliculations
//============================================================================

// mico pip size caliculation
// ex1: AUDCAD -> 0.0001
// ex2: USDJPY -> 0.01
f_calcMicroPipSize() =>
    _base = syminfo.basecurrency
    _quote = syminfo.currency
    _result = 0.0001
    if _quote == 'JPY'
        _result := _result * 100
    if _base == 'BTC'
        _result := _result * 100
    _result

// convert price to pips
f_convertPriceToPips(_price) =>
    _microPipSize = f_calcMicroPipSize()
    _price / _microPipSize

// caliculate exchange rate between deposit and quote currency
f_calcDepositExchangeSymbolId() =>
    _result = ''
    _deposit = config_depositCurrency
    _quote = syminfo.currency
    if (_deposit == 'USD') and (_quote == 'USD')
        _result := na
    if (_deposit == 'USD') and (_quote == 'AUD')
        _result := 'OANDA:AUDUSD'
    if (_deposit == 'EUR') and (_quote == 'USD')
        _result := 'OANDA:EURUSD'
    if (_deposit == 'USD') and (_quote == 'GBP')
        _result := 'OANDA:GBPUSD'
    if (_deposit == 'USD') and (_quote == 'NZD')
        _result := 'OANDA:NZDUSD'
    if (_deposit == 'USD') and (_quote == 'CAD')
        _result := 'OANDA:USDCAD'
    if (_deposit == 'USD') and (_quote == 'CHF')
        _result := 'OANDA:USDCHF'
    if (_deposit == 'USD') and (_quote == 'JPY')
        _result := 'OANDA:USDJPY'
    _result

// Let's say we need CAD to USD exchange
// However there's only "OANDA:USDCAD" symbol.
// Then we need to invert the exhchange rate.
// this function tells us whether we should invert the rate or not
f_calcShouldInvert() =>
    _result = false
    _deposit = config_depositCurrency
    _quote = syminfo.currency
    if (_deposit == 'USD') and (_quote == 'CAD')
        _result := true
    if (_deposit == 'USD') and (_quote == 'CHF')
        _result := true
    if (_deposit == 'USD') and (_quote == 'JPY')
        _result := true
    _result

// caliculate how much quantity should I buy or sell
f_calcQuantitiesForEntry(_depositExchangeRate, _slPips) =>
    _microPipSize = f_calcMicroPipSize()
    _priceForEachPipAsDeposit = _microPipSize * _depositExchangeRate
    _losePriceOnSl = _priceForEachPipAsDeposit * _slPips
    floor(config_riskPrice / _losePriceOnSl)

//============================================================================
// Quantity caliculation
//============================================================================

depositExchangeSymbolId = f_calcDepositExchangeSymbolId()

// caliculate deposit exchange rate
rate = security(depositExchangeSymbolId, timeframe.period, hl2)
shouldInvert = f_calcShouldInvert()
depositExchangeRate = if config_depositCurrency == syminfo.currency
    // if USDUSD, no exchange of course
    1
else
    // else, USDCAD to CADUSD invert if we need
    shouldInvert ? (1 / rate) : rate

//============================================================================
// Range Edge caliculation
//============================================================================

f_calcEntryBand_high() =>
    _highest = max(open[3], close[3])
    for i = 4 to (config_entryBandBars - 1)
        _highest := max(_highest, open[i], close[i])
    _highest

f_calcEntryBand_low() =>
    _lowest = min(open[3], close[3])
    for i = 4 to (config_entryBandBars - 1)
        _lowest := min(_lowest, open[i], close[i])
    _lowest

entryBand_high = f_calcEntryBand_high()
entryBand_low = f_calcEntryBand_low()
entryBand_height = entryBand_high - entryBand_low

plot(entryBand_high, color=COLOR_ENTRY_BAND, linewidth=1)
plot(entryBand_low, color=COLOR_ENTRY_BAND, linewidth=1)

rangeBreakDetected_long = entryBand_high < close
rangeBreakDetected_short = entryBand_low > close

shouldMakeEntryLong = (strategy.position_size == 0) and rangeBreakDetected_long
shouldMakeEntryShort = (strategy.position_size == 0) and rangeBreakDetected_short

//============================================================================
// SL & Quantity
//============================================================================

var sl_long = hl2
var sl_short = hl2

entryQty = 0
slPips = 0.0

// just show info bubble
f_showEntryInfo(_isLong) =>
    _str =
      'SL pips: ' + tostring(slPips) + '\n' +
      'Qty: ' + tostring(entryQty)
    _bandHeight = entryBand_high - entryBand_low
    _y = _isLong ? (entryBand_low + _bandHeight * 1/4) : (entryBand_high - _bandHeight * 1/4)
    _style = _isLong ? label.style_label_up : label.style_label_down
    label.new(bar_index, _y, _str, size=size.large, style=_style)

if shouldMakeEntryLong
    sl_long := (entryBand_high + entryBand_low) / 2
    slPips := f_convertPriceToPips(close - sl_long)
    entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips)
if shouldMakeEntryShort
    sl_short := (entryBand_high + entryBand_low) / 2
    slPips := f_convertPriceToPips(sl_short - close)
    entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips)

// trailing SL
if strategy.position_size > 0
    sl_long := max(sl_long, entryBand_low)
if strategy.position_size < 0
    sl_short := min(sl_short, entryBand_high)

//============================================================================
// backtest duration
//============================================================================

// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

//============================================================================
// make entries
//============================================================================

if (true)
    if shouldMakeEntryLong
        strategy.entry(id="Long", long=true, stop=close, qty=entryQty)
        f_showEntryInfo(true)
    if shouldMakeEntryShort
        strategy.entry(id="Short", long=false, stop=close, qty=entryQty)
        f_showEntryInfo(false)

strategy.exit('Long-SL/TP', 'Long', stop=sl_long)
strategy.exit('Short-SL/TP', 'Short', stop=sl_short)

//============================================================================
// plot misc
//============================================================================

sl = strategy.position_size > 0 ? sl_long :
  strategy.position_size < 0 ? sl_short : na

plot(sl, color=color.red, style=plot.style_cross, linewidth=2, title="SL")

value_bgcolor = rangeBreakDetected_long ? color.green :
  rangeBreakDetected_short ? color.red : COLOR_TRANSPARENT

bgcolor(value_bgcolor, transp=95)