이것은 가격 변동성에 기반한 트렌드 추적 스톱 로스 전략이다. 가격 변동에 대한 스톱 로스 라인을 설정하기 위해 평균 참 범위 (ATR) 를 사용합니다. ATR은 가격의 변동성과 위험 수준을 반영합니다. 가격이 스톱 로스 라인을 초과하면 전략은 트렌드 반전을 판단하고 해당 조치를 취하여 포지션을 열거나 손실을 중지합니다.
전략은 먼저 특정 기간 동안의 평균 진정한 범위 (ATR) 를 계산합니다. 그 다음 현재 가격 트렌드 방향에 따라 상승 추세라면 현재 최고 가격 마이너스 n 배의 ATR로 스톱 로스 라인을 설정합니다. 하락 추세라면 현재 최저 가격과 n 배의 ATR로 스톱 로스 라인을 설정합니다. n 값은 스톱 로스 라인과 가격 사이의 거리를 제어하기 위해 매개 변수를 통해 조정 할 수 있습니다.
가격이 상승 트렌드 또는 하락 트렌드의 스톱 로스 라인을 통과하면 트렌드가 변경된 것으로 판단됩니다. 이 시점에서 전략은 스톱 로스 포지션을 클리어하고 새로운 트렌드 방향에 따라 새로운 스톱 로스 라인을 설정합니다.
요약하자면, 전략은 가격 변동성을 사용하여 트렌드 변화에 대한 정확한 판단을 달성하기 위해 스톱 로스 라인을 설정합니다. 트렌드 변화가 발생했을 때 신속한 스톱 로스는 전략이 새로운 트렌드의 방향을 파악하는 데 도움이됩니다.
전체적으로 이것은 가격 변동성에 기초한 스톱 로스 라인을 설정하는 좋은 알고리즘 구현입니다. 가격 트렌드를 판단하는 정확도는 높으며 트렌드의 주요 전환점을 캡처 할 수 있습니다. 또한 더 나은 적응력을 위해 매개 변수 조정에 약간의 공간을 제공합니다. 스톱 로스 전략으로 시장 역전의 위험을 효과적으로 피할 수 있으며 라이브 거래에서 적용 할 가치가 있습니다.
/*backtest start: 2022-11-30 00:00:00 end: 2023-11-30 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/ // © laptevmaxim92 //@version=4 strategy("Volatility stop strategy", overlay=true) length = input(20) mult = input(2, step = 0.1) utp = input(false, "Use take profit?") pr = input(100, "Take profit pips") usl = input(false, "Use stop loss?") sl = input(100, "Stop loss pips") fromday = input(01, defval=01, minval=01, maxval=31, title="From Day") frommonth = input(01, defval=01, minval= 01, maxval=12, title="From Month") fromyear = input(2000, minval=1900, maxval=2100, title="From Year") today = input(31, defval=01, minval=01, maxval=31, title="To Day") tomonth = input(12, defval=12, minval=01, maxval=12, title="To Month") toyear = input(2039, minval=1900, maxval=2100, title="To Year") use_date = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 00, 00)) atr_ = atr(length) max_ = 0.0 min_ = 0.0 max1 = 0.0 max1 := max(nz(max_[1]), close) min1 = 0.0 min1 := min(nz(min_[1]), close) vstop = 0.0 is_uptrend = false is_uptrend_prev = false is_uptrend_prev := nz(is_uptrend[1], true) stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_ vstop_prev = nz(vstop[1]) vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend := close - vstop1 >= 0 is_trend_changed = is_uptrend != is_uptrend_prev max_ := is_trend_changed ? close : max1 min_ := is_trend_changed ? close : min1 vstop := is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1 plot(vstop, color = is_uptrend ? color.green : color.red, linewidth=2) longCondition = is_uptrend if (longCondition and use_date) strategy.entry("BUY", strategy.long) shortCondition = not is_uptrend if (shortCondition and use_date) strategy.entry("SELL", strategy.short) if (utp and not usl) strategy.exit("TP", "BUY", profit = pr) strategy.exit("TP", "SELL", profit = pr) if (usl and not utp) strategy.exit("SL", "BUY", loss = sl) strategy.exit("SL", "SELL", loss = sl) if (usl and utp) strategy.exit("TP/SL", "BUY", loss = sl, profit = pr) strategy.exit("TP/SL", "SELL", loss = sl, profit = pr)