Benutzerdefinierte Aufwärts-Breakout-Strategie


Erstellungsdatum: 2024-01-08 10:32:25 zuletzt geändert: 2024-01-08 10:32:25
Kopie: 0 Klicks: 629
1
konzentrieren Sie sich auf
1617
Anhänger

Benutzerdefinierte Aufwärts-Breakout-Strategie

Überblick

Die Strategie berechnet den Anteil der positiven K-Linie innerhalb des angegebenen Zeitraums, um zu beurteilen, ob der Markt derzeit in einem anhaltend steigenden Zustand ist. Wenn der Anteil der positiven K-Linie über der vom Benutzer festgelegten Obergrenze liegt, ist die Strategie in einem steigenden Zustand. Wenn der Anteil der positiven K-Linie unter der vom Benutzer festgelegten Untergrenze liegt, ist die Strategie in einem rückläufigen Zustand.

Strategieprinzip

Der Kern der Strategie ist der Anteil der positiven K-Linien. Die positiven K-Linien sind die K-Linien, die von einem Tiefpunkt aus geöffnet werden und die über dem Eröffnungspreis liegen, um zu zeigen, dass die Preise in diesem Zeitraum gestiegen sind. Die Strategie berechnet den Anteil der positiven K-Linien an allen K-Linien in den von den Statistikern angegebenen Übergangszeiten. Wenn der Anteil größer ist als die Obergrenze, wird der Wert in einem kontinuierlich steigenden Zustand beurteilt.

Beispiel: Die Anzahl der benutzerdefinierten Zyklen beträgt 20, die obere Grenze beträgt 70, die untere Grenze beträgt 30. Die Strategie führt die letzten 20 K-Linien zurück, wenn 16 von ihnen positive K-Linien sind, beträgt 1620 = 80%.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Die Strategie ist einfach, intuitiv und leicht verständlich.
  2. Es ist nicht so, dass man sich mit einem einzigen Indikator die Gefahr einer Überoptimierung verringert.
  3. Der Benutzer kann die Parameter für verschiedene Sorten anpassen.
  4. Ein integriertes Schadensschutzsystem verhindert übermäßige Verluste.
  5. Es ist möglich, dass Sie Ihre Positionen direkt rückwärts platzieren können, ohne zu warten, bis die Position wieder geöffnet wird, und die Entwicklung schneller verfolgen.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Es ist leicht, falsche Signale zu erzeugen, wenn nur ein Indikator verwendet wird.
  2. Die Indikatoren sind leicht zu optimieren, und die Wirkung der Festplatte kann sehr unterschiedlich sein.
  3. Bei starken Schwankungen kann der Stop-Loss durchbrochen werden, was zu Verlusten führen kann.
  4. Die Reverse Opening-Funktion könnte die Verluste erhöhen.
  5. Die Wirksamkeit ist stark von der Sorte abhängig und muss separat getestet werden.

Um die Risiken zu verringern, können Optimierungen in folgenden Bereichen vorgenommen werden:

  1. Es ist wichtig, dass wir uns mit den neuen Technologien auseinandersetzen.
  2. Optimierung der Stop-Loss-Strategie und Verringerung von Einzelschäden;
  3. Bewertung und Kontrolle der Einzelverluste;
  4. Die Ergebnisse der Tests bei den verschiedenen Sorten.

Optimierungsrichtung

Die Strategie kann in folgenden Richtungen optimiert werden:

  1. Erhöhung von Hilfsindikatoren wie Preis-Leistungs-Rationalität, um falsche Signale zu vermeiden
  2. Optimierung der Stop-Loss-Methode, die die Bewegungs- und Schwingungs-Stopp-Methoden berücksichtigt
  3. Erhöhung der Filterbedingungen für die Eröffnung, z. B. Durchbruch der Brinline und Wiedereintritt
  4. Test der Anpassungsfähigkeit verschiedener Positiver K-Linien-Parameter für verschiedene Arten
  5. Beurteilung der maximalen Rücknahme und Kontrolle des Einzelschadens

Zusammenfassen

Die Strategie ist leicht zu verstehen, benutzerfreundlich und eignet sich für Anfänger, die mit Quantifizierung handeln. Es besteht jedoch eine gewisse Ertragsvolatilität, die nur auf einem einzigen Indikator und einer Parameter-Einstellung beruht.

Strategiequellcode
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-04 00:00:00
period: 1m
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/
// © ZenAndTheArtOfTrading 
// © TweakerID

// Based on the calculations by ZenAndTheArtOfTrading, I added stop loss, take profit and reverse line codes.
// The Positive Bars % calculates the number of green (positive) bars, relative to a lookback period, defined 
// by the user. If the percentage is low, it means that there was a bigger number of red candles in the 
// lookback period. The strategy goes long when the percentage is high and short when it's low, although
// this logic can be reversed with positive results on different time frames.

//@version=4
strategy("Positive Bars % Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

lookback = input(title="Lookback", type=input.integer, defval=13)
upperLimit = input(title="Upper Limit", type=input.integer, defval=70)
lowerLimit = input(title="Lower Limit", type=input.integer, defval=30)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(10, step=.1, title="ATR Multiple")
i_TPRRR = input(1.6, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR

// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//Calculations
positiveBars = 0
for i = (lookback - 1) to 0
    if close[i] > open[i]
        positiveBars := positiveBars + 1
positiveBarsPercent = (positiveBars / lookback) * 100

BUY=positiveBarsPercent >= upperLimit
SELL=positiveBarsPercent <= lowerLimit

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)