Die Ressourcen sind geladen. Beförderung...

Squeeze Backtest Transformer v2.0

Schriftsteller:ChaoZhang, Datum: 2024-04-28 14:09:26
Tags:

img

Übersicht

Squeeze Backtest Transformer v2.0 ist ein quantitatives Handelssystem, das auf einer Squeeze-Strategie basiert. Durch das Setzen von Parametern wie Eintritt, Stop-Loss, Take-Profit-Prozentsätze und maximale Haltezeit wird die Strategie innerhalb eines bestimmten Zeitrahmens zurückgetestet. Die Strategie unterstützt multi-directional Trading und kann die Handelsrichtung flexibel auf lang oder kurz einstellen. Gleichzeitig bietet die Strategie auch umfangreiche Optionen für die Einstellung der Backtest-Periode, die leicht einen festen Zeitrahmen oder die maximale Backtest-Zeit auswählen kann.

Strategieprinzip

  1. Zunächst wird die Start- und Endzeit des Backtests anhand der vom Benutzer eingestellten Parameter für den Backtestzeitraum bestimmt.
  2. Wenn während des Backtestzeitraums keine aktuelle Position besteht und der Preis den Einstiegspreis erreicht (berechnet anhand des Eröffnungsprozentsatzes), wird eine Position eröffnet und gleichzeitig die Stop-Loss- und Take-Profit-Preise (berechnet anhand der Stop-Loss- und Take-Profit-Prozentsätze) festgelegt.
  3. Wenn eine Position bereits gehalten wird, werden die vorherigen Take Profit- und Stop Loss-Orders storniert und neue Take Profit- und Stop Loss-Preise (berechnet anhand des durchschnittlichen Kurses der aktuellen Position) zurückgesetzt.
  4. Wenn die maximale Haltezeit festgelegt ist, wird, wenn die Haltezeit den maximalen Wert erreicht, die Position gezwungen, zu schließen.
  5. Die Strategie unterstützt den Handel sowohl in der langen als auch in der kurzen Richtung.

Strategische Vorteile

  1. Flexible Parameter-Einstellungen können je nach den unterschiedlichen Marktbedingungen und Handelsanforderungen angepasst werden.
  2. Unterstützung des mehrseitigen Handels zur Gewinngewinnung unter unterschiedlichen Marktbedingungen.
  3. Bereitstellung reichhaltiger Optionen für die Einstellung des Backtest-Zeitraums, mit dem leicht historische Daten-Backtesting und -Analyse durchgeführt werden können.
  4. Stop-Loss- und Take-Profit-Einstellungen können Risiken wirksam kontrollieren und die Effizienz der Kapitalnutzung verbessern.
  5. Durch die Festlegung der maximalen Haltedauer kann vermieden werden, dass Positionen zu lange gehalten und mit Marktrisiken konfrontiert werden.

Strategische Risiken

  1. Die Einstellung des Einstiegspreises, des Stop-Loss-Preises und des Take-Profit-Preises hat einen großen Einfluss auf die Rendite der Strategie.
  2. Wenn der Markt heftig schwankt, kann ein Stop Loss unmittelbar nach Eröffnung einer Position ausgelöst werden, was zu Verlusten führt.
  3. Wenn die maximale Haltedauer zum Schließen einer Position führt, kann die Gelegenheit für spätere Gewinne verpasst werden.
  4. Die Strategie kann unter bestimmten besonderen Marktbedingungen (z. B. einem seitlichen Markt) nicht gut funktionieren.

Strategieoptimierung

  1. Es sollte in Erwägung gezogen werden, mehr technische Indikatoren oder Marktstimmungsindikatoren einzuführen, um die Bedingungen für den Einstieg, den Stop-Loss und den Gewinn zu optimieren, um die Stabilität und Rentabilität der Strategie zu verbessern.
  2. Bei der Festlegung der maximalen Haltedauer kann sie dynamisch anhand der Marktvolatilität und des Positionsgewinns und -verlusts angepasst werden, um die Opportunitätskosten zu vermeiden, die ein Festzeitschluss mit sich bringen kann.
  3. Für die Merkmale des seitlichen Marktes können Logiken wie die Bestätigung eines seitlichen Durchbruchs oder einer Trendumkehr hinzugefügt werden, um die Kosten für häufige Geschäfte zu senken.
  4. Es sollte in Erwägung gezogen werden, Positionsmanagement- und Kapitalmanagementstrategien hinzuzufügen, um das Risiko eines einzelnen Geschäfts zu kontrollieren und die Effizienz und Stabilität der Kapitalnutzung zu verbessern.

Zusammenfassung

