Двухэтапная стратегия стоп-лосса


Дата создания: 2023-10-25 18:11:30 Последнее изменение: 2023-10-25 18:11:30
Копировать: 0 Количество просмотров: 729
1
Подписаться
1617
Подписчики

Двухэтапная стратегия стоп-лосса

Обзор

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

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

Эта стратегия основана на входе в Бриндовую и Стохастическую полосы. Продажи делаются, когда цена выходит за пределы Бриндовой полосы, а продажи - когда Стохастический индикатор показывает перепродажу.

В частности, логика входа в стратегию состоит из следующего:

  1. При закрытии цены ниже нижней линии Брин, и при прохождении линии D под линией Stochastic K, делается дополнительный вход

  2. Открытие входа, когда цена закрытия выше, чем на трассе по Беринской полосе, и когда линия Stochastic K проходит через линию D

Стратегия устанавливает две остановки, первая остановка фиксируется на 200, а вторая - на 500.

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

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

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

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

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

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

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

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

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

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

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

  1. Можно тестировать различные комбинации параметров, оптимизировать буринские и стохастические параметры, чтобы найти оптимальную комбинацию.

  2. Можно протестировать различные параметры остановочных точек, оптимизировать размер остановочных точек и найти оптимальную конфигурацию.

  3. Дополнительные показатели, такие как скользящие средние, могут быть добавлены в состав многопоказательной комбинации стратегий для повышения точности входа в игру.

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

  5. Можно увеличить количество движений стоп-точек, установив три или более этапов стоп-движений.

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

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

Исходный код стратегии
/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © fpsd4ve

//@version=5

// Add Bollinger Bands indicator (close, 20, 2) manually to visualise trading conditions
strategy("2xTP, SL to entry", 
     overlay=false,
     pyramiding=0,
     calc_on_every_tick=false,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=25,
     initial_capital=1000,
     commission_type=strategy.commission.percent,
     commission_value=0.01
     )

// PARAMETERS
// Assumes quote currency is FIAT as with BTC/USDT pair
tp1=input.float(200, title="Take Profit 1")
tp2=input.float(500, title="Take Profit 2")
sl=input.float(200, title="Stop Loss")
stOBOS = input.bool(true, title="Use Stochastic overbought/oversold threshold")

// Colors
colorRed = #FF2052
colorGreen = #66FF00


// FUNCTIONS
// Stochastic
f_stochastic() =>
    stoch = ta.stoch(close, high, low, 14)
    stoch_K = ta.sma(stoch, 3)
    stoch_D = ta.sma(stoch_K, 3)
    stRD = ta.crossunder(stoch_K, stoch_D)
    stGD = ta.crossover(stoch_K, stoch_D)
    [stoch_K, stoch_D, stRD, stGD]


// VARIABLES
[bbMiddle, bbUpper, bbLower] = ta.bb(close, 20, 2)
[stoch_K, stoch_D, stRD, stGD] = f_stochastic()


// ORDERS
// Active Orders
// Check if strategy has open positions
inLong = strategy.position_size > 0
inShort = strategy.position_size < 0
// Check if strategy reduced position size in last bar
longClose = strategy.position_size < strategy.position_size[1]
shortClose = strategy.position_size > strategy.position_size[1]

// Entry Conditions
// Enter long when during last candle these conditions are true:
// Candle high is greater than upper Bollinger Band
// Stochastic K line crosses under D line and is oversold
longCondition = stOBOS ?
     low[1] < bbLower[1] and stGD[1] and stoch_K[1] < 25 :
     low[1] < bbLower[1] and stGD[1]

// Enter short when during last candle these conditions are true:
// Candle low is lower than lower Bollinger Band
// Stochastic K line crosses over D line and is overbought
shortCondition = stOBOS ?
     high[1] > bbUpper[1] and stRD[1] and stoch_K[1] > 75 :
     high[1] > bbUpper[1] and stRD[1]

// Exit Conditions
// Calculate Take Profit 
longTP1 = strategy.position_avg_price + tp1
longTP2 = strategy.position_avg_price + tp2
shortTP1 = strategy.position_avg_price - tp1
shortTP2 = strategy.position_avg_price - tp2

// Calculate Stop Loss
// Initialise variables
var float longSL = 0.0
var float shortSL = 0.0

// When not in position, set stop loss using close price which is the price used during backtesting
// When in a position, check to see if the position was reduced on the last bar
// If it was, set stop loss to position entry price. Otherwise, maintain last stop loss value
longSL := if inLong and ta.barssince(longClose) < ta.barssince(longCondition)
    strategy.position_avg_price
else if inLong
    longSL[1]
else
    close - sl

shortSL := if inShort and ta.barssince(shortClose) < ta.barssince(shortCondition)
    strategy.position_avg_price
else if inShort
    shortSL[1]
else
    close + sl

// Manage positions
strategy.entry("Long", strategy.long, when=longCondition)
strategy.exit("TP1/SL", from_entry="Long", qty_percent=50, limit=longTP1, stop=longSL)
strategy.exit("TP2/SL", from_entry="Long", limit=longTP2, stop=longSL)

strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("TP1/SL", from_entry="Short", qty_percent=50, limit=shortTP1, stop=shortSL)
strategy.exit("TP2/SL", from_entry="Short", limit=shortTP2, stop=shortSL)


// DRAW
// Stochastic Chart
plot(stoch_K, color=color.blue)
plot(stoch_D, color=color.orange)

// Circles
plot(stOBOS ? stRD and stoch_K >= 75 ? stoch_D : na : stRD ? stoch_D : na, color=colorRed, style=plot.style_circles, linewidth=3)
plot(stOBOS ? stGD and stoch_K <= 25 ? stoch_D : na : stGD ? stoch_K : na, color=colorGreen, style=plot.style_circles, linewidth=3)

// Levels
hline(75, linestyle=hline.style_dotted)
hline(25, linestyle=hline.style_dotted)