この戦略は,MACD指標とそのMACD柱間線を計算して,MACD柱間線と価格動向の間の逸脱信号を検知し,取引信号を生成する.価格が新高値が検知されてもMACD柱間線が新高値を生成していない場合,見下回転信号を生成する.価格が新低値が検知されてもMACD柱間線が新低値を生成していない場合,見下回転信号を生成する.ATR指標と組み合わせて,ストップ損失値とストップ
この戦略の核心原理は,MACD指標とそのMACD柱状線が価格傾向の変化を反映する特性を利用し,MACD柱状線と価格との間の逸脱信号を検出し,取引信号の誘発条件として使用することです.
具体的には,戦略はまずMACD線,シグナル線,MACD柱線を計算する.その後,フラクタル関数を定義し,MACD柱線のピークとバレーを検知し,局所的な極小値を抽出する.そして,価格の最高値と最低値を組み合わせ,MACD柱線と価格の間の偏差があるかどうかを判断する.
価格が新高を創ったとき,しかしMACD柱線が新高を創らなかったとき,regulark_bearish_div看跌背離信号を生成する.価格が新低を創ったとき,しかしMACD柱線が新低を創らなかったとき,regulark_bullish_div看跌背離信号を生成する.
最後に,戦略は,看跌逆転と看
この戦略には以下のような利点があります.
MACDの柱状線と価格の間の偏差特性を利用して,価格傾向の転換を事前に把握することができる.
ATRの停止損益は合理的に設定され,単一の取引の最大損失を効果的に制御できます.
傾向を追跡することで,利益を最大限に抑えることができます.
パラメータ設定は合理的で,部分的なノイズ取引信号をフィルタリングします.
戦略的論理は明確で,実態検証が容易である.
この戦略にはいくつかのリスクもあります:
MACD偏差は必ずしも価格の逆転をもたらさないが,一定の偽信号リスクがある.
停止損益の抑制設定が合理的でない場合,損失が大きすぎたり利益が小さすぎたりする.
信号周期が短すぎると,騒音による可能性があるため,適切にフィルタリングする必要があります.
取引品種とパラメータ設定が一致しないことも戦略効果に影響します.
解決法について
適正に背離長さと背離幅の要求を拡大し,偽信号をフィルタリングする.
ATRを止損停止指標として使用し,ATR倍数を調整し,単一の取引リスクを制御する.
異なる取引種に対して異なるパラメータを選択する.パラメータ最適化を行い,最適なパラメータ組み合わせを見つける.
この戦略は,以下の方向から最適化されることもあります:
音量離散確認などより複雑な離散確認も行われます.
MACDのパラメータを最適化し,最適なパラメータ組み合わせを探します.
ATRの停止損耗抑制の倍数を最適化する.
機械学習アルゴリズムが追加され,信号の偏差判断の信頼性を助けた.
モデル予測を増やし,価格逆転の確率を判断する.
市場環境の変化に応じて動的に戦略パラメータを調整する.
全体として,このピタゴグラフMACD指標は,トレンド追跡戦略から逸脱し,MACD柱状線と価格の間の逸脱特性を利用し,トレンドを捕捉することを実現する.ATRのストップ損失ストップ
/*backtest start: 2024-01-04 00:00:00 end: 2024-02-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © bigwin_sun // copyright: Tradingvue Limited //@version = 5 strategy(title = "Demigod : CDMA histogram Divergence strategy", shorttitle = "Demigod strategy", overlay = false, pyramiding = 100) //macd input fastMA = input.int(13, title = "fast Length", minval = 1, group = "CDMA") slowMA = input.int(34, title = "slow Length", minval = 1, group = "CDMA") src = input.source(title = "source", defval = close, group = "CDMA") signalSmooth = input.int(9, title="ma Length", minval = 1, group = "CDMA") //Divergenc divLength = input.int(title = "Divergenc Length", defval = 5, minval = 1, maxval = 50, inline = "ATRLength", group = "Divergence") divStren = input.float(title="Divergenc Strength", defval = 2, minval = 1.0, maxval = 5.0, inline = "ATRLength", group = "Divergence") //atr input atrLength = input.int(13, title = "ATR Length", minval = 1, inline = "ATRLength", group = "ATR") m = input.float(1.0, "ATR multyple", minval = 0.5, inline = "ATRLength", group = "ATR", step = 0.5) collong = input.color(color.teal, title = "upper color", inline = "ATR显示", group = "ATR") colshort = input.color(color.red, title = "under color", inline = "ATR显示", group = "ATR") // MACD--------------------------------------------------------------------------------------------------------------------------------- DivOffset = -2 macdLine = ta.ema(src, fastMA) - ta.ema(src, slowMA) signalLine = ta.ema(macdLine, signalSmooth) histogram = macdLine - signalLine histogramColor = if histogram > 0 histogram > histogram[1] ? color.lime : color.green else histogram < histogram[1] ? color.maroon : color.red // cdma histogram plot(histogram, title = "MACD histogram", linewidth = 2, style = plot.style_histogram, color = histogramColor) plot(0, title = "zero line", linewidth = 1, color = color.gray) // Divergenc calculation------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //peak / valley fundation f_top_fractal(_src)=>_src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0] and _src > 0 f_bot_fractal(_src)=>_src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0] and _src < 0 f_fractalize(_src)=>f_top_fractal(_src) ? 1 : f_bot_fractal(_src) ? -1 : 0 //peak / valley value fractal_top1 = f_fractalize(histogram) > 0 ? true : false //histogram[2] : na fractal_bot1 = f_fractalize(histogram) < 0 ? true : false //histogram[2] : na //previouse peak or valley high_prev1 = ta.valuewhen(fractal_top1, histogram[2], 0)[2] high_price1 = ta.valuewhen(fractal_top1, high[2], 0)[2] low_prev1 = ta.valuewhen(fractal_bot1, histogram[2], 0)[2] low_price1 = ta.valuewhen(fractal_bot1, low[2], 0)[2] //Divergenc : cdma histogram against candle value regular_bearish_div1 = high[2] > high_price1 + divStren and histogram[2] < high_prev1 / divStren and ta.barssince(fractal_top1[1]) > divLength regular_bullish_div1 = low[2] < low_price1 - divStren and histogram[2] > low_prev1 / divStren and ta.barssince(fractal_bot1[1]) > divLength //-------------------------cdma Divergenc range------------------------------------------------ //histogramColor col1 = regular_bearish_div1 ? color.red : na col2 = regular_bullish_div1 ? #00FF00EB : na //plot plot(title='看跌背离', series= fractal_top1 ? histogram[2] : na, color=col1, linewidth=3, offset=DivOffset) plot(title='看涨背离', series= fractal_bot1 ? histogram[2] : na, color=col2, linewidth=3, offset=DivOffset) // calculate ATR -------------------------------------------------------------------------------------------------------------------------------------------------- atr = ta.ema(ta.tr(true), atrLength) * m up = atr + high dw = low - atr //stratety : enrty and exit--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- if regular_bearish_div1 and fractal_top1 //if regular_bullish_div1 and fractal_bot1 //label.new(bar_index, histogram[2], text = "Short", textcolor = color.white, color = color.gray, style = label.style_label_lower_left) strategy.entry("Short", strategy.short, qty = 1) strategy.exit("exitShort", "Short", stop = up, limit = dw - atr) if regular_bullish_div1 and fractal_bot1 //if regular_bearish_div1 and fractal_top1 //label.new(bar_index, histogram[2], text = "Long", textcolor = color.white, color = color.fuchsia, style = label.style_label_upper_left) strategy.entry("Long", strategy.long, qty = 1) strategy.exit("exitLong", "Long", stop = dw, limit = up + atr)