이 전략은 RSI (관계 강도 지수) 지표에 기반하여 과소득 및 과소득 조건을 결정합니다. RSI가 과소득 또는 과소득 수준에 도달하면 낮은 가격으로 구매하고 높은 가격으로 판매 할 때 역 트렌드 포지션을 취합니다. 전략은 간단하고 효과적이며 시장에서 단기적인 과소득 및 과소득 시나리오를 활용합니다.
이 전략은 RSI 지표를 입력 신호로만 사용합니다. RSI가 낮은 지점 (20 기본값) 아래로 넘어가면 긴 거리로 이동하고, RSI가 높은 지점 (80 기본값) 을 넘어가면 짧은 거리로 이동합니다. 매번 고정 금액 (100 기본값) 을 거래하며 시장 조건에 관계없이 1%의 이익을 목표로합니다. 손실이 3%에 도달하면 중단됩니다. 거래 빈도를 제어하기 위해 전략은 손실 거래 후 24 바로 거래를 중단합니다.
핵심 논리는
우리가 볼 수 있듯이, 전략은 매우 간단하고 기계적입니다. 매개 변수 최적화에 대한 공간이 거의 없습니다. 그것은 단순히 RSI의 수학적 특성을 이용하여 과잉 구매 / 과잉 판매 지역의 역 트렌드 포지션을 취합니다.
이 전략의 가장 큰 장점은 단순성과 효율성입니다.
또한 수익을 차단하고 위험을 제어하기 위해 스톱 로스 / 취득 비율을 구현하며 빈도를 줄이기 위해 거래 중단도 수행합니다. 이는 위험을 최소화하면서 보상을 극대화합니다.
이 전략의 주요 위험은 다음과 같습니다.
강한 트렌드 시장에서 수익을 낼 수 없습니다. RSI는 트렌드가 지속될 때 장기간 과반 구매 / 과반 판매 구역에 머물러있을 수 있습니다.
너무 큰 스톱 로스는 과도한 손실로 이어질 수 있습니다. 현재 3%의 스톱 로스는 1-2%로 줄여야 할 수 있습니다.
높은 거래 주파수는 승리의 후에 과도한 거래로 이어질 수 있습니다. 거래 주파수를 제한해야합니다.
100달러 규모의 위험집약이 고정되어 자본의 %로 최적화되어야 합니다.
분석을 바탕으로 전략은 다음과 같은 방법으로 개선될 수 있습니다.
트렌드가 명확하지 않을 때 MA와 같은 트렌드 필터를 추가하여 거래를 일시 중지합니다.
스톱 로스/프로피트 취업 비율을 최적화합니다. 스톱 로스를 1-2%로 줄이고 동적 스톱 로프트를 사용합니다.
거래 빈도를 제한합니다. 한 시간 동안 최대 2개의 거래가 가능합니다.
100달러가 아닌 자본의 비율을 기준으로 거래합니다.
RSI 매개 변수를 최적화합니다.
자본이 증가할 때 규모를 늘리지 않도록 포지션 사이징을 추가합니다.
이러한 최적화로 위험을 줄이고 안정성을 크게 향상시킬 수 있습니다.
요약하자면, 이것은 단기 평균 회귀를 위해 과반 구매 / 과반 판매 조건을 거래하기 위해 RSI를 사용하는 간단하고 직설적인 전략입니다. 장점은 단순성, 효율성, 예측이 필요하지 않으며 명확한 논리, 테스트하기 쉽습니다. 단점은 강력한 트렌드와 잠재적 인 손실에서 이익을 얻을 수 없다는 것입니다. 트렌드 필터, 최적화된 매개 변수, 포지션 사이징 등과 같은 추가로 안정성과 수익성을 위해 더욱 향상시킬 수 있습니다. 논리는 올바르게 적용되면 실용적인 거래에 혁신적이고 가치가 있습니다.
/*backtest start: 2023-11-02 00:00:00 end: 2023-11-09 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash) open_pos = input.int(50000, title = "每次开单资金(usdt)") rsi_period = input.int(14, title = "rsi周期") rsi_line = input.float(20.0, title='RSI触发线', step=0.05) stop_rsi_top_line = input.float(70, title = "顶部rsi止损线") stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线") stop_loss_perc = input.float(0.03, title = "止损线") stop_profit = input.float(0.01, title = "止盈") loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易") rsiParam = ta.rsi(close, rsi_period) var int failedTimes = 0 var bool stopTrade = false // plot(rsiParam) if stopTrade failedTimes += 1 if failedTimes == loss_stop_trade_k failedTimes := 0 stopTrade := false // 获取当前持仓方向 checkCurrentPosition() => strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0 curPosition = checkCurrentPosition() // 当前持仓成本价 position_avg_price = strategy.position_avg_price // 当前持单, 触达反向的rsi线,清仓 if curPosition > 0 and rsiParam >= stop_rsi_top_line strategy.close_all(comment = "closebuy") if curPosition < 0 and rsiParam <= stop_rsi_bottom_line strategy.close_all(comment = "closesell") // 止盈止损清仓 if curPosition > 0 // if (position_avg_price - close) / close >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closebuy") // stopTrade := true if (close - position_avg_price) / position_avg_price >= stop_profit // 止盈 strategy.close_all(comment = "closebuy") if curPosition < 0 // if (close - position_avg_price) / position_avg_price >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closesell") // stopTrade := true if (position_avg_price - close) / close >= stop_profit // 止盈 strategy.close_all(comment = "closesell") a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0 stopTrade := true var float openPrice = 0.0 if rsiParam <= rsi_line and stopTrade == false strategy.entry("long", strategy.long, open_pos / close, comment = "long") if curPosition == 0 openPrice := close strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy") if rsiParam >= 100 - rsi_line and stopTrade == false strategy.entry("short", strategy.short, open_pos / close, comment = "short") if curPosition == 0 openPrice := close strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell") plot(failedTimes)