オクタEMAと一目均衡表のクラウドチャートによる定量的取引戦略


作成日: 2023-12-11 14:52:05 最終変更日: 2023-12-11 14:52:05
コピー: 1 クリック数: 737
1
フォロー
1621
フォロワー

オクタEMAと一目均衡表のクラウドチャートによる定量的取引戦略

概要

この戦略は,8つの異なる周期の指数移動平均とイチモク雲図を主要取引信号として使用し,1時間,4時間または日線時間枠で効果的に動作します.

戦略原則

この戦略の核心となる原則は以下の2つの部分に基づいています.

  1. 8条 指数移動平均 ((Octa-EMA)

この戦略は,8つの異なる周期のEMA,すなわち5日線,11日線,15日線,18日線21日線24日線28日線および34日線を使用している.この8つのEMAはOcta-EMAと呼ばれている.短い周期のEMAは,長い周期のEMAの上に多頭トレンドを示すとき,逆には空頭トレンドを示す.

  1. イチモク雲図指標

Ichimoku雲図には,変換線,基準線,遅延線,先導線A/Bが含まれている.雲図は,トレンドの方向を判断し,サポートレジスタンスを提供する.価格が雲図の上部に多頭トレンドであるとき,雲図下部に空頭トレンドであるとき.

この戦略の取引シグナルは上記の2つの大きな構成要素からくる. 8つのEMAがすべて多頭列にあるとき (短いEMAが長いEMAの上に) 価格がIchimokuの雲図より高いとき,買いのシグナルが生じる.

戦略的優位分析

この戦略の利点は以下の通りです.

  1. ダブル指標のフィルタリングにより,偽信号を減らす.
  2. Ichimoku Cloud Mapはトレンドの方向を判断し,逆転取引を避けるために使われています.
  3. 8条 EMAクロスポートフォリオの判断傾向,より高い正確性
  4. 複数のタイムサイクルで動作する
  5. パラメータの最適化スペースが広く,異なる品種に合わせてカスタマイズできます.

戦略的リスク分析

この戦略にはいくつかのリスクがあります.

  1. 震動の際に空頭信号が多く発生する可能性がある.
  2. 購入条件が厳格で,購入ポイントのいくつかを逃す可能性もあります.
  3. 短期と中長期のトレンドが一致しない場合,失効する
  4. EMAパラメータの不適切な設定は信号の遅延を引き起こす

上記のリスクに対して,EMAパラメータを調整したり入学条件を最適化したりすることでリスクを低減することができる.また,他の指標を併用して補助として用いることもできる.

戦略最適化の方向性

この戦略は以下の点で最適化できます.

  1. EMAパラメータを調整し,対応する周期を最適化
  2. 平均線多空判断指標を追加し,トレンド判断の正確性を確保する
  3. MACD,KDJなどの他の指標と組み合わせて,入場時間を最適化
  4. ストップ・ストップ・ストップ・ストップ・ストップ・ストップ・ストップ・ストップ
  5. 異なる品種のパラメータの効果をテストし,最適なパラメータの組み合わせを探します.
  6. 機械学習のアルゴリズムで優位性パラメータを自動検索する

要約する

Octa-EMAは,Ichimokuクラウドの量化取引戦略と比べて,全体的に比較して,より安定し,信頼性の高いトレンド追跡戦略である.この戦略は,EMAの組み合わせでトレンド判断とIchimokuフィルタリング信号を同時に使用し,パラメータを最適化すると,誤判率を下げることができる.この戦略は,株式指数,外貨,貴金属などの品種に広く適用され,また,複数のタイムサイクルで動作することもできる.止損止めと補助指標を組み合わせることができれば,戦略の勝利率と収益率をさらに向上させることができる.

ストラテジーソースコード
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Fukuiz

strategy(title='Fukuiz Octa-EMA + Ichimoku', shorttitle='Fuku octa strategy', overlay=true, process_orders_on_close=true, 
     default_qty_type= strategy.cash , default_qty_value=1000, currency=currency.USD, initial_capital=10000 ,commission_type = strategy.commission.percent,commission_value=0.25)


//OCTA EMA ##################################################


// Functions
f_emaRibbon(_src, _e1, _e2, _e3, _e4, _e5, _e6, _e7, _e8) =>
    _ema1 = ta.ema(_src, _e1)
    _ema2 = ta.ema(_src, _e2)
    _ema3 = ta.ema(_src, _e3)
    _ema4 = ta.ema(_src, _e4)
    _ema5 = ta.ema(_src, _e5)
    _ema6 = ta.ema(_src, _e6)
    _ema7 = ta.ema(_src, _e7)
    _ema8 = ta.ema(_src, _e8)
    [_ema1, _ema2, _ema3, _ema4, _ema5, _ema6, _ema7, _ema8]

showRibbon = input(true, 'Show Ribbon (EMA)')
ema1Len = input(5, title='EMA 1 Length')
ema2Len = input(11, title='EMA 2 Length')
ema3Len = input(15, title='EMA 3 Length')
ema4Len = input(18, title='EMA 4 Length')
ema5Len = input(21, title='EMA 5 Length')
ema6Len = input(24, title='EMA 6 Length')
ema7Len = input(28, title='EMA 7 Length')
ema8Len = input(34, title='EMA 8 Length')

[ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8] = f_emaRibbon(close, ema1Len, ema2Len, ema3Len, ema4Len, ema5Len, ema6Len, ema7Len, ema8Len)

//Plot

ribbonDir = ema8 < ema2
p1 = plot(ema1, color=showRibbon ? ribbonDir ? #1573d4 : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 1')
p2 = plot(ema2, color=showRibbon ? ribbonDir ? #3096ff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 2')
plot(ema3, color=showRibbon ? ribbonDir ? #57abff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 3')
plot(ema4, color=showRibbon ? ribbonDir ? #85c2ff : color.new(#5d606b, 15) : na, linewidth=2, title='EMA 4')
plot(ema5, color=showRibbon ? ribbonDir ? #9bcdff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 5')
plot(ema6, color=showRibbon ? ribbonDir ? #b3d9ff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 6')
plot(ema7, color=showRibbon ? ribbonDir ? #c9e5ff : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 7')
p8 = plot(ema8, color=showRibbon ? ribbonDir ? #dfecfb : color.new(#5d606b, 30) : na, linewidth=2, title='EMA 8')
fill(p1, p2, color.new(#1573d4, 85))
fill(p2, p8, color.new(#1573d4, 85))

//ichimoku##################################################

//color
colorblue = #3300CC
colorred = #993300
colorwhite = #FFFFFF
colorgreen = #CCCC33
colorpink = #CC6699
colorpurple = #6633FF

//switch
switch1 = input(false, title='Chikou')
switch2 = input(false, title='Tenkan')
switch3 = input(false, title='Kijun')

middleDonchian(Length) =>
    lower = ta.lowest(Length)
    upper = ta.highest(Length)
    math.avg(upper, lower)

//Functions
conversionPeriods = input.int(9, minval=1)
basePeriods = input.int(26, minval=1)
laggingSpan2Periods = input.int(52, minval=1)
displacement = input.int(26, minval=1)
Tenkan = middleDonchian(conversionPeriods)
Kijun = middleDonchian(basePeriods)
xChikou = close
SenkouA = middleDonchian(laggingSpan2Periods)
SenkouB = (Tenkan[basePeriods] + Kijun[basePeriods]) / 2

//Plot
A = plot(SenkouA[displacement], color=color.new(colorpurple, 0), title='SenkouA')
B = plot(SenkouB, color=color.new(colorgreen, 0), title='SenkouB')
plot(switch1 ? xChikou : na, color=color.new(colorpink, 0), title='Chikou', offset=-displacement)
plot(switch2 ? Tenkan : na, color=color.new(colorred, 0), title='Tenkan')
plot(switch3 ? Kijun : na, color=color.new(colorblue, 0), title='Kijun')
fill(A, B, color=color.new(colorgreen, 90), title='Ichimoku Cloud')

//Buy and Sell signals
fukuiz = math.avg(ema2, ema8)
white = ema2 > ema8
gray = ema2 < ema8
buycond = white and white[1] == 0
sellcond = gray and gray[1] == 0
bullish = ta.barssince(buycond) < ta.barssince(sellcond)
bearish = ta.barssince(sellcond) < ta.barssince(buycond)
buy = bearish[1] and buycond and fukuiz > SenkouA[displacement] and fukuiz > SenkouB
sell = bullish[1] and sellcond and fukuiz > SenkouA[displacement] and fukuiz > SenkouB
sell2=ema2 < ema8
buy2 = white and fukuiz > SenkouA[displacement] and fukuiz > SenkouB

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//Back test

startYear = input.int(defval=2017, title='Start Year', minval=2000, maxval=3000)
startMonth = input.int(defval=1, title='Start Month', minval=1, maxval=12)
startDay = input.int(defval=1, title='Start Day', minval=1, maxval=31)
endYear = input.int(defval=2023, title='End Year', minval=2000 ,maxval=3000)
endMonth = input.int(defval=12, title='End Month', minval=1, maxval=12)
endDay = input.int(defval=31, title='End Day', minval=1, maxval=31)

start = timestamp(startYear, startMonth, startDay, 00, 00)
end = timestamp(endYear, endMonth, endDay, 23, 59)
period() => time >= start and time <= end ? true : false

if buy2 
    strategy.entry(id='long', direction=strategy.long, when=period(), comment='BUY')

if sell2
    strategy.close(id='long', when=period(), comment='SELL')