この戦略は,平均真の範囲 (ATR) と相対強度指数 (RSI) をベースとしたトレンドフォロー機能を持つ取引システムを設計する.トレンド方向を自動的に特定することができ,ストップ損失と利益の特徴を持っています.
ATR と RSI を計算します.ATR は,一期間の平均価格変動を反映します.RSI は,高値と低値の間のパワー比較を反映します.
ATRが移動平均値よりも高くなると,取引に適した高変動期と考えられる.
RSIが過剰購入線を超えると,ロング,RSIが過剰販売線を下回るとショート.
ロング後,高いポイントを固定比率で掛け算して,ストップ・ロスの値として使用します.ショート後,低いポイントを固定比率で掛け算して,ストップ・ロスの値として使用します.
利益比率で利益を取ります
ストップ・ロスはストップ・ロスを最大化して損失を減らすことができます
RSIは,波動市場での繰り返しポジションを開くのを避けるために,高値と低値の強さを効果的に判断することができます.
ATRは波動性指標として,範囲限定市場をフィルタリングし,トレンド市場の取引のみを行うことができます.
利益の比率で利益を得ることができます.
ATRとRSIの両方が遅れている指標であり,遅いエントリータイムにつながる可能性があります.パラメータは,システムをより敏感にするために最適化できます.
ストップ・ロスの固定利益と損失比は過度に最適化されやすいため,バックテスト結果に基づいて慎重に設定する必要があります.
サイクルの範囲に限定された大きな市場では,ATRは移動平均値よりも長期間高くなって,過剰取引につながる可能性があります.他のフィルターを追加することもできます.
ATRとRSIのパラメータを最適化して システムをより敏感にする
MAやその他の指標を追加して,トレンド方向を決定し,誤ってレンジ・バインド市場に入らないようにします.
固定設定の代わりに 動的ストップ損失と利益比を取ってみてください
取引の規模を制御する措置を追加することを検討する.
この戦略は,ATRおよびRSI指標の利点を統合し,トレーディングシステムに続くシンプルで実践的なトレンドを設計する.パラメータ最適化とフィルターを追加することによってシステムの安定性をさらに改善する.全体的に,この戦略はライブトレーディングに強力な実践的な価値を持っています.
/*backtest start: 2023-09-08 00:00:00 end: 2023-10-08 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © liwei666 //@version=5 // # ========================================================================= # // # | Strategy | // # ========================================================================= # strategy( title = "ATR_RSI_Strategy v2[liwei666]", shorttitle = "ATR_RSI_Strategy", overlay = true, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500, max_bars_back = 5000, initial_capital = 10000, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, pyramiding=1, commission_value=0.05 ) // # ========================================================================= # // # | Strategy | // # ========================================================================= # atr_length = input.int(26, "atr_length", minval = 6, maxval = 100, step=1) atr_ma_length = input.int(45, "atr_ma_length", minval = 6, maxval = 100, step=1) rsi_length = input.int(15, "rsi_length", minval = 6, maxval = 100, step=1) rsi_entry = input.int(10, "rsi_entry", minval = 6, maxval = 100, step=1) atr_ma_norm_min = input.float(0.3, "atr_ma_norm_min", minval = 0.1, maxval = 0.5, step=0.1) atr_ma_norm_max = input.float(0.7, "atr_ma_norm_max", minval = 0.5, maxval = 1, step=0.1) trailing_percent= input.float(1.5, "trailing_percent", minval = 0.1, maxval = 2, step=0.1) var rsi_buy = 50 + rsi_entry var rsi_sell = 50 - rsi_entry sma_norm_h_45() => source = high n = 45 sma = ta.sma(source, n) sma_norm = (sma - ta.lowest(sma, n)) / (ta.highest(sma,n) - ta.lowest(sma, n)) sma_norm atr_value = ta.atr(atr_length) atr_ma = ta.sma(atr_value, atr_ma_length) rsi_value = ta.rsi(close, length = rsi_length) atr_ma_norm = atr_ma / close * 100 sma_norm = sma_norm_h_45() var intra_trade_high = 0.0 var intra_trade_low = 0.0 if strategy.position_size == 0 intra_trade_high := high intra_trade_low := low if atr_ma_norm >= atr_ma_norm_min and atr_ma_norm <= atr_ma_norm_max if atr_value > atr_ma if rsi_value > rsi_buy strategy.entry("B1", strategy.long, limit = close + 5 ) else if rsi_value < rsi_sell strategy.entry("S1", strategy.short, limit = close - 5 ) else if strategy.position_size > 0 intra_trade_high := math.max(intra_trade_high, high) intra_trade_low := low long_tp = intra_trade_high * (1 - trailing_percent / 100) strategy.exit("Exit B1", from_entry="B1", stop = long_tp, limit = strategy.position_avg_price * 1.03) else if strategy.position_size < 0 intra_trade_high := high intra_trade_low := math.min(intra_trade_low, low) short_tp = intra_trade_low * (1 + trailing_percent / 100) strategy.exit("Exit S1", from_entry="S1", stop = short_tp, limit = strategy.position_avg_price * 0.94)