Пошаговая стратегия фиксации прибыли при проскальзывании


Дата создания: 2023-11-28 16:05:24 Последнее изменение: 2023-11-28 16:05:24
Копировать: 0 Количество просмотров: 778
1
Подписаться
1619
Подписчики

Пошаговая стратегия фиксации прибыли при проскальзывании

Обзор

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

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

Эта стратегия включает в себя следующие части:

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

В частности, он сначала устанавливает стоп-расстояние в 100 пунктов и три стоп-расстояния в 100/200/300 пунктов. Затем определяется функция, которая рассчитывает преимущества на основе текущей цены и цены открытия позиции.curProfitInPts, а также функция, которая рассчитывает стоп-стоп на расстоянии от точкиcalcStopLossPrice

Ключевая логика заключается в том,getCurrentStageФункция, которая определяет, есть ли в настоящее время позиция, а также превышает ли количество преимуществ, превышает ли определенную остановку, если превышает, переходит в следующую стадию. Например, достигнув 100 остановок, переходит во вторую стадию, достигнув 200 остановок, переходит в третью стадию.

Наконец, в зависимости от этапа, изменяется цена остановки, чтобы достичь остановки скольжения. Первый этап остановки сохраняет исходную настройку, второй этап переходит к убыточному равновесию, третий этап переходит к первой остановке.

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

Такой подход имеет следующие преимущества:

  1. Это позволяет закрепить часть прибыли, сохраняя при этом большую прибыльность.
  2. Использование стоп-пойнтов для отслеживания цен позволяет снизить вероятность отмены PRODID или убытков.
  3. Более эффективный контроль риска при многократном прерывании, чем при однократном прерывании.
  4. Стратегическая логика ясна, проста и понятна.

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

Однако эта стратегия несет в себе определенные риски:

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

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

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

  1. Тестирование различных остановочных расстояний, оптимизация параметров.
  2. В особых случаях следует учитывать механизм быстрого остановки убытков.
  3. Определение остановок и остановок в сочетании с техническими показателями.
  4. Оптимизировать ширину скольжения, сбалансировать торможение и остановку.
Исходный код стратегии
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © adolgov

// @description
// when tp1 is reached, sl is moved to break-even
// when tp2 is reached, sl is moved to tp1
// when tp3 is reached - exit

//@version=4
strategy("Stepped trailing strategy example", overlay=true)

// random entry condition
longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// sl & tp in points
sl = input(100)
tp1 = input(100)
tp2 = input(200)
tp3 = input(300)

curProfitInPts() =>
    if strategy.position_size > 0
        (high - strategy.position_avg_price) / syminfo.mintick
    else if strategy.position_size < 0
        (strategy.position_avg_price - low) / syminfo.mintick
    else
        0
        
calcStopLossPrice(OffsetPts) =>
    if strategy.position_size > 0
        strategy.position_avg_price - OffsetPts * syminfo.mintick
    else if strategy.position_size < 0
        strategy.position_avg_price + OffsetPts * syminfo.mintick
    else
        0
        
calcProfitTrgtPrice(OffsetPts) =>
    calcStopLossPrice(-OffsetPts)

getCurrentStage() =>
    var stage = 0
    if strategy.position_size == 0 
        stage := 0
    if stage == 0 and strategy.position_size != 0
        stage := 1
    else if stage == 1 and curProfitInPts() >= tp1
        stage := 2
    else if stage == 2 and curProfitInPts() >= tp2
        stage := 3
    stage

stopLevel = -1.
profitLevel = calcProfitTrgtPrice(tp3)

// based on current stage set up exit
// note: we use same exit ids ("x") consciously, for MODIFY the exit's parameters
curStage = getCurrentStage()
if curStage == 1
    stopLevel := calcStopLossPrice(sl)
    strategy.exit("x", loss = sl, profit = tp3, comment = "sl or tp3")
else if curStage == 2
    stopLevel := calcStopLossPrice(0)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "breakeven or tp3")
else if curStage == 3
    stopLevel := calcStopLossPrice(-tp1)
    strategy.exit("x", stop = stopLevel, profit = tp3, comment = "tp1 or tp3")
else
    strategy.cancel("x")
    
// this is debug plots for visulalize TP & SL levels
plot(stopLevel > 0 ? stopLevel : na, style = plot.style_linebr)
plot(profitLevel > 0 ? profitLevel : na, style = plot.style_linebr)