SR Breakout-Strategie


Erstellungsdatum: 2024-05-15 16:30:14 zuletzt geändert: 2024-05-15 16:30:14
Kopie: 1 Klicks: 568
1
konzentrieren Sie sich auf
1617
Anhänger

SR Breakout-Strategie

Überblick

Die SR-Breakout-Strategie ist eine Strategie, die auf der Grundlage der Breakout-Finder-Indikatoren von LonesomeTheBlue entwickelt wurde. Die Strategie basiert hauptsächlich darauf, ein Über- oder Untergangssignal zu erzeugen, indem man beurteilt, ob der Schlusskurs die Unterstützung oder die Resistenz überschreitet. Die Default-Einstellung basiert auf der 8-Stunden-K-Linie, aber es gibt eine bessere Parameter-Einstellung auf der 4-Stunden-K-Linie.

Strategieprinzip

  1. Die Pivothigh- und Pivotlow-Funktionen berechnen jeweils die Höhen und Tiefen der vergangenen Perioden und speichern diese in Arrays.
  2. Beurteilen Sie, ob der aktuelle Schlusskurs über dem Widerstand liegt, und wenn ja, beurteilen Sie es als einen bullishen Durchbruch, der ein Mehrwertsignal erzeugt.
  3. Beurteilen Sie, ob der aktuelle Schlusskurs unterhalb der Unterstützung liegt, und wenn ja, beurteilen Sie ihn als Breakout und erzeugen Sie ein Defizitsignal.
  4. Nach der Erzeugung des Handelssignals berechnen Sie den Stop-Loss-Preis und den Stop-Loss-Preis nach dem eingestellten Stop-Loss-Ratio und setzen die entsprechenden Stop-Loss- und Stop-Stop-Orders.
  5. Entsprechende Durchbruchspannen werden entsprechend der Durchbruchrichtung gezeichnet.

Strategische Vorteile

  1. Die Unterstützung von Resistance-Breaking ist eine klassische Handelsstrategie mit einer gewissen Basis im Kampf.
  2. Durch die Berechnung von Unterstützung und Widerstand mit Hilfe der Pivothigh- und Pivotlow-Funktionen kann der Durchbruch mit größerer Genauigkeit erfasst werden.
  3. Die Strategie hat eine klare Code-Struktur, die durch das Speichern von Höhen und Tiefen in Arrays leicht erfasst und optimiert werden kann.
  4. Ein Stop-Loss- und Stop-Stop-System ermöglicht eine bessere Risikokontrolle.

Strategisches Risiko

  1. Die Resistenz-Breakout-Strategie der Stütze funktioniert schlecht bei Erschütterungen und ist anfällig für häufige falsche Breakouts.
  2. Ein fester Stop-Loss-Ratio kann sich nicht an unterschiedliche Umstände anpassen, was zu einem Risiko-Gewinn-Ungleichgewicht führt.
  3. Diese Strategie berücksichtigt nur die Preisfaktoren, ohne andere wichtige Indikatoren wie die Transaktionsmenge zu berücksichtigen, und könnte wichtige Signale übersehen.

Richtung der Strategieoptimierung

  1. Die Einführung weiterer technischer Indikatoren, wie etwa der Transaktionsmenge, der MACD usw., kann in Erwägung gezogen werden, um die Genauigkeit und Zuverlässigkeit des Signals zu verbessern.
  2. Bei Stop-Loss und Stop-Stop kann man die Verwendung von mobilen Stop-Loss- oder dynamischen Stop-Loss-Stop-Raten in Betracht ziehen, um sich besser an unterschiedliche Situationen anzupassen.
  3. Es kann in Betracht gezogen werden, Filterbedingungen einzuführen, wie z. B. Trendfilter, Fluktuationsfilter usw., um falsche Breakouts in einem wackligen Umfeld zu reduzieren.
  4. Eine Optimierung der Unterstützungs- und Widerstandsposition kann in Erwägung gezogen werden, z. B. durch die Verwendung von Adaptionszyklen oder die Einführung von Fibonacci-Ebenen.

Zusammenfassen

Die SR-Breakout-Strategie ist eine Handelsstrategie, die auf der klassischen Breakout-Strategie basiert. Sie berechnet die Unterstützungs- und Widerstandsposition mit Hilfe der Pivothigh- und Pivotlow-Funktionen und erzeugt Handelssignale, indem sie beurteilt, ob der Schlusskurs diese Positionen durchbricht. Der Vorteil der Strategie besteht darin, dass sie klar ist und leicht umzusetzen und zu optimieren ist.