Squeeze Backtest Transformer v2.0 ist ein quantitatives Handelssystem, das auf einer Squeeze-Strategie basiert und in verschiedenen Marktumgebungen durch flexible Parameter-Einstellungen und multidirektionale Handelsunterstützung handeln kann. Gleichzeitig können reiche Backtest-Perioden-Einstellungsoptionen und Take-Profit- und Stop-Loss-Einstellungen den Benutzern helfen, historische Datenanalysen und Risikokontrolle durchzuführen. Die Leistung der Strategie wird jedoch stark von Parameter-Einstellungen beeinflusst und muss basierend auf Marktmerkmalen und Handelsbedürfnissen optimiert und verbessert werden, um die Stabilität und Rentabilität der Strategie zu verbessern. In Zukunft können wir in Betracht ziehen, mehr technische Indikatoren einzuführen, die maximale Haltezeit dynamisch anzupassen, Seitenstrategien zu optimieren und die Marktposition und das Kapitalmanagement zu stärken, um zu optimieren.


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

//@version=5

strategy(title="Squeeze Backtest by Shaqi v2.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"

BL = "low"
BH = "high"
BO = "open"
BC = "close"
BHL= "mid (hl)"
BOC = "mid (oc)"

LONG = "LONG"
SHORT = "SHORT"

direction = input.string(title="Direction", defval=LONG, options=[LONG, SHORT], group="Squeeze Settings")
strategy.risk.allow_entry_in(direction == LONG ? strategy.direction.long : strategy.direction.short)
openPercent = input.float(1.4, "Open, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
closePercent = input.float(0.6, "Close, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
stopPercent = input.float(0.8, "Stop Loss, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
isMaxBars = input.bool(true, "Max Bars To Sell", inline="MaxBars", group="Squeeze Settings")
maxBars = input.int(10, title="", minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings")
bind = input.string(BC, "Bind", options=[BL, BH, BO, BC, BHL, BOC], group="Squeeze Settings")
isRange = input.bool(true, "Fixed Range", inline="Range", group="Backtesting Period")
rangeStart = input.string(R2, "", options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period")
periodStart = input(timestamp("12 Apr 2024 00:00 +0000"), "Backtesting Start", group="Backtesting Period")
periodEnd = input(timestamp("20 Apr 2024 00:00 +0000"), "Backtesting End", group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd
    
float bindOption = na
if bind == BL
    bindOption := low
else if bind == BH
    bindOption := high
else if bind == BO
    bindOption := open
else if bind == BC
    bindOption := close
else if bind == BHL
    bindOption := hl2
else
    bindOption := ohlc4

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
periodCondition = true
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size != 0

barsFromEntry = ta.barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
openLimitPrice = direction == LONG ? (bindOption - bindOption * openPercent) : (bindOption + bindOption * openPercent)

closeLimitPriceEntry = openLimitPrice * (direction == LONG ? 1 + closePercent : 1 - closePercent)
closeLimitPrice = strategy.position_avg_price * (direction == LONG ? 1 + closePercent : 1 - closePercent)

stopLimitPriceEntry = direction == LONG ? openLimitPrice - openLimitPrice * stopPercent : openLimitPrice + openLimitPrice * stopPercent
stopLimitPrice = direction == LONG ? strategy.position_avg_price - strategy.position_avg_price * stopPercent : strategy.position_avg_price + strategy.position_avg_price * stopPercent

if periodCondition and notInTrade
    strategy.entry(direction == LONG ? "BUY" : "SELL", direction == LONG ? strategy.long : strategy.short, limit = openLimitPrice, stop = stopLimitPriceEntry)
    strategy.exit("INSTANT", limit = closeLimitPriceEntry, stop = stopLimitPriceEntry, comment_profit = direction == LONG ? 'INSTANT SELL' : 'INSTANT BUY', comment_loss = 'INSTANT STOP')
if inTrade 
    strategy.cancel("INSTANT")
    strategy.exit(direction == LONG ? "SELL" : "BUY", limit = closeLimitPrice, stop = stopLimitPrice, comment_profit = direction == LONG ? "SELL" : "BUY", comment_loss = "STOP")
if isMaxBars and barsFromEntry == maxBars
    strategy.close_all(comment = "TIMEOUT STOP", immediately = true)



showStop = stopPercent <= 0.20

// plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=1)
// plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=1)
// plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=1)
plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=0)
plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=0)
plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=0)

plot(openLimitPrice, title="Trailing Open Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.blue : color.red, 30), offset=1)
plot(closeLimitPriceEntry, title="Trailing Close Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.red : color.blue, 80), offset=1)
plot(stopLimitPriceEntry, title="Trailing Stop Position Limit Order", style=plot.style_stepline, color=color.new(#c50202, 80), offset=1)



Mehr