Cross-Cycle-Richtungsstrategie


Erstellungsdatum: 2023-09-27 16:30:51 zuletzt geändert: 2023-09-27 16:30:51
Kopie: 0 Klicks: 684
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie verwendet überkreisende technische Indikatoren zur Identifizierung von Trendrichtungen, kombiniert mit Trendfilter und Schwankungsfilter, um einen risikoarmen Trend-Tracking-Handel zu ermöglichen.

Strategieprinzip

  1. Verwenden Sie die Hoch-Low-Breakout, um ein Kauf- oder Verkaufssignal zu ermitteln. Wenn der Preis die 7-Zyklus-Hochpunkte überschreitet, sehen Sie nach unten, wenn er die 7-Zyklus-Tiefpunkte überschreitet, sehen Sie nach oben.

  2. Der Trendflex-Indikator beurteilt die Richtung des Haupttrends. Der Indikator kombiniert die Dual-Gliederungstechnik, um die Trendmitte effektiv zu identifizieren. Werte über 1 zeigen einen Aufwärtstrend an, Werte unter -1 einen Abwärtstrend. Hier verlangen wir, dass der Trendflex > 1 Stunde lang und < -1 Stunde kurz ist, um die Platte zu filtern.

  3. Die Bollinger Bands-Wirbel erlaubt die Identifizierung von Schwingungsbereichen. Wenn der Preis in der Nähe der Bands ist, vermeiden Sie eine übermäßige Leerstellung.

  4. Die Position wird mit einem mobilen Stop-Loss und einem mobilen Stopp verwaltet.

Analyse der Stärken

  1. Die Kombination von doppelter Ausgleichstechnik mit einem interzyklischen Indikator ermöglicht eine effiziente Identifizierung der Trendrichtung und vermeidet die Beeinträchtigung durch Marktschwankungen.

  2. Der Trend wird in der Lage sein, die Trendrichtung und die Regeln der Schwankungen zu berücksichtigen, um die Handelssignale zuverlässiger zu machen.

  3. Die Stop-Loss-Stoppschranke ist vernünftig eingestellt, um Gewinne zu sichern und Verluste zu verhindern.

  4. Die Strategie ist einfach zu verstehen und leicht umzusetzen.

Risikoanalyse

  1. Bei einem Durchbruch kann es zu False-Breakings kommen, die zu falschen Transaktionen führen. Es kann in Erwägung gezogen werden, weitere Stoßbedingungen hinzuzufügen.

  2. Die Parameter der festen Periode können nicht an Veränderungen des Marktes angepasst werden, und die Parameter der dynamischen Optimierung können berücksichtigt werden.

  3. Es gibt keine Preisstillstandsmaßnahmen, die die extremen Verluste verhindern könnten.

  4. Der Stop-Loss-Punkt ist fest und kann nicht intelligenterweise an Marktschwankungen angepasst werden.

Optimierungsrichtung

  1. Es kann in Erwägung gezogen werden, weitere Trends zu ermitteln, Strategien zu entwickeln und die Genauigkeit zu verbessern.

  2. Die Erhöhung der Schwingungserkennungsmodule, die Aussetzung des Handels bei starken Erschütterungen und die Verringerung des Risikos.

  3. Einführung von Algorithmen für maschinelles Lernen, um die dynamische Optimierung der Parameter zu realisieren.

  4. Der Preis-Stopp-Modul wird hinzugefügt, um den Verlust zu stoppen, wenn der Verlust eine bestimmte Wertminderung erreicht.

  5. Das Stop-Loss-Verhältnis wird auf Basis von Marktschwankungen berechnet und ermöglicht eine intelligente Anpassung des Stop-Loss-Verhältnisses.

Zusammenfassen

Diese Strategie ist insgesamt relativ robust und zuverlässig, aber es gibt auch Raum für Verbesserungen. Die Kernidee besteht darin, die Richtung des Trends über einen Zeitraum zu bestimmen und dann in Kombination mit Trendstärken- und Schwankungsindikatoren zu filtern, um ein hochwertiges Signal zu erzeugen. Die Strategie ist einfach und praktisch und eignet sich hervorragend für die Verfolgung von mittleren und langen Trends.