Strategiequellcode
/*backtest
start: 2024-05-07 00:00:00
end: 2024-05-14 00: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/
// © LonesomeTheBlue © chanu_lev10k

//@version=5
strategy('SR Breakout Strategy', overlay=true, max_bars_back=500, max_lines_count=400)
prd = input.int(defval=5, title='Period', minval=2)
bo_len = input.int(defval=71, title='Max Breakout Length', minval=30, maxval=300)
cwidthu = input.float(defval=3., title='Threshold Rate %', minval=1., maxval=10) / 100
mintest = input.int(defval=2, title='Minimum Number of Tests', minval=1)
bocolorup = input.color(defval=color.blue, title='Breakout Colors', inline='bocol')
bocolordown = input.color(defval=color.red, title='', inline='bocol')
// lstyle = input.string(defval=line.style_solid, title='Line Style')
issl = input.bool(title='SL', inline='linesl1', group='Stop Loss / Take Profit:', defval=false)
slpercent = input.float(title=', %', inline='linesl1', group='Stop Loss / Take Profit:', defval=18.0, minval=0.0, step=0.1)
istp = input.bool(title='TP', inline='linetp1', group='Stop Loss / Take Profit:', defval=false)
tppercent = input.float(title=', %', inline='linetp1', group='Stop Loss / Take Profit:', defval=18.0, minval=0.0, step=0.1)

//width
lll = math.max(math.min(bar_index, 300), 1)
float h_ = ta.highest(lll)
float l_ = ta.lowest(lll)
float chwidth = (h_ - l_) * cwidthu

// check if PH/PL
ph = ta.pivothigh(prd, prd)
pl = ta.pivotlow(prd, prd)

//keep Pivot Points and their locations in the arrays
var phval = array.new_float(0)
var phloc = array.new_int(0)
var plval = array.new_float(0)
var plloc = array.new_int(0)

// keep PH/PL levels and locations
if bool(ph)
    array.unshift(phval, ph)
    array.unshift(phloc, bar_index - prd)
    if array.size(phval) > 1  // cleanup old ones
        for x = array.size(phloc) - 1 to 1 by 1
            if bar_index - array.get(phloc, x) > bo_len
                array.pop(phloc)
                array.pop(phval)

if bool(pl)
    array.unshift(plval, pl)
    array.unshift(plloc, bar_index - prd)
    if array.size(plval) > 1  // cleanup old ones
        for x = array.size(plloc) - 1 to 1 by 1
            if bar_index - array.get(plloc, x) > bo_len
                array.pop(plloc)
                array.pop(plval)

// check bullish cup
float bomax = na
int bostart = bar_index
num = 0
hgst = ta.highest(prd)[1]
if array.size(phval) >= mintest and close > open and close > hgst
    bomax := array.get(phval, 0)
    xx = 0
    for x = 0 to array.size(phval) - 1 by 1
        if array.get(phval, x) >= close
            break
        xx := x
        bomax := math.max(bomax, array.get(phval, x))
        bomax
    if xx >= mintest and open <= bomax
        for x = 0 to xx by 1
            if array.get(phval, x) <= bomax and array.get(phval, x) >= bomax - chwidth
                num += 1
                bostart := array.get(phloc, x)
                bostart
        if num < mintest or hgst >= bomax
            bomax := na
            bomax

// if not na(bomax) and num >= mintest
//     line.new(x1=bar_index, y1=bomax, x2=bostart, y2=bomax, color=bocolorup)
//     line.new(x1=bar_index, y1=bomax - chwidth, x2=bostart, y2=bomax - chwidth, color=bocolorup)
//     line.new(x1=bostart, y1=bomax - chwidth, x2=bostart, y2=bomax, color=bocolorup)
//     line.new(x1=bar_index, y1=bomax - chwidth, x2=bar_index, y2=bomax, color=bocolorup)

plotshape(not na(bomax) and num >= mintest, location=location.belowbar, style=shape.triangleup, color=bocolorup, size=size.small)
//alertcondition(not na(bomax) and num >= mintest, title='Breakout', message='Breakout')

// check bearish cup
float bomin = na
bostart := bar_index
num1 = 0
lwst = ta.lowest(prd)[1]
if array.size(plval) >= mintest and close < open and close < lwst
    bomin := array.get(plval, 0)
    xx = 0
    for x = 0 to array.size(plval) - 1 by 1
        if array.get(plval, x) <= close
            break
        xx := x
        bomin := math.min(bomin, array.get(plval, x))
        bomin
    if xx >= mintest and open >= bomin
        for x = 0 to xx by 1
            if array.get(plval, x) >= bomin and array.get(plval, x) <= bomin + chwidth
                num1 += 1
                bostart := array.get(plloc, x)
                bostart
        if num1 < mintest or lwst <= bomin
            bomin := na
            bomin

// if not na(bomin) and num1 >= mintest
//     line.new(x1=bar_index, y1=bomin, x2=bostart, y2=bomin, color=bocolordown)
//     line.new(x1=bar_index, y1=bomin + chwidth, x2=bostart, y2=bomin + chwidth, color=bocolordown)
//     line.new(x1=bostart, y1=bomin + chwidth, x2=bostart, y2=bomin, color=bocolordown)
//     line.new(x1=bar_index, y1=bomin + chwidth, x2=bar_index, y2=bomin, color=bocolordown)

plotshape(not na(bomin) and num1 >= mintest, location=location.abovebar, style=shape.triangledown, color=bocolordown, size=size.small)

//alertcondition(not na(bomin) and num1 >= mintest, title='Breakdown', message='Breakdown')
//alertcondition(not na(bomax) and num >= mintest or not na(bomin) and num1 >= mintest, title='Breakout or Breakdown', message='Breakout or Breakdown')

// Long Short conditions
longCondition = not na(bomax) and num >= mintest
if longCondition
    strategy.entry('Long', strategy.long)
shortCondition = not na(bomin) and num1 >= mintest
if shortCondition
    strategy.entry('Short', strategy.short)

// Entry price / Take Profit / Stop Loss
//entryprice = strategy.position_avg_price
entryprice = ta.valuewhen(condition=longCondition or shortCondition, source=close, occurrence=0)
pm = longCondition ? 1 : shortCondition ? -1 : 1 / math.sign(strategy.position_size)
takeprofit = entryprice * (1 + pm * tppercent * 0.01)
stoploss = entryprice * (1 - pm * slpercent * 0.01)
strategy.exit(id='Exit Long', from_entry='Long', stop=issl ? stoploss : na, limit=istp ? takeprofit : na, alert_message='Exit Long')
strategy.exit(id='Exit Short', from_entry='Short', stop=issl ? stoploss : na, limit=istp ? takeprofit : na, alert_message='Exit Short')