Die Ressourcen sind geladen. Beförderung...

Positive Bars Prozentsatz-Ausbruchstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-08 10:32:25
Tags:

img

Übersicht

Die Positive Bars Percentage Breakout Strategie ist eine quantitative Handelsstrategie, die auf Preisbeurteilungen basiert. Sie berechnet den Prozentsatz der Aufwärtstrendkerzen in einem bestimmten Zeitraum, um festzustellen, ob sich der Markt derzeit in einem Aufwärtstrendzustand befindet. Wenn der Prozentsatz der Aufwärtstrendkerzen höher als die vom Benutzer definierte obere Grenze ist, beurteilt die Strategie, dass sich der Markt derzeit in einem Aufwärtstrend befindet und lang geht. Wenn der Prozentsatz niedriger als die vom Benutzer definierte untere Grenze ist, beurteilt die Strategie, dass sich der Markt derzeit in einem Abwärtstrend befindet und kurz geht.

Strategie Logik

Der Kernindikator dieser Strategie ist der Prozentsatz der Aufwärtstrendkerzen. Eine Aufwärtstrendkerze öffnet sich unter dem vorherigen Tief und schließt über dem Offen, was darauf hindeutet, dass der Preis in diesem Zeitraum gestiegen ist. Die Strategie zählt die Anzahl der Aufwärtstrendkerzen in der vom Benutzer definierten Rückblicksperiode und berechnet den Prozentsatz der Aufwärtstrendkerzen unter allen Kerzen. Wenn der Prozentsatz höher als die obere Grenze ist, beurteilt die Strategie, dass der Markt in einem anhaltenden Aufwärtstrend ist und geht lang. Wenn der Prozentsatz niedriger als die untere Grenze ist, beurteilt die Strategie, dass der Markt in einem Abwärtstrend ist und geht kurz. Die Stop-Loss- und Take-Profit-Orders werden nach der vom Benutzer definierten Stop-Loss-Methode festgelegt.

Wenn der Benutzer beispielsweise die Lookback-Periode auf 20, die obere Grenze auf 70, die untere Grenze auf 30 setzt, verfolgt die Strategie die letzten 20 Kerzen. Wenn 16 von ihnen Aufwärtstrendkerzen sind, wäre der Prozentsatz 16/20=80%. Da 80% über der oberen Grenze von 70% liegt, wird die Strategie einen Long-Order ausführen. Wenn unter den letzten 20 Kerzen nur 5 Aufwärtstrendkerzen sind, dann wäre der Prozentsatz 5/20=25%. Dies ist niedriger als die untere Grenze von 30%, wird die Strategie einen Short-Order ausführen.

Analyse der Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Die Strategielogik ist einfach und intuitiv, leicht verständlich.
  2. Sie stützt sich auf nur einen Indikator und verringert so das Risiko einer Überanpassung.
  3. Benutzer können die Parameter für verschiedene Produkte anpassen;
  4. Es verfügt über eingebaute Stop-Loss-/Take-Profit-Funktionen, um riesige Verluste zu vermeiden.
  5. Ermöglichen Sie den Umkehrhandel, ohne zuerst die Positionen zu verlassen, schneller Trends zu verfolgen.

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind:

  1. Wenn man sich ausschließlich auf einen Indikator stützt, kann dies zu falschen Signalen führen.
  2. Die Parameter sind anfällig für Überanpassung, die Leistung kann stark variieren;
  3. Der Stop-Loss kann durch volatile Kursschwankungen betroffen sein, die zu Verlusten führen;
  4. Umgekehrter Handel kann Verluste verstärken;
  5. Die Leistung hängt stark vom Symbol ab und erfordert separate Tests.

Die Risiken können verringert werden, indem

  1. Hinzufügen von Filtern, um falsche Signale zu vermeiden;
  2. Optimierung der Stop-Loss-Logik zur Begrenzung von Verlusten;
  3. Bewertung und Kontrolle der maximalen Verlustgröße;
  4. Versuche mit verschiedenen Symbolen separat.

Optimierungsrichtlinien

Die wichtigsten Richtungen zur Optimierung dieser Strategie sind:

  1. Hinzufügen von Hilfsindikatoren wie Lautstärke, um falsche Signale zu vermeiden;
  2. Optimierung von Stop-Loss-Methoden, wie zum Beispiel Trailing-Stop-Loss;
  3. Hinzufügen von Eintrittsfiltern wie Breakout von Bollinger Bands;
  4. Prüfung der optimalen Parameter von Aufwärtstrendkerzen für verschiedene Symbole;
  5. Bewertung der maximalen Auslastung und Kontrolle der Verlustgröße.

Schlussfolgerung

Die Positive Bars Percentage Breakout Strategie hat eine einfache und unkomplizierte Logik, um Trends zu erfassen, indem die Persistenz von Aufwärtstrends/Abwärtstrends statistisch beurteilt wird. Sie ist einfach zu verstehen und benutzerfreundlich, geeignet für Anfänger.


/*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)

Mehr