
이것은 매우 간단한 전략이다. 그것은 단지 하나의 추적 스톱으로 구성된다. 스톱이 유발되면, 포지션은 반전되고, 새로운 포지션에 대한 추적 스톱이 설정된다.
이 전략은 세 가지의 중지 유형 중 하나를 기반으로 구성됩니다: 퍼센트 중지, 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)