O recurso está a ser carregado... Carregamento...

Squeeze Backtest Transformer v2.0

Autora:ChaoZhang, Data: 2024-04-28 14:09:26
Tags:

img

Resumo

O Squeeze Backtest Transformer v2.0 é um sistema de negociação quantitativo baseado em uma estratégia de compressão. Ao definir parâmetros como entrada, stop loss, porcentagem de lucro e tempo máximo de retenção, ele testa a estratégia dentro de um intervalo de tempo específico. A estratégia suporta negociação multidirecional e pode definir flexivelmente a direção da negociação para longa ou curta. Ao mesmo tempo, a estratégia também fornece opções ricas para definir o período de backtest, que pode facilmente selecionar um intervalo de tempo fixo ou o tempo máximo de backtest.

Princípio da estratégia

  1. Em primeiro lugar, determinar a hora de início e de fim do backtest com base nos parâmetros do período de backtest definidos pelo utilizador.
  2. Durante o período de backtest, se não houver posição corrente e o preço atingir o preço de entrada (calculado com base na percentagem de abertura), abrir uma posição e definir os preços de stop loss e take profit (calculados com base nas percentagens de stop loss e take profit) ao mesmo tempo.
  3. Se uma posição já estiver detida, cancelar as ordens anteriores de captação de lucro e de stop loss e redefinir novos preços de captação de lucro e de stop loss (calculados com base no preço médio da posição atual).
  4. Se o tempo máximo de retenção estiver definido, quando o tempo de retenção atingir o valor máximo, forçar o fechamento da posição.
  5. A estratégia apoia a negociação em direcções longas e curtas.

Vantagens da estratégia

  1. As definições flexíveis dos parâmetros podem ser ajustadas em função das diferentes condições do mercado e das necessidades comerciais.
  2. Apoiar a negociação multidirecional para obter lucros em diferentes condições de mercado.
  3. Fornecer opções ricas para definir o período de backtest, que pode facilmente realizar backtesting e análise de dados históricos.
  4. As configurações de stop loss e take profit podem controlar eficazmente os riscos e melhorar a eficiência da utilização do capital.
  5. A definição do tempo máximo de detenção pode evitar a detenção de posições por muito tempo e o risco de risco de mercado.

Riscos estratégicos

  1. A definição do preço de entrada, do preço de stop loss e do preço de take profit tem um grande impacto no retorno da estratégia.
  2. Quando o mercado flutua violentamente, um stop loss pode ser acionado imediatamente após a abertura de uma posição, resultando em perdas.
  3. Se o tempo máximo de detenção provocar o encerramento de uma posição, pode perder a oportunidade de obter lucros subsequentes.
  4. A estratégia pode não ter um bom desempenho em algumas condições especiais de mercado (como um mercado lateral).

Direcção de otimização da estratégia

  1. Considerar a introdução de mais indicadores técnicos ou indicadores de sentimento de mercado para otimizar as condições de entrada, stop loss e take profit para melhorar a estabilidade e rentabilidade da estratégia.
  2. Para a fixação do tempo máximo de detenção, pode ser ajustado dinamicamente em função da volatilidade do mercado e dos lucros e perdas da posição, a fim de evitar o custo de oportunidade que um encerramento a tempo fixo pode trazer.
  3. Para as características do mercado lateral, pode ser adicionada uma lógica como a confirmação da ruptura do intervalo lateral ou da reversão da tendência para reduzir o custo da negociação frequente.
  4. Considerar a adição de estratégias de gestão de posições e de gestão de capital para controlar a exposição ao risco de uma única transação e melhorar a eficiência e a estabilidade da utilização do capital.

Resumo

O Squeeze Backtest Transformer v2.0 é um sistema de negociação quantitativo baseado em uma estratégia de compressão que pode negociar em diferentes ambientes de mercado através de configurações de parâmetros flexíveis e suporte de negociação multidirecional. Ao mesmo tempo, opções ricas de configuração de período de backtest e configurações de take profit e stop loss podem ajudar os usuários a conduzir análise de dados históricos e controle de risco. No entanto, o desempenho da estratégia é muito afetado pelas configurações de parâmetros e precisa ser otimizado e melhorado com base nas características do mercado e nas necessidades de negociação para melhorar a estabilidade e lucratividade da estratégia. No futuro, podemos considerar a introdução de mais indicadores técnicos, ajustando dinamicamente o tempo máximo de detenção, otimizando estratégias laterais e fortalecendo a gestão de posição e capital para otimizar o mercado.


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



Mais.