В процессе загрузки ресурсов... загрузка...

Преобразователь сжатия обратного теста v2.0

Автор:Чао Чжан, Дата: 2024-04-28 14:09:26
Тэги:

img

Обзор

Squeeze Backtest Transformer v2.0 - это количественная торговая система, основанная на стратегии сжатия. Устанавливая такие параметры, как вход, стоп-лосс, процент получения прибыли и максимальное время хранения, она проверяет стратегию в определенном временном диапазоне. Стратегия поддерживает многонаправленную торговлю и может гибко устанавливать направление торговли на длинный или короткий.

Принцип стратегии

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

Преимущества стратегии

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

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

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

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

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

Резюме

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


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



Больше