Squeeze Backtest Transformers v2.0


Дата создания: 2024-04-28 14:09:26 Последнее изменение: 2024-04-28 14:09:26
Копировать: 0 Количество просмотров: 536
1
Подписаться
1617
Подписчики

Squeeze Backtest Transformers v2.0

Обзор

Экстремальная ретроспективная криптовалюта v2.0 является количественной торговой системой, основанной на экстремальной стратегии. Она проводит ретроспективную стратегию в определенном промежутке времени, устанавливая параметры, такие как процент входа, остановки и остановки, а также максимальное время удержания позиции.

Стратегический принцип

  1. Во-первых, в зависимости от параметров периода отсчета, установленных пользователем, определяется время начала и окончания отсчета.
  2. В течение периода отсчета, если в настоящее время нет позиции и цена касается цены входа (в зависимости от процента открытия позиции), открывается позиция и одновременно устанавливается цена остановки и остановки (в зависимости от процента остановки и остановки).
  3. Если позиция уже удерживается, отменяется предыдущая стоп-стоп-лосс, и устанавливается новая стоп-стоп-лосс цена (считаемая по средней цене текущей позиции).
  4. Если установлено максимальное время удержания позиции, то при достижении максимального значения времени удержания позиции, обязательно нажмите на “полизирование”.
  5. Стратегия поддерживает торговлю в обоих направлениях: как в плюсе, так и в минусе.

Стратегические преимущества

  1. Настройка параметров гибкая и может быть скорректирована в зависимости от различных рыночных условий и потребностей в сделках.
  2. Поддержка многосторонних сделок, позволяющих получать прибыль в различных рыночных условиях.
  3. Предоставляет множество опций для настройки периода отсчета, что позволяет легко отслеживать и анализировать исторические данные.
  4. Установка стоп-лосса и стоп-стоп позволяет эффективно контролировать риски и повышать эффективность использования средств.
  5. Настройка максимального срока хранения позволяет избежать рыночного риска, связанного с длительным хранением.

Стратегический риск

  1. Настройки входных, стоп-лосс и стоп-стоп цен имеют большое влияние на стратегическую прибыль, а неправильная настройка параметров может привести к убыткам.
  2. При резких рыночных колебаниях может возникнуть ситуация, когда сразу после открытия позиции может быть вызван стоп-лосс, что приводит к убыткам.
  3. Если при проведении позиции будет задействована максимально допустимая продолжительность позиции, возможно, будет упущена возможность получения последующей прибыли.
  4. Стратегия может работать не очень хорошо в некоторых особых ситуациях (например, в условиях рыночной нестабильности).

Направление оптимизации стратегии

  1. Можно рассмотреть вопрос о введении большего количества технических показателей или показателей рыночных настроений для оптимизации условий входа, остановки и остановки, повышения стабильности и прибыльности стратегии.
  2. Для установки максимального времени удержания позиции, можно динамически корректировать в зависимости от волатильности рынка и убыточного состояния удержания позиции, чтобы избежать возможной стоимости возможности, связанной с устранением позиции в фиксированное время.
  3. Для характеристик шокирующего рынка можно добавить логику, такую как прорыв между шокирующими зонами или подтверждение обратного тренда, чтобы снизить затраты, связанные с частыми сделками.
  4. Рассмотреть возможность включения стратегии управления позициями и управлением капиталом, чтобы контролировать рисковые поры в однократной сделке и повысить эффективность и стабильность использования капитала.

Подвести итог

В то же время, богатое количество опционов для установки периодов обратной связи и параметров стоп-стоп помогают пользователям анализировать исторические данные и управлять рисками. Однако, эффективность стратегии сильно зависит от параметров, поэтому ее нужно оптимизировать и улучшать в соответствии с рыночными особенностями и потребностями торговли, чтобы повысить устойчивость и прибыльность стратегии. В будущем можно рассмотреть возможность внедрения большего количества технических показателей, динамического регулирования максимального времени удержания позиций, оптимизации стратегии рискового рынка, а также усиления позиций и управления капиталом.

Исходный код стратегии
/*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)