Стратегия скользящего стоп-лосса, основанная на ценовом разрыве


Дата создания: 2023-11-28 13:53:16 Последнее изменение: 2023-11-28 13:53:16
Копировать: 0 Количество просмотров: 655
1
Подписаться
1617
Подписчики

Стратегия скользящего стоп-лосса, основанная на ценовом разрыве

Обзор

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

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

Когда цена падает ниже самого низкого уровня за последние 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)