Octa-EMA 및 Ichimoku Cloud 차트 양적 거래 전략


생성 날짜: 2023-12-11 14:52:05 마지막으로 수정됨: 2023-12-11 14:52:05
복사: 1 클릭수: 737
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

Octa-EMA 및 Ichimoku Cloud 차트 양적 거래 전략

개요

이 전략은 8개의 다른 주기의 지수 이동 평균과 이치모쿠 클라우드 그래프를 주요 거래 신호로 사용하며, 1시간, 4시간 또는 일계 시간 프레임에서 효과적으로 작동할 수 있다.

전략 원칙

이 전략의 핵심은 다음의 두 가지에 기초하고 있습니다.

  1. 8개 지수 이동 평균 ((Octa-EMA)

이 전략은 8개의 서로 다른 주기적인 EMA를 사용한다. 5일선, 11일선, 15일선, 18일선, 21일선, 24일선, 28일선, 34일선이다. 이 8개의 EMA는 Octa-EMA이라고 불린다. 더 짧은 기간의 EMA가 더 긴 기간의 EMA 위에 있을 때 다단계 트렌드를 나타내고, 반대로 허공 트렌드를 나타낸다.

  1. 이치모쿠 클라우드 지도 지표

이치모쿠 클라우드 차트는 전환선, 기준선, 지연선 및 선도선 A/B를 포함한다. 클라우드 차트는 주로 트렌드 방향을 판단하고 지원 저항을 제공한다. 가격이 클라우드 차트의 위쪽에 있을 때 다단계 트렌드이며, 클라우드 차트의 아래쪽에 있을 때는 공중 트렌드이다.

이 전략의 거래 신호는 위의 두 가지 주요 구성 요소에서 나온다. 8 개의 EMA가 모두 다수 상단에 배치되어있는 경우 구매 신호가 발생하며, 이치모쿠의 클라우드 그래프보다 가격이 높습니다. EMA 배열이 공백으로 전환되면 판매 신호가 발생합니다.

전략적 강점 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 이중 지수 필터링을 사용하여 가짜 신호를 줄일 수 있습니다.
  2. 이치모쿠 클라우드 그래프는 트렌드 방향을 판단하여 역동적인 거래를 피합니다.
  3. 8항 EMA 크로스 포트폴리오 판단 경향, 정확성 향상
  4. 여러 시간 주기에서 실행할 수 있습니다.
  5. 다양한 품종에 맞게 커스터마이징할 수 있는 큰 최적화 공간

전략적 위험 분석

이 전략에는 위험도 있습니다.

  1. 진동 시에는 더 많은 공중 신호가 발생할 수 있다.
  2. 구매 조건이 엄격하여 일부 구매점을 놓칠 수 있습니다.
  3. 단기 및 중장기 동향이 일치하지 않을 때 유효하지 않을 수 있습니다.
  4. EMA 파라미터를 잘못 설정하면 신호 지연이 발생할 수 있다.

위와 같은 위험에는 EMA 매개 변수를 조정하거나 입학 조건을 최적화하여 위험을 줄일 수 있으며, 다른 지표와 결합하여 보조적으로 사용할 수 있습니다.

전략 최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. EMA 파라미터를 조정하여 대응주기를 최적화합니다.
  2. 트렌드 판단의 정확성을 보장하기 위해 평균선 빈도 판단 지표를 추가합니다.
  3. MACD, KDJ와 같은 다른 지표와 결합하여 진출 시기를 최적화합니다.
  4. 단편적 손실을 통제하기 위한 H&M 전략의 강화
  5. 다양한 품종의 변수 효과를 테스트하여 최적의 변수 조합을 찾습니다.
  6. 기계 학습 알고리즘을 사용하여 우수 변수를 자동으로 찾습니다.

요약하다

Octa-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')