Стратегия сдерживания потерь на основе ценовых разрывов

Автор:Чао Чжан, Дата: 2023-11-28 13:53:16
Тэги:

img

Обзор

Эта стратегия использует принцип ценового разрыва, чтобы пойти на длинный курс, когда цена пробивает последние минимумы, с ордерами стоп-лосса и прибыли, чтобы отследить самую низкую цену для получения прибыли.

Логика стратегии

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

  1. Вычислить самую низкую цену за последние N часов в качестве обязательной цены
  2. Продолжайте, когда цена в реальном времени ниже цены обязательства * процент покупки
  3. Установка прибыли на основе входной цены * процент продаж
  4. Установка стоп-лосса на основе вступительной цены - вступительная цена * процент стоп-лосса
  5. Размер позиции в процентах от собственного капитала стратегии
  6. Линия с наименьшей ценой
  7. Закрытие позиции при задействовании сбора прибыли или стоп-лосса

Анализ преимуществ

Преимущества этой стратегии:

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

Анализ рисков

Существуют также некоторые риски:

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

Руководство по оптимизации

Стратегия может быть улучшена в следующих аспектах:

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

Заключение

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


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

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.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)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     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

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

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



Больше