この戦略の主なアイデアは,異なるサイクルのRSI指標を組み合わせて現在の価格範囲を決定し,より大きなサイクルのRSIに突破が発生した場合,より小さなサイクルの対応する購入または販売アクションをとることです.この戦略は,複数の時間次元から現在の価格の相対値を判断し,より良いエントリーポイントを特定するために,異なる期間の技術指標を利用します.
価格帯を決定し,取引機会を見つけるためのこの戦略の主なステップは以下の通りです.
例えば,日々のRSIが前回の高値から突破すると,当面は牛市場であると判断します.そして日々のRSIが前回の低値を下回ると,熊市場として判断します.両方の場合,5分チャートでそれぞれロングとショートアクションを行います.
この戦略は,1つの期間だけに焦点を当てた従来の戦略と比較して,以下の利点があります.
現在の相対価格価値のより正確な評価.日々のようなより大きなサイクルは,短期間の市場騒音をフィルターし,全体的な傾向と値領域を決定することができます.
期間を重ねた指標を組み合わせることで,信号の信頼性が向上する.単一の期間指標のみを頼りにすると,偽信号がより容易に生成され,複数の期間からの同時信号はより信頼性がある.
短期的な機会をより効果的に利用する.大きなサイクルのブレイクが全体的な方向性を示している一方で,利益を得るためには,5分くらいの短いサイクルの機会を特定するだけです.
小規模な引き下げです. 交差期を組み合わせることで 罠にはまりないようにできます. 大規模なサイクル指標が逆転し始めたら,すぐに退場できます.
この戦略の主なリスクは
大型サイクルの指標における誤った判断. 日々のRSIなどにおける非効率的な値領域決定は,誤った信号を引き起こす可能性があります. RSIのパラメータチューニングは正確性を向上させる必要があります.
小サイクルの価格動きと大きなサイクルの決定の間の差異. 時々,短期的な動きは大きなイメージのトレンドに逆らいます. 損失を制御するために適切なストップロスを設定する必要があります.
リスク管理の不適切. ポジションのサイズが不十分であるため,単一取引における過度の損失は,回収できない引き下げにつながる可能性があります. 合理的なサイズルールを実施する必要があります.
この戦略は,主に次の側面から改善できる余地があります.
周期パラメータ調整.最適なパラメータを見つけるためにより多くの周期組み合わせをテストします.
RSIパラメータ調整.判断の精度を向上させるためにRSIlookback等パラメータを調整します.
傾向の方向性を判断するのに役立つように MAのようなより多くの指標を導入します.
ストップ・ロスのメカニズムを改良し ストップ・ロスのポイントを 引き下げ条件に基づいて 動的に調整する
ポジションサイズを最適化し,各取引の特定のポジションサイズをより科学的に管理する.
この戦略は,クロス期RSIの上昇状態を評価することによって,異なる時間次元間のクロス期アービタージを実現します.クロス期判断のこのような考えは,さらなる搾取に値します.私たちはパラメータチューニング,ストップロスの最適化,インジケーターの組み合わせを通じて,それをより有利にするために改善し続けることができます. 全体的に言えば,この戦略はユニークなアイデアと,強化される大きな可能性を持っています.
/*backtest start: 2022-12-05 00:00:00 end: 2023-12-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Swing MTF", shorttitle="Swing MTF", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5) // otf_period = input(defval=2, title="Look Back Period (2nd Timeframe)") otf = input(defval="180", title="Second Momentum Timeframe") // Function to dectect a new bar is_newbar(res) => t = time(res) change(t) != 0 ? true : false // Check how many bars are in our upper timeframe since_new_bar = barssince(is_newbar(otf)) otf_total_bars = na otf_total_bars := since_new_bar == 0 ? since_new_bar[1] : otf_total_bars[1] //Calculate RSI Values ctf_rsi = rsi(open, otf_period) breakline=input(title="Breaks in lines", defval = true, type=bool) so = request.security(syminfo.tickerid, otf, rsi(open, otf_period)) sc = request.security(syminfo.tickerid, otf, rsi(close, otf_period)) final_otf_so = na final_otf_so := barstate.isrealtime ? since_new_bar == otf_total_bars ? so : final_otf_so[1] : so final_otf_sc = na final_otf_sc := barstate.isrealtime ? since_new_bar == otf_total_bars ? sc : final_otf_sc[1] : sc barsback = input(11, title='Bars back to check for a swing') // showsig = input(false, title='Show Signal Markers') swing_detection(index)=> swing_high = false swing_low = false start = (index*2) - 1 // -1 so we have an even number of swing_point_high = final_otf_so[index] swing_point_low = final_otf_sc[index] //Swing Highs for i = 0 to start swing_high := true if i < index if final_otf_so[i] > swing_point_high swing_high := false break // Have to do checks before pivot and after seperately because we can get // two highs of the same value in a row. Notice the > and >= difference if i > index if final_otf_so[i] >= swing_point_high swing_high := false break //Swing lows for i = 0 to start swing_low := true if i < index if final_otf_sc[i] < swing_point_low swing_low := false break // Have to do checks before pivot and after seperately because we can get // two lows of the same value in a row. Notice the > and >= difference if i > index if final_otf_sc[i] <= swing_point_low swing_low := false break [swing_high, swing_low] // Check for a swing [swing_high, swing_low] = swing_detection(barsback) long = final_otf_so > final_otf_sc short = final_otf_so < final_otf_sc if swing_low and long strategy.entry("My Long Entry Id", strategy.long) if swing_high and short strategy.entry("My Short Entry Id", strategy.short)