혼란스러운 거래 규칙 손실 중지 전략

저자:차오장, 날짜: 2023-11-07 16:44:31
태그:

img

전반적인 설명

이 전략의 핵심 아이디어는 RSI 전략에 기초한 몇 가지 주요 거래 관리 규칙을 추가하는 것입니다. 스톱 로스, 수익을 취하기, 트레일링 스톱 로스 및 레버리지 추적 스톱 로스 등이 포함됩니다. 이는 트렌딩 시장에서 더 높은 수익을 달성하고 백테스트에서 시장의 범위에서 손실을 최소화 할 수 있습니다.

전략 논리

이 전략은 먼저 RSI 지표를 계산합니다. RSI가 과소매 수준 이하일 때 장거리, RSI가 과소매 수준 이상일 때 단거리입니다.

긴 신호가 트리거 된 후, 그 때 가장 높은 가격은 후속 스톱 손실 참조 포인트로 기록됩니다. 가격이 스톱 손실 포인트 미만의 스톱 손실 범위를 넘어지면 포지션은 스톱 손실로 닫습니다.

쇼트 신호가 발사된 후, 그 때 가장 낮은 가격은 후속 스톱 로스 참조 포인트로 기록됩니다. 가격이 스톱 로스 포인트와 스톱 로스 범위를 초과하면 포지션은 스톱 로스로 닫습니다.

동시에, 고정된 취업 이익 및 스톱 손실 거리는 설정됩니다. 가격이 취업 이익 거리에 도달하면, 포지션을 닫기 위해 수익을 얻습니다. 스톱 손실 거리에 도달하면, 스톱 손실로 포지션을 닫습니다.

또한, 레버리지 추적 스톱 로스 라인은 레버리지에 따라 설정됩니다. 가격이 레버리지 추적 스톱 로스 라인에 도달하면 포지션은 스톱 로스로 종료됩니다.

상승 추세에서 가장 높은 가격과 하락 추세에서 가장 낮은 가격을 추적하여 고정된 수익 및 스톱 손실 거리와 결합하여 트렌딩 시장에서 더 높은 수익을 얻을 수 있습니다. 한편, 레버리지 추적 스톱 손실은 손실의 확장을 피하는 데 도움이됩니다.

이점 분석

이 전략의 가장 큰 장점은 RSI 전략의 장점을 활용하면서 위험을 더 잘 제어하는 여러 거래 관리 규칙의 도입입니다.

특히 이점은 다음과 같습니다.

  1. 트레일링 스톱 로스는 트렌드 시장에서 더 높은 수익을 얻기 위해 지속적으로 트렌드를 따라갈 수 있습니다.

  2. 일정한 수익을 취하고 손실을 멈추는 것은 일부 수익을 잠금하고 트렌드가 뒤집어지면 전체 이익이 사라지는 것을 피합니다.

  3. 스톱 로스를 추적하는 레버리지는 손실의 확장을 피하고 위험을 제어하는 데 도움이 됩니다.

  4. 다양한 스톱 로스 방법의 조합은 다른 시장 환경에서 강점을 발휘하여 전략의 전반적인 안정성을 향상시킬 수 있습니다.

  5. 전략 매개 변수들의 유연한 조정은 다른 거래 도구와 시장 환경에 적합합니다.

  6. 이해하기 쉬운 논리는 검증, 최적화 및 응용을 촉진합니다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. RSI 전략 자체에는 약간의 윙사 리스크가 있으며 이는 스톱 로스를 유발할 수 있습니다. RSI 매개 변수를 최적화 할 수 있습니다.

  2. 스톱 로스 포인트를 둘러싼 오스칠레이션은 종종 스톱 로스를 유발할 수 있다. 스톱 로스 범위는 확장될 수 있다.

  3. 이윤 거리는 트렌드 시장에서 수익을 완전히 차단 할 수 없습니다. 다른 지표는 트렌드 종료를 결정하는 데 도움이 될 수 있습니다.

  4. 고정 스톱 손실 거리는 손실을 완전히 피하기에는 너무 작을 수 있습니다. 오스실레이션 스톱 손실 또는 동적 스톱 손실을 사용하는 것을 고려하십시오.

  5. 과도한 레버리지는 엔트리 가격에 너무 가까이 있는 스톱 로스로 이어집니다. 낮은 레버리지 설정을 사용해야합니다.

  6. 백테스트 기간은 미래의 시장 상황을 완전히 나타내지 않을 수 있습니다. 적절한 위험 통제가 시행되어야하며 다른 기간을 테스트해야합니다.

위의 위험은 매개 변수 조정, 스톱 로스 메커니즘 최적화, 위험 관리 등을 통해 완화 될 수 있습니다. 그러나 어떤 전략도 시장 위험을 완전히 피할 수 없습니다. 적절한 위험 통제는 필수입니다.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. Whipsaw 트레이드를 줄이기 위해 RSI 매개 변수를 최적화하고 다른 시장에 최적의 매개 변수를 테스트합니다.

  2. KD, MACD 같은 다른 지표를 RSI와 결합하여 항목을 필터링해보세요.

  3. 기계 학습을 사용하여 동적으로 스톱 손실 및 수익 매개 변수를 최적화합니다.

  4. 더 복잡한 스톱 로스 메커니즘을 테스트합니다. 오스실레이션 스톱 로스, 평균 스톱 로스, 동적 스톱 로스 등.

  5. 레버리지 설정 최적화 및 수익 및 위험 통제에 대한 영향을 연구.

  6. 시장의 변화에 따라 자동으로 조정되는 매개 변수, 예를 들어 α-두중 추진력.

  7. 트렌드 지속성을 결정하기 위해 다른 요소를 포함합니다. 예를 들어 부피 에너지.

  8. 더 견고하고 해석 가능한 스톱 로스 방법을 개발하기 위해 딥 러닝 모델을 사용합니다.

  9. 전략의 안정성을 평가하기 위해 다양한 도구와 기간에서 데이터를 테스트합니다.

결론

이 전략은 다양한 스톱 로스 방법과 함께 RSI 전략을 보완하여 트렌드로부터 이익을 얻고 위험을 제어하는 데 스톱 로스의 이중 효과를 완전히 발휘합니다. 여전히 최적화에 대한 넓은 공간이 있습니다. 아이디어는 더 많은 전략과 거래 도구로 확장 될 수 있습니다. 스톱 로스 전략은 심도있는 연구에 가치가 있으며 지속적인 최적화와 검증 후에 기계적 거래 시스템의 매우 중요한 부분이 될 수 있습니다.


/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Adding some essential components to a prebuilt RSI strategy", overlay=true)

/////////////// Component Code Start ///////////////
testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2016, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/////////////// Component Code Stop ///////////////

///////////// RSI component /////////////
length = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close

vrsi = rsi(price, length)
notna = not na(vrsi)

/////////////// STRATEGY ///////////////
ts = input(99999, "Trailing Stop") / 100
tp = input(99999, "Take Profit") / 100
sl = input(99999, "Stop Loss") / 100

long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(200, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=long_signal)
    strategy.entry("Short", strategy.short, when=short_signal)

    // plot(long_call, color=red)
    // plot(short_call, color=green)
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)

더 많은