ホール指標とストキャスティクス指標の組み合わせ取引戦略


作成日: 2023-10-18 12:40:23 最終変更日: 2023-10-18 12:40:23
コピー: 1 クリック数: 1028
1
フォロー
1617
フォロワー

ホール指標とストキャスティクス指標の組み合わせ取引戦略

概要

この戦略は,ホールの指数を使用してトレンドの方向を判断し,ランダムな指数と組み合わせて入場を行う.ホールの中線で下線を突破するときに看板入場,下線を突破するときに空き入場する.また,ランダムな指数K線が超買区の下からD線を突破するときに多し,超売区から空きを突破するときに空きする.

戦略原則

この取引戦略は,主に市場トレンドの方向性を判断するためにホール指数を使用し,ランダムな指数を使用して具体的な入場を行います.

まず,戦略では,ホールの指標の計算方法が定義され,中軌道,上軌道,下軌道の計算式が含まれている.中軌道は,上軌道と下軌道が,それぞれ中軌の偏移である加重移動平均WMAの計算を採用している.

次に,中軌と上下軌の関係によってトレンドの方向を判断する.中軌上下軌を突破する時は,強引な買取を代表し,看板のトレンドである.中軌下軌を突破する時は,強引な売りを代表し,看板のトレンドである.

さらに,策略では,K値とD値の計算公式を含むランダム指標の計算方法も定義されている. K値はRSIのSMA平滑を採用し,D値はK値の再びSMA平滑である.

トレンドの方向を判断した後に,看板であれば,ランダムな指標のK線が超売り区域の下からD線を横切るときに多めに;看板であれば,K線が超買い区域上からD線を横切るときに空にする.

このように,ホール指数のトレンド判断とランダム指数の超買超売判断を組み合わせて,比較的に安定で正確な入場を行うことができる.

優位分析

この戦略の最大の利点は,トレンド判断と超買い超売り判断を組み合わせることで,市場を多次元的に分析でき,入場精度が高いことです.

具体的には,以下のような利点があります.

  1. ホール指数は,市場トレンドの方向を判断し,大レベルの定位を行うのに有効である.

  2. ランダムな指標で超買いと超売りを判断し,買い手力の変化を把握し,入場のタイミングを把握する.

  3. この2つの組み合わせは,それぞれの優位性を発揮し,相互の信号を検証し,偽信号を減らすことができます.

  4. パラメータの調整により,異なる品種と時間周期に柔軟に適応し,適用性が高い.

  5. 中軌道偏移を用いて上下軌道を形成し,潜在的サポートとレジスタンスを見つけることができる.

  6. STOP LOSS,EXIT ON TARGETS ポジションをスケールするために使用されるパーセント

  7. Use of hull data Dictionary gives multiple asset class flexibility

  8. 選択された最適化方向は,戦略の安定性と収益性を向上させる

リスク分析

この戦略にはいくつかのリスクがあります.

  1. ホール指数は後退しており,トレンドの転換点を逃し,不必要な損失を招く可能性があります.

  2. ランダムな指標パラメータの設定が不適切である場合,余分な信号が生成され,K線とD線の交差信号を適切にフィルターする必要があります.

  3. ホール指標はランダム指標と組み合わせて使用され,パラメータが正しくマッチングされていない場合,誤信号が発生する可能性があります.

  4. 上下軌道の幅が大きすぎても小さすぎても取引信号の質に影響し,最適なパラメータを見つけるために注意深くテストする必要があります.

  5. 最近の状況は不安定で,中長線指標の効果は不良かもしれない.

  6. Data mismatches between hull and stoch causing false signals

  7. Sharp trend changes not caught by hull can cause losses

  8. Testing on more timeframes/symbols needed to verify robustness

これらのリスクに対して,以下のポイントから最適化できます.

  1. ホール指標の長さを適切に短縮し,トレンドの変化に対する感受性を高めます.

  2. ランダムな指標のパラメータを最適化し,偽信号を減らす.

  3. 上下軌道のパラメータを調整し,最適な通路幅を探します.

  4. MACDなどの他の指標認証信号を追加します.

  5. リスク管理のための止損策を追加する.

最適化の方向

この戦略は,以下の点で最適化できます.

  1. より多くの品種と時間周期のパラメータをテストし,戦略の安定性を検証する.

  2. 付加された止損機構. 尾行止損,移動止損など,リスクをより良く制御することができる.

  3. 入場条件の論理を最適化し,より厳格なフィルタリング条件を設定し,偽信号を減らす.

  4. ホール指数チャネルを活用してサポートとレジスタンス点をよりよく決定する方法の研究.

  5. 他の指標の検証信号を追加するかどうかを調べる.

  6. パラメータ最適化.例えば,ホール指数長,ランダム指数K,Dの平滑パラメータ等の最適化.

  7. ポジション管理機能を追加. ポジションのサイズを撤回数,連勝数などに合わせて調整する.

  8. ストップダストとストップストップのルールが追加されました.

  9. Optimize hull length parameter for better trend sensitivity

  10. Add additional filters or confirming indicators to improve signal quality

  11. Explore using hull bands to identify dynamic support/resistance levels

  12. Parameter optimization for stoch RSI lengths, overbought/oversold levels

  13. Introduce better position sizing and risk management rules

要約する

全体的に見ると,この戦略はトレンド判断と超買い超売り判断を統合して入場を行うのが有効な考えである.しかし,指標自体が問題があるため,取引シグナルも完全には信頼できないため,さらなる最適化が必要である.最適なパラメータの組み合わせを見つけることができれば,他の検証指標とリスク管理手段で補完されれば,この戦略の効果は期待できる.総じて,パラメータ調整,止損機構,ポジション管理などの面でより多くのテストと最適化が必要になるため,この戦略は安定して信頼でき,現場で利益を得ることができる.

ストラテジーソースコード
/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)