EMA 크로스오버 전략과 함께 MACD 오시레이터

저자:차오장, 날짜: 2023-09-23 15:24:12
태그:

전반적인 설명

이것은 MACD 오시레이터와 EMA 크로스오버를 결합한 간단하면서도 효율적인 거래 전략입니다. 현재 4h 촛불에 설정되었지만 다른 시간 프레임에 적응 할 수 있습니다. 지난 3 년 동안 BTC와 ETH에서 잘 수행하여 구매 및 보유를 이길 수 있습니다. 최적화로 선물, 인덱스, 외환, 주식 등에 적응 할 수 있습니다.

전략 논리

주요 구성 요소는 다음과 같습니다.

  1. MACD: 가격동력 변화를 판단합니다.

  2. EMA: 가격 추세 방향을 결정하는 것

  3. 시간 조건: 유효한 전략 기간을 정의합니다.

  4. 길고 짧은 옵션: 길고 짧은 방향을 선택합니다.

거래 규칙은 다음과 같습니다.

  1. 롱/아웃 쇼트: EMA를 넘어서 닫을 때, MACD 히스토그램이 양성하며, 현재 촛불은 이전 촛불보다 높습니다.

  2. 짧은/장기 출구: EMA 아래로 닫을 때 MACD 히스토그램이 음수이며 현재 촛불은 이전 촛불보다 낮습니다.

전략은 추세와 동력을 단순하고 효율적인 시스템으로 결합합니다.

장점

단일 지표에 비해 주요 장점은 다음과 같습니다.

  1. MACD는 단기 동력을 판단하고 EMA는 트렌드 방향을 결정합니다.

  2. 간단하고 명확한 규칙, 이해하기 쉽고 실행하기 쉽습니다.

  3. 다양한 제품과 시간 프레임에 대한 유연한 매개 변수 조정

  4. 단기/장기 또는 양방향 거래 옵션

  5. 불필요한 거래를 피하기 위해 유효한 전략 기간을 정의 할 수 있습니다.

  6. 몇 년 동안 안정적인 경기력

  7. 거래당 통제 가능한 위험

  8. 기계 학습을 통해 더 많은 최적화를 할 수 있는 잠재력

위험성

그 장점에도 불구하고, 고려해야 할 위험은:

  1. 넓은 매개 변수를 조정하면 너무 부착될 위험이 있습니다.

  2. 정지하지 않고, 무제한 손실의 위험을 감수합니다.

  3. 부피 필터가 없어서 가짜 탈출 위험이 있습니다.

  4. 트렌드 턴을 잡는 데 지연하면 모든 손실을 피할 수 없습니다.

  5. 변화하는 시장 체제로 인한 성능 저하

  6. 역사적인 데이터에만 근거해서 모델의 안정성이 핵심입니다.

  7. 높은 거래 빈도는 거래 비용을 증가시킵니다.

  8. 수익/위험 비율과 주식 곡선을 모니터링해야 합니다.

개선

이 전략은 다음과 같이 강화될 수 있습니다.

  1. 가짜 브레이크를 피하기 위해 볼륨 필터를 추가합니다.

  2. 거래당 손실을 통제하기 위해 정지를 실행합니다.

  3. 기간에 걸쳐 매개 변수 효과를 평가합니다.

  4. 동적 최적화를 위해 기계 학습을 통합합니다.

  5. 다양한 시장에서 견고성 테스트

  6. 주파수를 줄이기 위해 위치 크기를 조정합니다.

  7. 위험 관리 전략을 최적화합니다.

  8. 분산 기기를 테스트해서 주파수를 높여

  9. 계속된 백테스팅을 통해 과부착을 방지합니다.

결론

요약하자면, 전략은 MACD와 EMA 조합에서 간단하면서도 강력한 시스템을 형성합니다. 그러나 지속적인 최적화와 견고성 테스트는 변화하는 시장 조건에 적응하는 모든 전략에 중요합니다. 거래 전략은 계속 진화해야합니다.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21

//@version=4
strategy("My Script", overlay=true)

//heiking ashi calculation
UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===

// === BASE FUNCTIONS ===

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//timecondition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 //monday and session 
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

//ema data  -- moving average
len = input(9, minval=1, title="Length")
src = input(hl2, title="Source")
out = ema(src, len)
//plot(out, title="EMA", color=color.blue)

//histogram
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//main variables to apply conditions are going to be out(moving avg) and hist(macd)

long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond
short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond

//limit to 1 entry
var longOpeneda = false
var shortOpeneda = false
var int timeOfBuya = na



longCondition= long and not longOpeneda 

if longCondition
    longOpeneda := true
    timeOfBuya := time


longExitSignala = short
exitLongCondition = longOpeneda[1] and longExitSignala

if exitLongCondition
    longOpeneda := false
    timeOfBuya := na


plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white)
plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white)

//automatization

longEntry= input(true)
shortEntry=input(false)

if(longEntry)
    strategy.entry("long",strategy.long,when=longCondition)
    strategy.close("long",when=exitLongCondition)

if(shortEntry)
    strategy.entry("short",strategy.short,when=exitLongCondition)
    strategy.close("short",when=longCondition)



더 많은