この戦略は,過剰購入および過剰販売条件を決定するために,RSI (相対強度指数) 指標に基づいています.RSIが過剰購入または過剰販売レベルに達すると,低価格で購入し高価格で販売するために反トレンドポジションをとります.この戦略は,短期的な過剰購入および過剰販売シナリオから利益を得て,シンプルかつ効果的です.
この戦略は,RSIインジケーターをエントリー信号としてのみ使用する.RSIが低点 (20のデフォルト) 以下の値を超えるとロングになり,RSIが高点 (80のデフォルト) を超えるとショートする.毎回固定金額 (100のデフォルト) を取引し,市場の状況に関係なく1%の利益を目指す.損失が3%に達すると停止する.取引頻度を制御するために,戦略は負け取引後に24バーで取引を停止する.
基本的な論理は
この戦略は,非常にシンプルで機械的なものです.パラメータ最適化のためのスペースはほとんどありません.それは純粋にRSIの数学特性を利用して,過剰購入/過剰販売地域周辺の反トレンドポジションを取ります.
この戦略の最大の利点は シンプルさと効率性です
また,ストップ・ロスト/テイク・プロフィート比を導入し,利益を固定し,リスクを制御し,頻度を減らすために取引を停止する.これはリスクを最小限に抑えながら報酬を最大化します.
この戦略の主なリスクは次のものから生じる.
強いトレンド市場では利益を得ることができない.RSIはトレンドが続く場合,長期間にわたって過買い/過売れ地帯にとどまる可能性があります.
ストップ損失が幅が大きすぎると,損失が過剰になる.現在の 3% のストップ損失を 1-2% に減らす必要があるかもしれない.
高い取引頻度は,勝った後に過剰な取引につながる可能性があります. 取引頻度を制限する必要があります.
固定100ドルのリスク集中 資本の%に最適化すべきです
分析に基づいて,戦略は以下の方法で改善できます.
トレンドが不明であるときに取引を一時停止するためにMAのようなトレンドフィルターを追加します.
ストップ・ロスト/テイク・プロフィートの比率を最適化します.ストップ・ロストを1-2%に削減し,ダイナミック・テイク・プロフィートを使用します.
取引の頻度を制限する.例えば,1時間間に最大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)