이 전략은 트렌드 방향을 결정하기 위해 가격의 모멘텀을 계산하고 수익을 잠금하기 위해 양방향 추적 중지 설정하여 트렌드를 따라 스톱 손실을 실현합니다. 이 전략은 또한 특정 이익 목표에 도달한 후에만 추적을 시작하도록 활성화 수준을 결합하여 조기 스톱 손실을 효과적으로 예방합니다.
12주기 가격 모멘텀을 계산하고 1주기 모멘텀을 계산합니다. 빠른 모멘텀 (1주기 가격 모멘텀) 이 0보다 크면, 그것은 길어집니다. 0보다 작을 때, 그것은 짧습니다. 이것은 가격 트렌드를 결정하기 위해 가격 모멘텀의 방향 변화를 판단합니다.
트레일링 스톱 거리 및 활성화 수준을 설정합니다. 트레일링 스톱 거리는 가격이 새로운 최고 또는 최저에 도달 할 때 최신 최고 또는 최저에서 지정된 거리에 정지하는 것을 의미합니다. 활성화 수준은 특정 이익 비율에 도달한 후에만 트레일링 스톱이 시작된다는 것을 의미합니다.
이 전략은 가장 높은 가격이나 가장 낮은 가격을 추적하여 수익을 확보하고, 가격이 정해진 스톱 거리를 넘어 갈 때 클로즈 오더를 전송합니다.
이중 모멘텀 결정은 트렌드 방향을 정확하게 판단하고 트레이드를 줄이고 함정에 빠지는 것을 피합니다.
유연한 후속 정지 거리는 위험과 수익을 줄여줍니다.
액티베이션 레벨은 수익 목표가 달성된 후에만 트래일링을 허용함으로써 조기 스톱 손실을 방지합니다.
양방향 스톱은 장기 및 단위 모두에 대한 위험을 포괄적으로 제어합니다.
간단하고 효율적인 계산, 이해하기 쉽고 실행하기 쉽습니다.
이중 모멘텀은 역 신호를 생성할 수 있어 트렌드 필터가 필요합니다.
과도한 정지 거리는 상당한 손실을 일으킬 수 있습니다.
높은 활성화 수준은 멈출 기회를 놓칠 수 있습니다.
최적의 정지를 찾기 위해 더 많은 매개 변수 테스트와 최적화가 필요합니다.
트렌드 판단과 매개 변수 최적화를 통해 잘못된 신호를 줄일 수 있습니다. 최상의 구성을 찾기 위해 다른 제품과 매개 변수 세트에 테스트하십시오.
트렌드에 대한 시장 구조 인식을 결합하고 역 거래를 피합니다.
더 많은 타이밍 조건을 추가합니다. 음량 변화, 신호 정확성을 향상시키기 위해 브레이크오웃을 압축합니다.
다른 정지 거리와 활성화 레벨을 테스트하여 매개 변수를 최적화합니다.
시장 변동성에 따라 동적 트레일링 스톱을 고려하십시오.
더 나은 위험 통제를 위해 부분 중지 또는 이동 중지 설정.
이 전략은 명확한 구조를 가지고 있으며, 트렌드를 이중 추진력으로 판단하고 유연한 트레일링 스톱으로 수익을 잠금하고, 거래 위험을 효과적으로 제어합니다. 최적화 가능한 공간으로 이해하고 구현하기가 쉽습니다. 더 많은 기술적 지표와 매개 변수 테스트를 추가하면 전략 성능을 더욱 향상시킬 수 있습니다. 이 전략은 스톱 로스 관리를 실현하기위한 아이디어와 참조를 제공합니다.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trailing Stop Snippet", overlay=true) length = input(12) price = close momentum(seria, length) => mom = seria - seria[length] mom mom0 = momentum(price, length) mom1 = momentum( mom0, 1) tsact = input.float(0.0, "Trailing Stop Activation |", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100 tsact := tsact ? tsact : na ts = input.float(0.0, "Position Trailing Stop |", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100 ts := ts ? ts : na in_long = strategy.position_size > 0 in_short = strategy.position_size < 0 var ts_ = array.new_float() ts_size = array.size(ts_) ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0 if in_long if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if not tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if in_short if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) if not tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na if (mom0 > 0 and mom1 > 0) strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and mom1 < 0) strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE") else strategy.cancel("MomSE") tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na if trail strategy.close_all() if not strategy.opentrades array.clear(ts_) //plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr) plotchar(ts_get, "GET", "") plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross) plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross) plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)