この戦略は,RSIインジケーターとトレンド後の重度の移動平均を組み合わせます.RSIが60を超えるとロングになり,RSIが40を下回るとショートになります.移動平均はトレンド状態を検証します.40期間のRSIはトレンドフォローインジケーターとして機能します.重度の移動平均は,短期変動の影響を軽減するために異なる重みを使用します.戦略はリスクを管理するためにストップ・ロストとトライリング・テイク・プロフィートも使用します.
この戦略は,まず,RSIと重度の移動平均を計算する.RSIの長さは20期であり,重度のMA長さは20期であり,短期波動性の影響を軽減するより高い重量があります.RSIが60を超え,重度のMAの変動率は-1%未満の場合,ロングになります.RSIが40未満で,重度のMAの変動率は1%を超えるとショートになります.
ロングまたはショートを開いた後,ストップ損失とトレーリングテイクプロフィートオーダーは同時に配置されます.ストップ損失は現在の価格から3ATRに設定されます.初期トレーリングテイクプロフィートアクティベーションは4ATR離れていて,3%の増加でトレイルされます.価格がストップ損失またはトレーリングテイクプロフィートアクティベーションに当たると,ポジションは閉鎖されます.
この戦略には,固定分数式ポジションサイズのアプローチに基づくマネーマネジメントのルールも含まれています.PNLが固定額に達するたびに,注文サイズは固定額で増加または減少します.
全体の利点は,トレンドをフォローする能力であり,リスクをコントロールするためにストップ・ロストとトライリング・プロフィート・メーチャーを取ることで,強いトレンドで重要な利益を得ることができる.
主なリスクは,RSI信号の信頼性とストップ・ロスト/トライリング・テイク・プロフィート設定から生じる.不正なパラメータは,不必要な取引の終了またはリスク欲求を超えた損失を引き起こす可能性があります.ストップ・ロスト/テイク・プロフィートの破綻は,不当なストップアウトを強制し,トレンド取引を継続する機会を失う可能性があります.
ソリューションには,RSIパラメータを最適化したり,シグナル確認のための他の指標を追加したりする.異なる製品と変動条件に基づいてストップ/トレイル取利益レベルを調整する.また,過度のリスクを避けるためにマネーマネジメント規則に慎重である.
最適化するには多くの側面があります.まずは,RSI信号を補完するための他の指標を特定することです.次の重要なステップは,歴史的なパフォーマンスに基づいてストップ損失/トレーリング・テイク・プロフィートのパラメータを最適化することです.マネーマネジメントは他のタイプにも切り替えることができます.最後に,エントリー,アドオン条件は,強いトレンドでピラミッド位置に強化できます.
RSIのトレンドフォローストラテジーは,トレンド指向のRSIと確認のMAを重量化したRSIを使用して,明確な論理を持っています.その強みはトレンドトレードであり,ストップ/マネーマネジメントで利益を最大化し,リスクを制御することです.しかし,RSIの信頼性とパラメータ最適化は改善が必要です.我々は,異なる製品で戦略をより堅牢にするために,シグナル指標,ストップ/トレーリングパラメーター,マネーマネジメント方法などを強化することができます.
[/トランス]
/*backtest start: 2023-01-01 00:00:00 end: 2023-06-24 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © gsanson66 //This code is based on RSI and a backed weighted MA //@version=5 strategy("RSI + MA BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18) //------------------------FUNCTIONS---------------------------// //@function which calculate a retro weighted moving average to minimize the impact of short term reversal rwma(source, length) => sum = 0.0 denominator = 0.0 weight = 0.0 weight_x = 100/(4+(length-4)*1.30) weight_y = 1.30*weight_x for i=0 to length - 1 if i <= 3 weight := weight_x else weight := weight_y sum := sum + source[i] * weight denominator := denominator + weight rwma = sum/denominator //@function which permits the user to choose a moving average type ma(source, length, type) => switch type "SMA" => ta.sma(source, length) "RWMA" => rwma(source, length) //@function Displays text passed to `txt` when called. debugLabel(txt, color) => label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small) //@function which looks if the close date of the current bar falls inside the date range inBacktestPeriod(start, end) => (time >= start) and (time <= end) //--------------------------------USER INPUTS-------------------------------// //Technical parameters rsiLengthInput = input.int(20, minval=1, title="RSI Length", group="RSI Settings") maTypeInput = input.string("RWMA", title="MA Type", options=["SMA", "RWMA"], group="MA Settings", inline="1") maLenghtInput = input.int(20, minval=1, title="MA Length", group="MA Settings", inline="1") rsiLongSignalValue = input.int(60, minval=1, maxval=99, title="RSI Long Signal", group="Strategy parameters", inline="3") rsiShortSignalValue = input.int(40, minval=1, maxval=99, title="RSI Short Signal", group="Strategy parameters", inline="3") rocMovAverLongSignalValue = input.float(-1, maxval=0, title="ROC MA Long Signal", group="Strategy parameters", inline="4") rocMovAverShortSignalValue = input.float(1, minval=0, title="ROC MA Short Signal", group="Strategy parameters", inline="4") //TP Activation and Trailing TP takeProfitActivationInput = input.float(4, minval=1.0, title="TP activation in multiple of ATR", group="Strategy parameters") trailingStopInput = input.float(3, minval=0, title="Trailing TP in percentage", group="Strategy parameters") //Money Management fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management") increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management") //Backtesting period startDate = input(title="Start Date", defval=timestamp("1 Jan 2018 00:00:00"), group="Backtesting Period") endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period") strategy.initial_capital = 50000 //------------------------------VARIABLES INITIALISATION-----------------------------// float rsi = ta.rsi(close, rsiLengthInput) float ma = ma(close, maLenghtInput, maTypeInput) float roc_ma = ((ma/ma[maLenghtInput]) - 1)*100 float atr = ta.atr(20) var float trailingStopOffset = na var float trailingStopActivation = na var float trailingStop = na var float stopLoss = na var bool long = na var bool short = na var bool bufferTrailingStopDrawing = na float theoreticalStopPrice = na bool inRange = na equity = strategy.equity - strategy.openprofit var float capital_ref = strategy.initial_capital var float cashOrder = strategy.initial_capital * 0.95 //------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------// //Checking if the date belong to the range inRange := true //Checking performances of the strategy if equity > capital_ref + fixedRatio spread = (equity - capital_ref)/fixedRatio nb_level = int(spread) increasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder + increasingOrder capital_ref := capital_ref + nb_level*fixedRatio if equity < capital_ref - fixedRatio spread = (capital_ref - equity)/fixedRatio nb_level = int(spread) decreasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder - decreasingOrder capital_ref := capital_ref - nb_level*fixedRatio //Checking if we close all trades in case where we exit the backtesting period if strategy.position_size!=0 and not inRange debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116)) strategy.close_all() bufferTrailingStopDrawing := false stopLoss := na trailingStopActivation := na trailingStop := na short := false long := false //------------------------------STOP LOSS AND TRAILING STOP ACTIVATION----------------------------// // We handle the stop loss and trailing stop activation if (low <= stopLoss or high >= trailingStopActivation) and long if high >= trailingStopActivation bufferTrailingStopDrawing := true else if low <= stopLoss long := false stopLoss := na trailingStopActivation := na if (low <= trailingStopActivation or high >= stopLoss) and short if low <= trailingStopActivation bufferTrailingStopDrawing := true else if high >= stopLoss short := false stopLoss := na trailingStopActivation := na //-------------------------------------TRAILING STOP--------------------------------------// // If the traling stop is activated, we manage its plotting with the bufferTrailingStopDrawing if bufferTrailingStopDrawing and long theoreticalStopPrice := high - trailingStopOffset * syminfo.mintick if na(trailingStop) trailingStop := theoreticalStopPrice else if theoreticalStopPrice > trailingStop trailingStop := theoreticalStopPrice else if low <= trailingStop trailingStop := na bufferTrailingStopDrawing := false long := false if bufferTrailingStopDrawing and short theoreticalStopPrice := low + trailingStopOffset * syminfo.mintick if na(trailingStop) trailingStop := theoreticalStopPrice else if theoreticalStopPrice < trailingStop trailingStop := theoreticalStopPrice else if high >= trailingStop trailingStop := na bufferTrailingStopDrawing := false short := false //---------------------------------LONG CONDITION--------------------------// if rsi >= 60 and roc_ma <= rocMovAverLongSignalValue and inRange and not long if short bufferTrailingStopDrawing := false stopLoss := na trailingStopActivation := na trailingStop := na short := false trailingStopActivation := close + takeProfitActivationInput*atr trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick stopLoss := close - 3*atr long := true qty = cashOrder/close strategy.entry("Long", strategy.long, qty) strategy.exit("Exit Long", "Long", stop = stopLoss, trail_price = trailingStopActivation, trail_offset = trailingStopOffset) //--------------------------------SHORT CONDITION-------------------------------// if rsi <= 40 and roc_ma >= rocMovAverShortSignalValue and inRange and not short if long bufferTrailingStopDrawing := false stopLoss := na trailingStopActivation := na trailingStop := na long := false trailingStopActivation := close - takeProfitActivationInput*atr trailingStopOffset := (trailingStopActivation * trailingStopInput/100) / syminfo.mintick stopLoss := close + 3*atr short := true qty = cashOrder/close strategy.entry("Short", strategy.short, qty) strategy.exit("Exit Short", "Short", stop = stopLoss, trail_price = trailingStopActivation, trail_offset = trailingStopOffset) //--------------------------------PLOTTING ELEMENT---------------------------------// // Plotting of element in the graph plotchar(rsi, "RSI", "", location.top, color.rgb(0, 214, 243)) plot(ma, "MA", color.rgb(219, 219, 18)) plotchar(roc_ma, "ROC MA", "", location.top, color=color.orange) // Visualizer trailing stop and stop loss movement plot(stopLoss, "SL", color.red, 3, plot.style_linebr) plot(trailingStopActivation, "Trigger Trail", color.green, 3, plot.style_linebr) plot(trailingStop, "Trailing Stop", color.blue, 3, plot.style_linebr)