双動平均 三倍指数指数 取引戦略

作者: リン・ハーンチャオチャン開催日:2023年12月15日15時39分45秒
タグ:

img

概要

この戦略は,相対的に安定し信頼性の高いトレンド追跡取引戦略を形成するために,二重移動平均指標と三重指数移動平均指標を組み合わせて使用する.その主なアイデアは,移動平均指標が黄金十字または死亡十字を検知したときの取引信号を発行することです.一方,ストカストティック指標は急激な市場変動中に間違った信号を生成しないために,過剰購入および過剰販売状況を判断するのに役立ちます.

原則

この戦略は主に4つの部分で構成されています.

  1. デュアル・ムービング・平均指数:それぞれ50期と100期指数的な移動平均 (EMA) を計算する.短期EMAが長期EMAを超えると購入信号,下回ると売却信号を生成する.

  2. トリプル指数指標: 50期,100期,200期指数移動平均値を計算し,市場のトレンド方向を決定する. 50EMA>100EMA>200EMAの場合,上昇市場である. 50EMA<100EMA<200EMAの場合,下落市場である.

  3. ストーカスティックインジケータ: オーバーバイトとオーバーセール条件を決定するために,RSIの6日間のKとD値を計算する.K値がD値を超えると,オーバーセールになります.以下を超えると,オーバーセールになります.

  4. トレーディング・シグナル: 市場が三重指数移動平均の上昇または下落状態に適合する同時,二重移動平均指標がシグナルを生成し,ストカスタスティック指標が過剰購入または過剰販売を示さない場合にのみ,真の取引オーダーは発行されます.

利点

この戦略は,移動平均指標とストキャスト指標の利点を組み合わせます.取引シグナルを発行する際に,トレンド方向の判断と市場の過買い/過売状態の両方を考慮し,より明確なトレンドを追跡するためにノイズをより効果的にフィルタリングします.また,全体的なトレンドを決定するために3倍指数移動平均を使用し,シグナルをより信頼性があります.この戦略はシンプルで,実装しやすく,最適化することも簡単です.

リスク と 対策

この戦略の最大のリスクは,指標判断に依存していることです.指標が間違った信号を出せば,簡単に失敗する取引につながる可能性があります.さらに,全体的な傾向を決定するために,より長いサイクル移動平均を使用する場合,短期的な機会も逃れることがあります.主なリスク対策は以下の通りです:

  1. 指標パラメータを最適化し,市場特性により良く適合するように,二重移動平均値と三重指数移動平均値のサイクル組み合わせを調整する.

  2. 市場が急激な変動を示したときに,現在の取引を終了する CANCEL 取引のためのより多くの指標を組み込む.

  3. 短期的な機会を長期的な牛市で利用するために補助的な短期的な上昇戦略を使用します.

オプティマイゼーションの方向性

この戦略を最適化できる主な側面は以下の通りです.

  1. 二重移動平均と三重指数移動平均のサイクルパラメータを調整し,市場特性に適応する指標を最適化します.

  2. 誤った信号を引き起こす異常な価格変動を避けるために,VOLUME,MACD,その他の判断を増加させる.

  3. 短期的な引き下げの後 間違った信号を避けるために ろうそくパターンを用いて 傾向を確認する方が良いでしょう

  4. 株や外為などにも拡大し 戦略の適応性をテストします

  5. VIX指標を組み込み,市場全体の変動を決定し,ポジションのサイズを制御する.

結論

この戦略は,トレードシグナルを発行するために二重移動平均指標を使用し,三重指数移動平均値とストキャスト指標を補完して,比較的安定したトレンド追跡戦略を構築する. シンプルで,実行が簡単で,市場の特徴に非常に適合し,安定したリターンを提供する. 推奨する価値のある定量戦略です. ターゲット化された最適化によって,さらにより良い結果を達成する可能性があります.