Strategiequellcode
/*backtest
start: 2023-08-27 00:00:00
end: 2023-09-26 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Eltrut", shorttitle="Eltrut Strat", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075)

testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// R E F L E X / T R E N D F L E X

f_supersmoother(_src,_len)=>
    pi = 2 * asin(1)
    _a = exp(-sqrt(2) * pi / _len)
    _c2 = 2 * _a * cos(sqrt(2) * pi / _len)
    _c3 = -_a * _a
    _c1 = 1 - _c2 - _c3
    _out = 0.0
    _out := _c1 * _src + _c2 * nz(_out[1],nz(_src[1],_src)) + _c3 * nz(_out[2],nz(_src[2],nz(_src[1],_src)))

f_IQIFM(_src1,_max)=>
    _src = _src1 < 0.001 ? _src1 * 10000 : _src1
    _imult = 0.635, _qmult = 0.338 , _inphase = 0.0, _quad = 0.0
    _re = 0.0, _im = 0.0, _deltaphase = 0.0, _instper = 0.0, _per = 0.0, _v4 = 0.0
    _v1 = _src - nz(_src[7])
    _inphase := 1.25 * (nz(_v1[4]) - _imult * _v1[2]) + _imult * nz(_inphase[3])
    _quad := _v1[2] - _qmult * _v1 + _qmult * nz(_quad[2])
    _re := 0.2 * (_inphase * _inphase[1] + _quad * _quad[1]) + 0.8 * nz(_re[1])
    _im := 0.2 * (_inphase * _quad[1] - _inphase[1] * _quad) + 0.8 * nz(_im[1])
    if _re != 0.0
        _deltaphase := atan(_im / _re)
    for i = 0 to _max
        _v4 := _v4 + _deltaphase[i]
        if _v4 > 4 * asin(1) and _instper == 0.0
            _instper := i
    if _instper == 0.0
        _instper := nz(_instper[1])
    _per := 0.25 * _instper + 0.75 * nz(_per[1])
    _per

f_flex(_src1, _fixed_len, _reflex) =>
    _src = _src1
    _len = _fixed_len 
    _ss1 = f_supersmoother(_src, _len)
    _ss = _ss1
    _slope = (_ss[_len] - _ss) / _len
    _sum = 0.0
    for _i = 1 to _len
        _c1 = _reflex ? _ss + _i * _slope - _ss[_i] : _ss - _ss[_i]
        _sum := _sum + _c1
    _sum := _sum / _len
    _ms = 0.0
    _ms := 0.04 * pow(_sum,2) + 0.96 * nz(_ms[1])
    _flex1 = _ms != 0 ? _sum / sqrt(nz(_ms)) : 0.0
    _flex = _flex1
    _flex

rflx = f_flex(close, 20, true)  
trndflx = f_flex(close, 20, false)   

// S I G N A L
hi7 = highest(7)
lo7 = lowest(7)
long_cond = crossunder(close, lo7[1])
short_cond = crossover(close, hi7[1])

// F I L T E R S

long_filter1 = trndflx < 1
short_filter1 = trndflx > -1

basis = sma(close, 35)
dev = 3 * stdev(close, 35)
long_filter2 = close > basis - dev
short_filter2 = close < basis + dev

// S T R A T E G Y

long = long_cond and long_filter1 and long_filter2
short = short_cond and short_filter1 and short_filter2

if( true)
    strategy.entry("Long", strategy.long, when = long)
    strategy.entry("Long", strategy.long, when = short)


// User Options to Change Inputs (%)
stopPer = input(3, title='Stop Loss %', type=input.float) / 100
takePer = input(9, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

if strategy.position_size > 0 
    strategy.exit(id="Exit Long", stop=longStop, limit=longTake)
if strategy.position_size < 0 
    strategy.exit(id="Exit Short", stop=shortStop, limit=shortTake)


// P L O T 

plotshape(long, color = #1e90ff, text = "", style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(short, color = #ff69b4, text = "", style=shape.triangledown, location=location.abovebar, size=size.tiny)

alertcondition(long, "Long", "Enter Long")
alertcondition(short, "Short", "Enter S")