超期価値領域のブレイク戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-12 10:58:22
タグ:

img

概要

この戦略の主なアイデアは,異なるサイクルのRSI指標を組み合わせて現在の価格範囲を決定し,より大きなサイクルのRSIに突破が発生した場合,より小さなサイクルの対応する購入または販売アクションをとることです.この戦略は,複数の時間次元から現在の価格の相対値を判断し,より良いエントリーポイントを特定するために,異なる期間の技術指標を利用します.

戦略の論理

価格帯を決定し,取引機会を見つけるためのこの戦略の主なステップは以下の通りです.

  1. RSIのSwing HighとSwing Lowは,より大きなサイクル (例えば毎日) を基に計算する.
  2. RSIの周期が長ければ,見直し期間中に新高値か新低値になったかどうかを判断する.
  3. 価格トレンド (上昇または下落) をより短いサイクル (例えば5分) で判断し,それに応じて購入または販売します.

例えば,日々のRSIが前回の高値から突破すると,当面は牛市場であると判断します.そして日々のRSIが前回の低値を下回ると,熊市場として判断します.両方の場合,5分チャートでそれぞれロングとショートアクションを行います.

利点分析

この戦略は,1つの期間だけに焦点を当てた従来の戦略と比較して,以下の利点があります.

  1. 現在の相対価格価値のより正確な評価.日々のようなより大きなサイクルは,短期間の市場騒音をフィルターし,全体的な傾向と値領域を決定することができます.

  2. 期間を重ねた指標を組み合わせることで,信号の信頼性が向上する.単一の期間指標のみを頼りにすると,偽信号がより容易に生成され,複数の期間からの同時信号はより信頼性がある.

  3. 短期的な機会をより効果的に利用する.大きなサイクルのブレイクが全体的な方向性を示している一方で,利益を得るためには,5分くらいの短いサイクルの機会を特定するだけです.

  4. 小規模な引き下げです. 交差期を組み合わせることで 罠にはまりないようにできます. 大規模なサイクル指標が逆転し始めたら,すぐに退場できます.

リスク分析

この戦略の主なリスクは

  1. 大型サイクルの指標における誤った判断. 日々のRSIなどにおける非効率的な値領域決定は,誤った信号を引き起こす可能性があります. RSIのパラメータチューニングは正確性を向上させる必要があります.

  2. 小サイクルの価格動きと大きなサイクルの決定の間の差異. 時々,短期的な動きは大きなイメージのトレンドに逆らいます. 損失を制御するために適切なストップロスを設定する必要があります.

  3. リスク管理の不適切. ポジションのサイズが不十分であるため,単一取引における過度の損失は,回収できない引き下げにつながる可能性があります. 合理的なサイズルールを実施する必要があります.

オプティマイゼーションの方向性

この戦略は,主に次の側面から改善できる余地があります.

  1. 周期パラメータ調整.最適なパラメータを見つけるためにより多くの周期組み合わせをテストします.

  2. RSIパラメータ調整.判断の精度を向上させるためにRSIlookback等パラメータを調整します.

  3. 傾向の方向性を判断するのに役立つように MAのようなより多くの指標を導入します.

  4. ストップ・ロスのメカニズムを改良し ストップ・ロスのポイントを 引き下げ条件に基づいて 動的に調整する

  5. ポジションサイズを最適化し,各取引の特定のポジションサイズをより科学的に管理する.

結論

この戦略は,クロス期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)

もっと