Octa-EMA와 Ichimoku 클라우드 양적 거래 전략

저자:차오장, 날짜: 2023-12-11 14:52:05
태그:

img

전반적인 설명

이 전략은 다른 기간의 8 개의 기하급수적인 이동 평균 (EMA) 과 Ichimoku 클라우드를 주요 거래 신호로 사용하며 시간, 4 시간 또는 일간 시간 프레임에서 효과적으로 실행 할 수 있습니다.

전략 원칙

이 전략의 핵심 원칙은 다음 두 부분에 기초합니다.

  1. 8 기하급수적인 이동 평균 (Octa-EMA)

    이 전략은 5일, 11일, 15일, 18일, 21일, 24일, 28일, 34일 등 다양한 기간을 가진 8개의 EMA를 사용한다. 이 8개의 EMA는 Octa-EMA로 불린다. 짧은 기간 EMA가 더 긴 기간 EMA보다 높을 때 상승 추세를 나타내고, 반대로 하락 추세를 나타낸다.

  2. 이치모쿠 구름

    이치모쿠 클라우드는 변환선, 기본선, 후퇴 스판 및 선도 스판 A/B를 포함합니다. 클라우드는 주로 트렌드 방향을 판단하고 지원/저항을 제공합니다. 가격이 클라우드 위에있을 때 상승 추세를 나타냅니다. 클라우드 아래에있을 때 하락 추세를 나타냅니다.

이 전략의 거래 신호는 위의 두 가지 구성 요소의 조합에서 발생합니다. 모든 8 EMA가 상승 추세 배열에있을 때 구매 신호가 생성되며 가격이 이치모쿠 클라우드 위에 있습니다. EMA 배열이 하락 추세로 전환 할 때 판매 신호가 생성됩니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 이중 표시기 필터링을 통해 잘못된 신호를 줄입니다.
  2. 이치모쿠 클라우드는 트렌드 방향을 판단하고, 역트렌드 거래를 피합니다.
  3. 8 EMA 크로스오버가 더 정확한 경향을 결정하기 위해 결합됩니다.
  4. 여러 시간 프레임에서 실행할 수 있습니다
  5. 큰 매개 변수 조정 공간, 다른 제품에 맞춤화 할 수 있습니다

위험 분석

이 전략에는 또한 몇 가지 위험이 있습니다.

  1. 범위를 제한하는 시장에서 더 많은 잘못된 판매 신호를 생성 할 수 있습니다.
  2. 엄격 한 구매 조건 은 일부 구매 기회 를 놓칠 수 있다
  3. 단기 및 중기 동향이 충돌할 때 실패할 수 있습니다.
  4. 잘못된 EMA 매개 변수 조정으로 인해 신호 지연이 발생할 수 있습니다.

이러한 위험을 해결하기 위해 매개 변수를 조정하거나 위험을 줄이기 위해 입시 조건을 최적화 할 수 있습니다. 확인을 위해 다른 지표도 포함 할 수 있습니다.

최적화 방향

이 전략은 몇 가지 측면에서 최적화 될 수 있습니다.

  1. 최적 기간을 찾기 위해 EMA 매개 변수를 조정합니다.
  2. 추세를 결정하는 지표를 추가하여 추세를 정확하게 판단하도록
  3. 입시 시기를 개선하기 위해 MACD, KDJ와 같은 추가 지표를 포함합니다.
  4. 거래 리스크별로 컨트롤에 스톱 로스/이익 취득을 추가합니다.
  5. 가장 적합한 제품을 찾기 위해 다양한 제품에서 테스트 매개 변수
  6. 매개 변수를 자동 최적화하기 위해 기계 학습을 사용

결론

전체적으로, 오카타-EMA와 이치모쿠 클라우드 전략은 비교적 안정적이고 신뢰할 수 있는 트렌드 추적 시스템이다. 트렌드를 결정하기 위해 EMA 크로스오버를 사용하고 최적화되면 낮은 거짓 신호를 제공하여 신호를 필터하기 위해 이치모쿠를 사용합니다. 이 전략은 여러 시간 프레임에서 지수, 외환, 금속 등에 광범위하게 적용 될 수 있습니다. 스톱 로스/프로프트 취득 및 인디케이터를 확인함으로써 승률과 수익성이 더욱 향상 될 수 있습니다.


/*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')





더 많은