この戦略は,MACD指標の黄金十字と死十字の信号,閉値と中間線との関係,および価格変動の特徴を組み合わせて,エントリーとアウトプット点を決定します.また,リスクを制御し,安定したリターンを実現しながら,より多くの取引機会を得るために再エントリーと訂正エントリーメカニズムを設定します.
この戦略は主に以下の原則に基づいています.
MACDの高速線,スローライン,ゴールデンクロス,デッドクロスを使って,牛と熊の市場と特定のエントリーポイントを決定します.
閉じる価格と中間線との関係を使用して,トレンドの終わりと出口点を決定します.
現行のMACDトレンドが終わったら 同じ方向で市場に戻るため 再参入メカニズムを設定し 利益を増やす.
トレンド内の部分的な価格訂正中にポジションを追加するための訂正エントリーメカニズムを設定する.
上記に基づいてポジションを動的に調整し,トレンド終了時に迅速に退場しながらトレンド内で利益を最大化します.
具体的には,この戦略はまず,MACDの高速線と遅い線の間にゴールデンクロスまたはデッドクロスが発生し,ロングまたはショートになるかどうかをチェックします.その後,閉じる価格がトレンドの終わりと閉じるポジションを決定するために中間線に触れるかどうかをチェックします.
さらに,この戦略には,MACDが初期トレンドが終了した後も同じ方向のシグナルを示し続けると,元の方向のポジションを再開するための再入場メカニズムがあります.また,完全な逆転の前に,小さな引き下げ中にポジションを適度に追加するための訂正エントリーメカニズムもあります.
これらの設定を通じて,戦略は動的にポジションを調整し,エントリーと出口頻度を増加させ,トレンド内のリスクを制御しながらリターンを最大化することができます.
この多指標戦略の主な利点は以下の通りである.
MACDは,トレンドとエントリーの逆転点を特定します.
閉じる価格と中間線との関係は 傾向の終わりを正確に決定します
再入国は資本利用効率を高めます
修正エントリは,トレンドを把握するためのポジションをタイムリーに追加します.
制御可能なリスクの高い取引頻度は高い利益因子をもたらします
製品と市場を合わせた最適化のためのパーマータージ
シンプルな生きた取引のための 明確な論理と簡潔なコードです
十分なバックテストデータが信頼性を保証します
主なリスクは以下のとおりです.
誤ったMACD信号の確率は他の指標で確認する必要があります.
ストップが狭すぎると 不安定な動きによって ストップになる可能性があります
貿易の頻度が増えるため,資本の利用を制御する必要があります.
修正入力は引き下げ時に損失を引き起こす可能性があります.
異なる製品や市場に最適化が必要です
継続的なバックテストと最適化が必要です
ライブ・トレーディングでは スリッパージコストを考慮する必要があります
リスク管理措置には,損失を制限するためにストップを使用し,資本利用を評価し,バックテストを通じて製品ごとにパラメータを最適化し,パラメータを精査するために市場動態を監視し,テストの滑り方について説明するなどが含まれます.
改善の機会:
信号の検証のために他の指標を追加します.例えば,KDJです.
アダプティブ・ダイナミック・ストップを導入する
再入力と修正入力ロジックを最適化します
パラメータ最適化
入力料の資本利用を最適化する
復元入金による損失を回避するために,量指標を組み込む.
移動停止のような出口メカニズムを追加します.
自動取引ボットを作ろう
滑り方などの現実的な要因を考慮します
安定性,適応性,自動化,ライブパフォーマンスをさらに向上させることができます
この戦略は,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", "")