
Это очень простая стратегия. Она состоит только из одной отслеживаемой остановки. Когда остановка была вызвана, позиция была перевернута и на новой позиции была установлена отслеживаемая остановка.
Стратегия построена на основе одного из трех типов остановок: процентное остановка, остановка ATR и абсолютная остановка. Когда остановка была вызвана, позиция была перевернута и на новой позиции был установлен следящий остановка.
В частности, стратегия сначала рассчитывает стоп-цену в зависимости от выбранного типа стоп-убытков. Затем она определяет, есть ли сигналы о создании позиции, то есть высокая цена больше, чем предыдущая стоп-цена, когда она делает больше, а низкая цена меньше, чем предыдущая стоп-цена, когда она делает пустое. После входа в игру она обновляет стоп-цену в реальном времени, чтобы она отслеживала изменения цены.
Самым большим преимуществом этой стратегии является то, что она очень проста, требует отслеживания только одного стопа, не требует учета выбора входных и выходных точек. Гибкая настройка стоп-стоп также делает ее более широкой.
По сравнению с фиксированными стопами, он использует следящие стопы, которые позволяют закрепить большую прибыль, а также снижают вероятность того, что стопы будут ударены. Каждый раз, когда возникает стоп, можно перевернуть позицию, чтобы захватить возможность перехода цены.
Основными рисками, которые могут возникнуть в этой стратегии, являются риски, связанные с неправильным установлением стоп-цены. Слишком большая стоп-цену может привести к увеличению убытков; слишком маленькая стоп-цену может привести к частому срабатыванию стоп-цен. Это требует целевой оптимизации в зависимости от рыночных условий.
Другой риск заключается в неточном определении направления поворота позиции после снятия убытков, что может привести к упущению возможности для изменения цены или увеличению убытков. Это требует определения оптимального времени для поворота в сочетании с трендовым и поддерживающим резистентным суждением.
Эта стратегия может быть оптимизирована в следующих аспектах:
Стратегия получает прибыль с помощью простого механизма отслеживания стоп-убытков, это количественная стратегия, подходящая для начинающих. По сравнению с традиционной стоп-стратегией, она добавляет механизм обратного преобразования позиций после снятия убытков, что позволяет получить дополнительную прибыль. Благодаря постоянному тестированию и оптимизации стратегия может стать очень практичной количественной программой.
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)
////////////
// Inputs //
sl_type = input("%", options = ["%", "ATR", "Absolute"])
sl_perc = input(4, title = "% SL", type = input.float)
atr_length = input(10, title = "ATR Length")
atr_mult = input(2, title = "ATR Mult", type = input.float)
sl_absol = input(10, title = "Absolute SL", type = input.float)
// BACKTESTING RANGE
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2016, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2100, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
//////////////////
// CALCULATIONS //
// SL values
sl_val = sl_type == "ATR" ? atr_mult * atr(atr_length) :
sl_type == "Absolute" ? sl_absol :
close * sl_perc / 100
// Init Variables
pos = 0
trailing_sl = 0.0
// Signals
long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1])
// Calculate SL
trailing_sl := short_signal ? high + sl_val :
long_signal ? low - sl_val :
nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) :
nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) :
nz(trailing_sl[1])
// Position var
pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1])
//////////////
// PLOTINGS //
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//////////////
// STRATEGY //
if (time_cond and pos != 1)
strategy.entry("long", true, stop = trailing_sl)
if (time_cond and pos != -1)
strategy.entry("short", false, stop = trailing_sl)