Les ressources ont été chargées... Je charge...

Transformateur de test arrière v2.0

Auteur:ChaoZhang est là., Date: le 28 février 2024 14:09:26
Les étiquettes:

img

Résumé

Squeeze Backtest Transformer v2.0 est un système de trading quantitatif basé sur une stratégie de squeeze. En définissant des paramètres tels que l'entrée, le stop loss, les pourcentages de profit et le temps de détention maximum, il backtest la stratégie dans une plage de temps spécifique. La stratégie prend en charge le trading multidirectionnel et peut régler de manière flexible la direction du trading sur long ou court.

Principe de stratégie

  1. Tout d'abord, déterminer l'heure de début et de fin du backtest en fonction des paramètres de la période de backtest définis par l'utilisateur.
  2. Au cours de la période de backtest, s'il n'y a pas de position en cours et que le prix atteint le prix d'entrée (calculé sur la base du pourcentage d'ouverture), ouvrir une position et définir simultanément les prix de stop loss et de profit (calculés sur la base des pourcentages de stop loss et de profit).
  3. Si une position est déjà détenue, annuler les précédents ordres de prise de profit et de stop-loss et réinitialiser les nouveaux prix de prise de profit et de stop-loss (calculés sur la base du prix moyen de la position en cours).
  4. Si la durée maximale d'attente est définie, lorsque la durée d'attente atteint la valeur maximale, la position est forcée à se fermer.
  5. La stratégie soutient les échanges à long terme et à court terme.

Les avantages de la stratégie

  1. Les paramètres flexibles peuvent être ajustés en fonction des différentes conditions du marché et des besoins commerciaux.
  2. Soutenir le commerce multidirectionnel afin d'obtenir des bénéfices dans des conditions de marché différentes.
  3. Fournir de nombreuses options pour définir la période de backtest, qui peut facilement effectuer des backtesting et des analyses de données historiques.
  4. Les paramètres Stop Loss et Take Profit permettent de contrôler efficacement les risques et d'améliorer l'efficacité de l'utilisation du capital.
  5. La durée maximale de détention peut permettre d'éviter de détenir des positions trop longtemps et de faire face à des risques de marché.

Risques stratégiques

  1. La mise en place du prix d'entrée, du prix de stop-loss et du prix de prise de profit a une grande incidence sur le rendement de la stratégie.
  2. Lorsque le marché fluctue violemment, un stop loss peut être déclenché immédiatement après l'ouverture d'une position, ce qui entraîne des pertes.
  3. Si la durée maximale de détention déclenche la clôture d'une position, elle risque de manquer l'opportunité de réaliser des bénéfices ultérieurs.
  4. La stratégie peut ne pas fonctionner bien dans certaines conditions particulières du marché (comme un marché latéral).

Direction de l'optimisation de la stratégie

  1. Il convient d'envisager l'introduction de plus d'indicateurs techniques ou d'indicateurs de sentiment du marché afin d'optimiser les conditions d'entrée, de stop loss et de prise de bénéfices afin d'améliorer la stabilité et la rentabilité de la stratégie.
  2. Pour la fixation de la durée maximale de détention, celle-ci peut être ajustée dynamiquement en fonction de la volatilité du marché et des bénéfices et pertes de position afin d'éviter le coût d'opportunité que peut entraîner une clôture à temps fixe.
  3. Pour les caractéristiques du marché latéral, une logique telle que la confirmation d'une rupture de gamme latérale ou d'un renversement de tendance peut être ajoutée pour réduire le coût des transactions fréquentes.
  4. Envisager d'ajouter des stratégies de gestion des positions et de gestion des capitaux pour contrôler l'exposition au risque d'une seule transaction et améliorer l'efficacité et la stabilité de l'utilisation du capital.

Résumé

Squeeze Backtest Transformer v2.0 est un système de trading quantitatif basé sur une stratégie de compression qui peut négocier dans différents environnements de marché grâce à des paramètres flexibles et un support de trading multidirectionnel. Dans le même temps, des options de réglage de période de backtest riches et des paramètres de prise de profit et de stop-loss peuvent aider les utilisateurs à effectuer une analyse des données historiques et un contrôle des risques. Cependant, la performance de la stratégie est fortement affectée par les paramètres et doit être optimisée et améliorée en fonction des caractéristiques du marché et des besoins de trading pour améliorer la stabilité et la rentabilité de la stratégie.


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



Plus de