資源の読み込みに... 荷物...

MACD 閉じる ハイブリッド カメ戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月30日 12:16:20
タグ:

img

概要

この戦略は,MACD指標の黄金十字と死十字の信号,閉値と中間線との関係,および価格変動の特徴を組み合わせて,エントリーとアウトプット点を決定します.また,リスクを制御し,安定したリターンを実現しながら,より多くの取引機会を得るために再エントリーと訂正エントリーメカニズムを設定します.

戦略の原則

この戦略は主に以下の原則に基づいています.

  1. MACDの高速線,スローライン,ゴールデンクロス,デッドクロスを使って,牛と熊の市場と特定のエントリーポイントを決定します.

  2. 閉じる価格と中間線との関係を使用して,トレンドの終わりと出口点を決定します.

  3. 現行のMACDトレンドが終わったら 同じ方向で市場に戻るため 再参入メカニズムを設定し 利益を増やす.

  4. トレンド内の部分的な価格訂正中にポジションを追加するための訂正エントリーメカニズムを設定する.

  5. 上記に基づいてポジションを動的に調整し,トレンド終了時に迅速に退場しながらトレンド内で利益を最大化します.

具体的には,この戦略はまず,MACDの高速線と遅い線の間にゴールデンクロスまたはデッドクロスが発生し,ロングまたはショートになるかどうかをチェックします.その後,閉じる価格がトレンドの終わりと閉じるポジションを決定するために中間線に触れるかどうかをチェックします.

さらに,この戦略には,MACDが初期トレンドが終了した後も同じ方向のシグナルを示し続けると,元の方向のポジションを再開するための再入場メカニズムがあります.また,完全な逆転の前に,小さな引き下げ中にポジションを適度に追加するための訂正エントリーメカニズムもあります.

これらの設定を通じて,戦略は動的にポジションを調整し,エントリーと出口頻度を増加させ,トレンド内のリスクを制御しながらリターンを最大化することができます.

利点

この多指標戦略の主な利点は以下の通りである.

  1. MACDは,トレンドとエントリーの逆転点を特定します.

  2. 閉じる価格と中間線との関係は 傾向の終わりを正確に決定します

  3. 再入国は資本利用効率を高めます

  4. 修正エントリは,トレンドを把握するためのポジションをタイムリーに追加します.

  5. 制御可能なリスクの高い取引頻度は高い利益因子をもたらします

  6. 製品と市場を合わせた最適化のためのパーマータージ

  7. シンプルな生きた取引のための 明確な論理と簡潔なコードです

  8. 十分なバックテストデータが信頼性を保証します

リスク

主なリスクは以下のとおりです.

  1. 誤ったMACD信号の確率は他の指標で確認する必要があります.

  2. ストップが狭すぎると 不安定な動きによって ストップになる可能性があります

  3. 貿易の頻度が増えるため,資本の利用を制御する必要があります.

  4. 修正入力は引き下げ時に損失を引き起こす可能性があります.

  5. 異なる製品や市場に最適化が必要です

  6. 継続的なバックテストと最適化が必要です

  7. ライブ・トレーディングでは スリッパージコストを考慮する必要があります

リスク管理措置には,損失を制限するためにストップを使用し,資本利用を評価し,バックテストを通じて製品ごとにパラメータを最適化し,パラメータを精査するために市場動態を監視し,テストの滑り方について説明するなどが含まれます.

増進 の 機会

改善の機会:

  1. 信号の検証のために他の指標を追加します.例えば,KDJです.

  2. アダプティブ・ダイナミック・ストップを導入する

  3. 再入力と修正入力ロジックを最適化します

  4. パラメータ最適化

  5. 入力料の資本利用を最適化する

  6. 復元入金による損失を回避するために,量指標を組み込む.

  7. 移動停止のような出口メカニズムを追加します.

  8. 自動取引ボットを作ろう

  9. 滑り方などの現実的な要因を考慮します

安定性,適応性,自動化,ライブパフォーマンスをさらに向上させることができます

結論

この戦略は,MACD信号,閉値分析,および複数のエントリーメカニズムを統合し,リスクを制御しながらトレンドを最大化します.資本効率が高く,実装が簡単ですが,リスク制御と最適化が必要です.自動化はそれを堅牢な定量的な取引システムにすることができます.


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
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/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")

もっと