/*backtest
start: 2023-12-07 00:00:00
end: 2023-12-12 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='5212 EMA Strategy', shorttitle='5212 EMA', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

//**Backtest Date sof
useStartPeriodTime  = input.bool(true                       , 'Start Date & Time'   , group='Date Range'    , inline='Start Period')
startPeriodTime     = input(timestamp('16 Apr 2021')   , ''                    , group='Date Range'    , inline='Start Period')
useEndPeriodTime    = input.bool(false                      , 'End Date & Time'     , group='Date Range'    , inline='End Period')
endPeriodTime       = input(timestamp('31 Dec 2222')   , ''                    , group='Date Range'    , inline='End Period')
enableHighlight     = input.bool(false                      , 'Highlight'           , group='Date Range'    , inline='Highlight')
highlightType       = input.string('Anchors'                , ''                    , group='Date Range'    , inline='Highlight'    , options=['Anchors', 'Background'])
highlightColor      = input.color(color.white               , ''                    , group='Date Range'    , inline='Highlight')
start = useStartPeriodTime ? startPeriodTime >= time : false
end = useEndPeriodTime ? endPeriodTime <= time : false
calcPeriod = true
// var line startAnchor    = line.new(na, na, na, na, xloc.bar_time, extend.both, highlightColor, width=2)
// var line endAnchor      = line.new(na, na, na, na, xloc.bar_time, extend.both, highlightColor, width=2)
// useBgcolor = false
// if enableHighlight
//     if highlightType == 'Anchors'
//         if useStartPeriodTime
//             line.set_xy1(startAnchor, startPeriodTime, low)
//             line.set_xy2(startAnchor, startPeriodTime, high)
//         if useEndPeriodTime
//             line.set_xy1(endAnchor, calcPeriod ? time : line.get_x1(endAnchor), low)
//             line.set_xy2(endAnchor, calcPeriod ? time : line.get_x1(endAnchor), high)

//     if highlightType == 'Background'
//         useBgcolor := true
//         useBgcolor

// bgcolor(useBgcolor and calcPeriod ? color.new(highlightColor,90) : na, editable=false)
//**Backtest Date eof

src         =input(close    , 'Source'      , group='Support')
showEMA     = input(true    , 'Show EMA'    , group='Support')

//**Stochastic RSI sof
smoothK     = input.int(6   , "K"               , group='Stochastic RSI'    , minval=1)
smoothD     = input.int(6   , "D"               , group='Stochastic RSI'    , minval=1)
lengthRSI   = input.int(28  , "RSI Length"      , group='Stochastic RSI'    , minval=1)
lengthStoch = input.int(28  , "Stoch Length"    , group='Stochastic RSI'    , minval=1)

rsi1    = ta.rsi(src, lengthRSI)
k       = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d       = ta.sma(k, smoothD)
//**STochastic RSI eof

//** EMA sof
emain01     = input.int(50  , "EMAma Girang"    , group='Moving Average Exponential'    , minval=1)
emain02     = input.int(100 , "EMAma Muda"      , group='Moving Average Exponential'    , minval=1)
emain03     = input.int(200 , "EMAma Tua"       , group='Moving Average Exponential'    , minval=1)

ema01 = ta.ema(src, emain01)
ema02 = ta.ema(src, emain02)
ema03 = ta.ema(src, emain03)
plot(showEMA ? ema01 : na, 'EMAma Girang'   , color = color.new(color.orange, 0))
plot(showEMA ? ema02 : na, 'EMAma Muda'     , color = color.new(color.blue, 0))
plot(showEMA ? ema03 : na, 'EMAma Tua'      , color = color.new(color.red, 0))
//** EMA eof

//**Condition sof
emaLong     = ema01 > ema02 and ema02 > ema03 and low > ema03
emaShort    = ema01 < ema02 and ema02 < ema03 and high < ema03

longCond    = ta.crossover(k,d) and k <= 23 and emaLong
shortCond   = ta.crossunder(k,d) and k >= 77 and emaShort

longClose   = ta.crossunder(k,d) and k <= 77
shortClose  = ta.crossover(k,d) and k >= 23
longCross   = ta.crossover(ema01, ema02)
shortCross  = ta.crossunder(ema01, ema02)
//**Condition eof

//**Strategy sof
if calcPeriod and longCond
    strategy.entry('long', strategy.long, when=longCond, comment='EN Long')
strategy.close('long', when=shortClose, comment='EX Long')
strategy.close('long', when=shortCross, comment='MD Short')

if calcPeriod and shortCond
    strategy.entry('short', strategy.short, when=shortCond, comment='EN Short')
strategy.close('short', when=longClose, comment='EX Short')
strategy.close('short', when=longCross, comment='MD Long')

if calcPeriod == false and ta.crossover(ema01, ema02) or ta.crossunder(ema01, ema02)
    strategy.cancel('long')
    strategy.cancel('short')
//**Strategy eof

//**Label sof
entryText       = str.tostring(strategy.position_avg_price, '##.###')
longText    = 'Long Entry : ' + entryText 
shortText   = 'Short Entry : ' + entryText
noTrade     = 'Sleeping Mode'

LongTrade = strategy.position_size > 0
ShortTrade = strategy.position_size < 0

Tekslabel = LongTrade ? longText : ShortTrade ? shortText : noTrade

xPosition = timenow + math.round(ta.change(time)*1)
yPosition = ta.highest(1)
labelColor = LongTrade ? color.new(color.aqua, 0) : ShortTrade ? color.new(color.red, 0) : color.new(color.gray, 0)
textColor   = LongTrade ? color.new(color.black, 0) : ShortTrade ? color.new(color.white, 0) : color.new(color.white, 0)

// lab_l = label.new(
//           xPosition, yPosition, Tekslabel,
//           color=labelColor, 
//           textcolor=textColor, 
//           style =  label.style_label_left,
//           textalign=text.align_left,
//           xloc=xloc.bar_time, yloc = yloc.price)

// label.delete(lab_l[1])
//**Strategy eof


もっと