Dynamische Box-Prozentsatz-Verfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-11-23 10:32:39
Tags:

img

Übersicht

Diese Strategie verwendet prozentuelle Preisänderungen, um Einstiegslinien und Stop-Loss-Linien festzulegen. Sie tritt in Positionen ein, wenn die Preise die Einstiegslinie durchbrechen, und tritt aus, wenn die Preise unter die Stop-Loss-Linie fallen.

Grundsätze

Die Strategie setzt zunächst einen Benchmarkpreis und verwendet 10% dieses Preises als Preisbereich - die obere Grenze ist die Einstiegslinie und die untere Grenze ist die Stop-Loss-Linie. Wenn die Preise die Einstiegslinie durchbrechen, werden feste Mengen gekauft. Wenn die Preise unter die Stop-Loss-Linie fallen, werden die Positionen geschlossen. Nach Gewinn werden die Einstiegs- und Stop-Loss-Linien prozentual angepasst, um die Gewinnspanne zu erweitern. Dies ermöglicht es der Strategie, Trendläufe zu verfolgen.

Ein weiterer wichtiger Punkt der Strategie ist, dass sie nur eine Risikogerätung übernimmt. Das heißt, neue Positionen werden erst hinzugefügt, nachdem die aktuelle Position das Gewinnziel erreicht hat. Die neuen Positionen werden auch den neuen Einstiegs- und Stop-Loss-Linien folgen. Dies begrenzt das Risiko.

Analyse der Vorteile

Diese Strategie kombiniert die Vorteile von Trailing Stops und Positionsdimensionierung und ermöglicht eine effektive Risikokontrolle bei gleichzeitiger Rentabilität.

  1. Die Verwendung von Prozentsatzbereichen für Eintritts- und Stop-Loss-Linien ermöglicht eine automatische Trendverfolgung
  2. Das Risiko beschränkt sich auf einstellige Zahlen und vermeidet damit große Verluste.
  3. Neue Positionen werden erst nach Gewinn hinzugefügt, ohne Trends zu verfolgen
  4. Stop-Loss-Linien steigen nach dem Gewinn an und sperren Gewinne ein.

Risikoanalyse

Es gibt auch einige Risiken:

  1. Wenn die Prozentsätze zu breit sind, kann sich das Risiko ausweiten
  2. Wenn die Bereiche zu eng sind, ist das Gewinnpotenzial begrenzt
  3. Eine falsche Stop-Loss-Platzierung kann zu einem vorzeitigen Ausstieg führen
  4. Aggressive Zusätze können Verluste verstärken

Diese Risiken lassen sich durch Anpassung von Parametern wie Bereichsgrößen, Eingangsfiltern usw. vermeiden.

Optimierung

Es gibt Raum für weitere Optimierungen:

  1. Kombination mit Trendindikatoren zur Bestimmung der Trendrichtung
  2. Hinzufügen von maschinellen Lernmodellen für anpassungsfähige Linien
  3. Verschiedene Zusatzbedingungen zur Verringerung des Risikos testen
  4. Ermittlung der optimalen Haltedauer durch Prüfung

Schlussfolgerung

Durch Parameter-Tuning und Modelloptimierung kann diese Strategie zu einem zuverlässigen Trend-Tracking-Tool werden, das für Anleger eine stabile Überleistung generiert.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HermanBrummer 4 April 2021

strategy ("The Box Percent Strat", shorttitle="The Box", overlay = true)

///     Designed for LONG only on Daily, 2D or 3D Charts
///     Uses fixed investment risk amount, meaning you're willing to lose that amount per trade
///     Limit buy to not overpay

RiskPerTrade            = input(10000, "Risk losing this much per trade", tooltip="This calculates how much you will lose based on difference between the entry price and stop loss price")
TradeAboveMAFilterPer   = input(50, "The System won't trade if price is below this MA")

UpBoxSize               = (input(10, "Box size in %") * 0.01)+1 // 1.1 == 10% up
DnBoxSize               = 1-(input(10, "Box size in %") * 0.01) // 0.9 == 10% dn


var FirstBar            = close > 0 ? close : na
var FirstTop            = FirstBar * UpBoxSize
var FirstBot            = FirstBar * DnBoxSize


var top                 = sma(FirstTop, 1)
var bot                 = sma(FirstBot, 1)

///     The Box Calcs
if  high[2] > top
    top                 := top * UpBoxSize
    bot                 := bot * UpBoxSize
if  low[1]  < bot
    top                 := top * DnBoxSize
    bot                 := bot * DnBoxSize

 
plot(bot,   "Bot",      #ff0000) // Green
plot(top,   "Top",      #00ff00) // Red

mid                     = ((top-bot)/2)+bot 
plot(mid,   "Mid", color.gray)

TradeAboveMAFilter      = sma(close, TradeAboveMAFilterPer)
plot(TradeAboveMAFilter, "Trade AboveMAF Filter", color.yellow, 3, style=plot.style_circles)

// col = high[1] < top and high >= top ? color.white : na
// bgcolor(col)


///     Shares
RiskRange                   = close * abs(DnBoxSize - 1) // 0.9 - 1 == 1.10 // 10% abs so you don't get a neg number NB NB
Shares                      = RiskPerTrade / RiskRange 
//plot(close-RiskRange, "RiskRange", color.fuchsia)

Enter   =   high >= top
             and close[1] > TradeAboveMAFilter
             and strategy.opentrades[0] == strategy.opentrades[1]
             and strategy.opentrades[1] == strategy.opentrades[2] 
             and strategy.opentrades[2] == strategy.opentrades[3]
             and strategy.opentrades[3] == strategy.opentrades[4] 
             and strategy.opentrades[4] == strategy.opentrades[5]
             and strategy.opentrades[5] == strategy.opentrades[6]
             // won't enter if new positon was taken in the last 6 bars
             // need better code for this.

///     Buy & Sell
//  (new highs)    and  (Close above moving average filter) and (No new trades were taken receently)
if  Enter //(high >= top)  and  (close[1] > TradeAboveMAFilter) and strategy.opentrades[0] == strategy.opentrades[1] 
    strategy.order("En", strategy.long, qty=Shares, limit=top)//, stop=top)
    
//barcolor(strategy.position_size != 0 ? #00ff00 : color.gray)


// ///     If ONE Position THEN this Stop Because: 
// if  strategy.position_size == 1
//     strategy.exit("Ex", "En", stop=bot)
///     If it has more than one trad OPEN
if  strategy.position_size > 0
    strategy.exit("Ex", "En", stop=bot[2] )   // puts stop on old bot

//plot(strategy.position_avg_price, "Avg Price", color.yellow)





Mehr