
この戦略は,MACD指数とそのMACD柱状線を計算し,MACD柱状線と価格の動きの間の偏差信号を検出し,取引信号を生成する.価格が高くなっているがMACD柱状線が新しい高を創造していないことを検出すると,下落の反転信号を生成する.価格が低くなっているがMACD柱状線が新しい低さを創造していないとき,看板の反転信号を生成する.ATR指数と組み合わせて,ストップとストップの位置を設定し,トレンドを追跡する取引を行う.
この戦略の核心原則は,MACD指数とそのMACD柱状線が価格傾向の変化を反映する特性を利用し,MACD柱状線と価格の間の偏差信号を,取引信号のトリガー条件として検出することである.
具体的には,戦略はまずMACD線,シグナル線,MACD柱状線を計算する.それから,フラクタル関数を定義し,MACD柱状線のピークとバレーを検出して,局所的な極大値と極小値のポイントを抽出する.そして,価格の最高値と最低値を組み合わせて,MACD柱状線と価格の間に背離があるかどうかを判断する.
価格が新高を打つが,MACD柱状線が新高を打つことがなかったとき,regulark_bearish_divの下落反転信号が生じる.価格が新低を打つが,MACD柱状線が新低を打つことがなかったとき,regulark_bullish_divの下落反転信号が生じる.
最後に,戦略は,下落の背離と看板の背離のシグナルが生じるとき,それぞれ空きと多額の指示を発行し,ATRのストップ・ロスト,ストップ・ロストでポジションを退出する.
この戦略には以下の利点があります.
MACD柱状線と価格の間の離散特性を利用して,価格の傾向の転換を早期に捉えることができる.
ATRのストップ・ストップは,単一取引の最大損失を合理的かつ効果的に制御する設定である.
トレンドフォロー法により,利益の最大限を確保できます.
パラメータ設定は合理的で,部分的なノイズ取引信号をフィルタリングできます.
戦略の論理は明確で分かりやすく,実用的に検証が容易です.
この戦略にはいくつかのリスクがあります.
MACDの偏差は必ずしも価格の逆転を招くわけではないので,偽信号の危険性がある.
ストップ・ストップの設定が不合理である場合,損失が過大または利益が過小になる可能性があります.
信号周期が短く,騒音による可能性があり,適切なフィルタリングを行う.
交易品種とパラメータの設定が一致しないことも,戦略の効果に影響を与える.
対応方法:
誤差の長さと幅の要求を適切に拡大して,偽信号をフィルターします.
ATRをストップ・ストップ・インジケータとして使用し,ATRの倍数を調整し,単一取引のリスクを制御する.
異なる取引品種に対して異なるパラメータを選択する.パラメータを最適化し,最適なパラメータの組み合わせを見つける.
この戦略は,以下の方向で最適化できます.
Volume のように,より複雑な背離確認.
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)