ダイナミック・モメント・オシレーター (DMO) 取引戦略は,モメント・オシレーター指標に基づいた15分間の短期取引戦略である.この戦略は,複数の技術指標を組み合わせて,非常に正確な取引信号を生成し,素早いトレーダーが短時間で購入・売却の決定を下し,リスクを制御し,収益性を高めるのに効果的に役立つ.
この戦略は,まず,市場の主なトレンド方向を決定するために,ドインチアンチャネルを使用する.チャネルの上部帯の上のブレイクアウトは上昇シグナルであり,下部帯の下部帯のブレイクアウトは下降シグナルである.次に,戦略は,より正確なトレンド判断のために,適応性ATRチャネルと組み合わせて3つのハル移動平均変数のうち1つを採用する.高速線が中間線を超えると,それは購入信号であり,下部を越えると,それは販売信号である.最後に,偽信号の追加のフィルタリングのためのハフトレンド指標の助けにより,取引信号の信頼性がさらに向上することができる.比較的信頼できる取引信号を受け取ると,戦略は対応するロングまたはショートポジションに入る.
DMO戦略の最大の利点は,複数の指標の有機的な組み合わせにある.異なる指標は,偽の信号をフィルタリングするために互いに検証することができ,各取引信号をより正確かつ信頼性のあるものにする.さらに,Doinchianチャネルが主要なトレンドを判断する方法は単純で直接的で,ハーフトレンドラインでシグナルをフィルタリングする手段も比較的従来のものである.全体として,初心者にとって学習曲線が低いので理解が容易である.単一の指標と比較して,DMOは,同じ数の取引を考慮してより高い勝利率と収益性を達成することができる.
DMO戦略は比較的安定し信頼性があるが,いかなる定量的な取引戦略も一定のリスクをもたらすことは必然である.特に,高速線が中間線を下に横切ると,他の指標からの検証なしに誤った信号である可能性がある.また,すべての短期戦略と同様に,DMOもオーバートレードに関連したリスクに直面する.指標が非効果的になる突然の市場イベントが発生した場合,不適切なストップ損失設定もより大きな損失を引き起こす可能性がある.リスクを軽減するために,中長期指標のパラメータを適切に調整し,検証のためのより高いタイムフレーム指標と組み合わせ,単一の取引損失を厳格に制御するためにストップ損失距離を増やすことが推奨される.
DMO戦略は,次のような側面で最適化することができる:第一に,ハルMAのパラメータを調整し,移動平均値のスムージング効果と感度を均衡させる.第二に,チャネルパラメータを調整したり,追加の制限を追加したりなど,Doinchianチャネルロジックを改善する.第三に,ボリンガーバンド,KDJなどのより良いフィルタリングのためにハーフトレンドを代替する他の指標を試してみる.第四に,異なる取引ツールの特徴に基づいて適切な取引間隔を指定し,例えば5分または30分戦略に変更する.これらの最適化措置は,安定性を高めるために市場条件と楽器特性に応じてDMO戦略をカスタマイズするのに役立ちます.
DMOは,複数の指標の組み合わせを最適化する短期戦略である.Doinchian Channel,Hull MA,Halftrendを統合して,市場のトレンドを効果的に決定し,正確な取引信号を生成する.比較的シンプルで直感的な技術と操作が容易であるため,初心者のための導入戦略として機能することができる.単一指標と比較して,DMOはより高い勝利率と収益性を達成することができる.パラメータチューニング,組み合わせの改善,間隔仕様などの措置を通じて,DMO戦略は,より高い安定性を持つ長期間の優れたパフォーマンスを達成する可能性がある.
/*backtest start: 2022-12-08 00:00:00 end: 2023-12-14 00:00:00 period: 1d basePeriod: 1h 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/ // © kgynofomo //@version=5 strategy(title="[Salavi] | Andy Super Pro Strategy [BTC|M15]",overlay = true, pyramiding = 1,initial_capital = 10000, default_qty_type = strategy.cash,default_qty_value = 10000) //Doinchian Trend Ribbon dlen = input.int(defval=30, minval=10) dchannel(len) => float hh = ta.highest(len) float ll = ta.lowest(len) int trend = 0 trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1]) trend dchannelalt(len, maintrend) => float hh = ta.highest(len) float ll = ta.lowest(len) int trend = 0 trend := close > hh[1] ? 1 : close < ll[1] ? -1 : nz(trend[1]) maintrend == 1 ? trend == 1 ? #00FF00ff : #00FF009f : maintrend == -1 ? trend == -1 ? #FF0000ff : #FF00009f : na maintrend = dchannel(dlen) donchian_bull = maintrend==1 donchian_bear = maintrend==-1 //Hulls src = input(hlc3, title='Source') modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma']) length = input(55, title='Length') lengthMult = input(1.0, title='Length multiplier ') useHtf = false htf = '240' switchColor = true candleCol = false visualSwitch = true thicknesSwitch = 1 transpSwitch = 40 //FUNCTIONS //HMA HMA(_src, _length) => ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length))) //EHMA EHMA(_src, _length) => ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length))) //THMA THMA(_src, _length) => ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.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, int(length * lengthMult)) HULL = useHtf ? request.security(syminfo.ticker, htf, _hull) : _hull MHULL = HULL[0] SHULL = HULL[2] //COLOR hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800 hull_bull = HULL > HULL[2] bull_start = hull_bull and hull_bull[1]==false hull_bear = HULL < HULL[2] bear_start = hull_bear and hull_bear[1]==false barcolor(color=candleCol ? switchColor ? hullColor : na : na) //halftrend amplitude = input(title='Amplitude', defval=2) channelDeviation = input(title='Channel Deviation', defval=2) // showArrows = input(title='Show Arrows', defval=true) // showChannels = input(title='Show Channels', defval=true) var int trend = 0 var int nextTrend = 0 var float maxLowPrice = nz(low[1], low) var float minHighPrice = nz(high[1], high) var float up = 0.0 var float down = 0.0 float atrHigh = 0.0 float atrLow = 0.0 float arrowUp = na float arrowDown = na atr2 = ta.atr(100) / 2 dev = channelDeviation * atr2 highPrice = high[math.abs(ta.highestbars(amplitude))] lowPrice = low[math.abs(ta.lowestbars(amplitude))] highma = ta.sma(high, amplitude) lowma = ta.sma(low, amplitude) if nextTrend == 1 maxLowPrice := math.max(lowPrice, maxLowPrice) if highma < maxLowPrice and close < nz(low[1], low) trend := 1 nextTrend := 0 minHighPrice := highPrice minHighPrice else minHighPrice := math.min(highPrice, minHighPrice) if lowma > minHighPrice and close > nz(high[1], high) trend := 0 nextTrend := 1 maxLowPrice := lowPrice maxLowPrice if trend == 0 if not na(trend[1]) and trend[1] != 0 up := na(down[1]) ? down : down[1] arrowUp := up - atr2 arrowUp else up := na(up[1]) ? maxLowPrice : math.max(maxLowPrice, up[1]) up atrHigh := up + dev atrLow := up - dev atrLow else if not na(trend[1]) and trend[1] != 1 down := na(up[1]) ? up : up[1] arrowDown := down + atr2 arrowDown else down := na(down[1]) ? minHighPrice : math.min(minHighPrice, down[1]) down atrHigh := down + dev atrLow := down - dev atrLow ht = trend == 0 ? up : down var color buyColor = color.blue var color sellColor = color.red htColor = trend == 0 ? buyColor : sellColor // htPlot = plot(ht, title='HalfTrend', linewidth=2, color=htColor) // atrHighPlot = plot(showChannels ? atrHigh : na, title='ATR High', style=plot.style_circles, color=color.new(sellColor, 0)) // atrLowPlot = plot(showChannels ? atrLow : na, title='ATR Low', style=plot.style_circles, color=color.new(buyColor, 0)) // fill(htPlot, atrHighPlot, title='ATR High Ribbon', color=color.new(sellColor, 90)) // fill(htPlot, atrLowPlot, title='ATR Low Ribbon', color=color.new(buyColor, 90)) HalfTrend_buySignal = not na(arrowUp) and trend == 0 and trend[1] == 1 HalfTrend_sellSignal = not na(arrowDown) and trend == 1 and trend[1] == 0 // plotshape(showArrows and buySignal ? atrLow : na, title='Arrow Up', style=shape.triangleup, location=location.absolute, size=size.tiny, color=color.new(buyColor, 0)) // plotshape(showArrows and sellSignal ? atrHigh : na, title='Arrow Down', style=shape.triangledown, location=location.absolute, size=size.tiny, color=color.new(sellColor, 0)) //ema filter_ema = ta.ema(close,200) ema_bull = close>filter_ema ema_bear = close<filter_ema atr_length = input.int(7) atr = ta.atr(atr_length) atr_rsi_length = input.int(50) atr_rsi = ta.rsi(atr,atr_rsi_length) atr_valid = atr_rsi>50 longCondition = bull_start and atr_valid shortCondition = bear_start and atr_valid Exit_long_condition = shortCondition Exit_short_condition = longCondition if longCondition strategy.entry("Andy Buy",strategy.long, limit=close,comment="Andy Buy Here") if Exit_long_condition strategy.close("Andy Buy",comment="Andy Buy Out") // strategy.entry("Andy fandan Short",strategy.short, limit=close,comment="Andy 翻單 short Here") // strategy.close("Andy fandan Buy",comment="Andy short Out") if shortCondition strategy.entry("Andy Short",strategy.short, limit=close,comment="Andy short Here") // strategy.exit("STR","Long",stop=longstoploss) if Exit_short_condition strategy.close("Andy Short",comment="Andy short Out") // strategy.entry("Andy fandan Buy",strategy.long, limit=close,comment="Andy 翻單 Buy Here") // strategy.close("Andy fandan Short",comment="Andy Buy Out") inLongTrade = strategy.position_size > 0 inLongTradecolor = #58D68D notInTrade = strategy.position_size == 0 inShortTrade = strategy.position_size < 0 // bgcolor(color = inLongTrade?color.rgb(76, 175, 79, 70):inShortTrade?color.rgb(255, 82, 82, 70):na) plotshape(close!=0,location = location.bottom,color = inLongTrade?color.green:inShortTrade?color.red:na) plotshape(longCondition, title='Buy', text='Andy Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny) plotshape(shortCondition, title='Sell', text='Andy Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny) Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50) Fi2 = plot(SHULL, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50) fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)