이중 신호 트렌드 추적 전략

저자:차오장, 날짜: 2023-11-02 17:02:06
태그:

img

전반적인 설명

이 전략은 트렌드를 식별하고 추적하기 위해 이중 EMA와 Awesome 오시일레이터 지표를 결합합니다. EMA는 단기 트렌드 방향을 신속하게 판단하고 Awesome 오시일레이터는 잘못된 브레이크오웃을 필터링하고 입시 시기를 제공합니다. 전략 이름 Dual Signal Trend Tracking Strategy는 주요 기능을 정확하게 요약합니다.

전략 논리

이 전략은 주로 두 가지 기술 지표, 이중 EMA 및 Awesome Oscillator를 사용하여 다음과 같은 논리로 신호를 필터합니다.

  1. 2주기 및 20주기 EMA를 계산합니다. 2주기 EMA가 20주기 EMA를 상향으로 깨면 상승 추세를 나타냅니다. 2주기 EMA가 20주기 EMA를 하향으로 깨면 하락 추세를 나타냅니다.

  2. 빠른 EMA 빼기 느린 EMA로 평평한 MACD 히스토그램인 Awesome 오시일레이터를 계산합니다. AO 히스토그램이 빨간색에서 파란색으로 변하면 구매 신호입니다. 파란색에서 빨간색으로 변하면 판매 신호입니다.

  3. EMA가 상승 추세와 AO가 동시에 구매 신호를 표시할 때만 최종 구매 신호가 생성됩니다. EMA가 하락 추세를 표시하고 AO가 판매 신호를 표시할 때만 최종 판매 신호가 생성됩니다.

  4. 이 이중 신호 필터링 메커니즘을 통해 가짜 브레이크를 줄이고 중장기 트렌드를 추적할 수 있습니다.

이점 분석

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

  1. 이중 라인 필터링은 오류로 인한 소음 거래를 줄인다. EMA는 전체 트렌드를 판단하고 AO는 입시 시기를 필터한다. 둘을 결합하면 신호 신뢰성이 향상된다.

  2. 매우 빠른 반응 감수성은 단기적 반전을 빠르게 감지합니다. 2 기간 EMA는 파업에 매우 민감하며 최근 트렌드가 변경되었는지 빠르게 결정할 수 있습니다.

  3. Awesome 오시일레이터는 MACD를 필터링하여 트렌드에서 잘못된 브레이크를 효과적으로 식별하고 불필요한 역 트레이드를 피합니다.

  4. 이 전략은 중장기 동향을 추적하기 위한 명확한 방향을 가지고 있습니다. EMA는 기본 동향을 결정하고 AO는 전체 동향에 따라 거래를 보장하기 위해 신호를 필터합니다.

  5. 합리적인 매개 변수 선택. 2 기간 및 20 기간 EMA는 다른 시간 프레임에서 가격 변화를 포착합니다. AO 매개 변수 5 및 34는 단기 패턴을 식별하기 위해 최적화되었습니다.

위험 분석

또한 다음과 같은 위험 요소가 있습니다.

  1. 범위 시장에서 EMA와 AO는 더 많은 잘못된 신호를 생성하여 불필요한 단편 거래를 유발할 수 있습니다. EMA 기간을 조정하면 오류를 줄일 수 있습니다.

  2. AO는 때때로 EMA를 지연시켜 신호 시간 지연을 유발할 수 있습니다. AO 매개 변수는 더 빠른 응답을 위해 최적화 될 수 있습니다.

  3. EMA와 AO가 단기 및 중장기 특징을 때 품질 데이터와 컴퓨팅 능력이 필요합니다.

  4. 빈번한 거래는 높은 수수료와 미끄러진 비용으로 이어집니다. 보유 기간을 연장하기 위해 출구 기준이 완화 될 수 있습니다.

  5. 이 전략은 장기적 추세와 주요 지원/저항 수준을 고려하지 않습니다. 올바른 무역 방향을 보장하기 위해 더 많은 요소가 결합되어야합니다.

최적화 방향

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

  1. 유동 평균 리본과 ATR과 같은 트렌드 지표를 도입하여 EMA가 전체 트렌드를 결정하는 데 도움이 됩니다.

  2. 피보나치 리트레이싱과 같은 핵심 지원/저항 탐지 기능을 추가하여, 나쁜 입점 위치를 피하기 위해 핵심 레벨 주변에서만 신호를 생성합니다.

  3. 콤보 효과를 향상시키기 위해 EMA와 AO 매개 변수 조합을 최적화하십시오. 예를 들어, 최적의 매개 변수 쌍을 찾기 위해 유전 알고리즘을 사용하십시오.

  4. 스톱 로스 출구를 추가합니다. 단일 거래 손실을 제어하기 위해 가격이 최근 스윙 하이 / 로우를 깨면 출구합니다.

  5. 전략 성과를 평가하기 위해 역사적인 데이터에 대한 백테스트, 안정적인 수익성이 기대에 부응하는지 확인합니다.

  6. 종이를 거래 단계적으로 매개 변수를 조정 하 고 라이브 성능을 향상. 더 나은 안정적인 매개 변수 세트를 찾기 위해 매개 변수 견고성 테스트.

결론

전체 전략 아이디어는 명확하며, 전체 트렌드를 나타내는 EMA와 신호 필터링을 위한 AO를 결합합니다. 트렌드를 효과적으로 식별하고 추적할 수 있지만 안정성을 향상시키기 위해 추가 최적화 및 테스트를 위한 일부 위험과 한계도 있습니다. 핵심은 적절한 거래 원칙과 스타일과 결합된 적합한 제품과 매개 변수를 선택하는 것입니다. 전반적으로이 전략은 합리적이고 실용적인 가치를 가지고 있습니다.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 27/04/2022
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This indicator plots 2/20 exponential moving average. For the Mov 
// Avg X 2/20 Indicator, the EMA bar will be painted when the Alert criteria is met.
//
// Second strategy
//    This indicator plots the oscillator as a histogram where blue denotes 
//    periods suited for buying and red . for selling. If the current value 
//    of AO (Awesome Oscillator) is above previous, the period is considered 
//    suited for buying and the period is marked blue. If the AO value is not 
//    above previous, the period is considered suited for selling and the 
//    indicator marks it as red.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
EMA20(Length) =>
    pos = 0.0
    xPrice = close
    xXA = ta.ema(xPrice, Length)
    nHH = math.max(high, high[1])
    nLL = math.min(low, low[1])
    nXS = nLL > xXA or nHH < xXA ? nLL : nHH
    iff_1 = nXS < close[1] ? 1 : nz(pos[1], 0)
    pos := nXS > close[1] ? -1 : iff_1
    pos


AC(nLengthSlow,nLengthFast,nLengthMA,nLengthEMA,nLengthWMA,bShowWMA,bShowMA,bShowEMA) =>
    pos = 0.0
    xSMA1_hl2 = ta.sma(hl2, nLengthFast)
    xSMA2_hl2 = ta.sma(hl2, nLengthSlow)
    xSMA1_SMA2 = xSMA1_hl2 - xSMA2_hl2
    xSMA_hl2 = ta.sma(xSMA1_SMA2, nLengthFast)
    nRes =  xSMA1_SMA2 - xSMA_hl2
    xResWMA = ta.wma(nRes, nLengthWMA)
    xResMA = ta.sma(nRes, nLengthMA)
    xResEMA = ta.ema(nRes, nLengthEMA)
    xSignalSeries = bShowWMA ? xResWMA :
                     bShowMA ? xResMA : 
                      bShowEMA ? xResEMA : na
    pos :=  xSignalSeries[2] < 0 and xSignalSeries[1] > 0? 1:
    	     xSignalSeries[2] > 0 and xSignalSeries[1] < 0 ? -1 : nz(pos[1], 0)
    pos

strategy(title='Combo 2/20 EMA & Bill  Awesome Oscillator (AC)', shorttitle='Combo', overlay=true)
var I1 = '●═════ 2/20 EMA ═════●'
Length = input.int(14, minval=1, group=I1)
var I2 = '●═════  Awesome Oscillator (AC) ═════●'
nLengthSlow = input.int(34, minval=1, title="Length Slow", group=I2)
nLengthFast = input.int(5, minval=1, title="Length Fast", group=I2)
nLengthMA = input.int(15, minval=1, title="MA", group=I2)
nLengthEMA = input.int(15, minval=1, title="EMA", group=I2)
nLengthWMA = input.int(15, minval=1, title="WMA", group=I2)
bShowWMA = input.bool( defval=true, title="trading WMA", group=I2)
bShowMA = input.bool( defval=false, title="trading MA", group=I2)
bShowEMA = input.bool( defval=false, title="trading EMA", group=I2)
var misc = '●═════ MISC ═════●'
reverse = input.bool(false, title='Trade reverse', group=misc)
var timePeriodHeader = '●═════ Time Start ═════●'
d = input.int(1, title='From Day', minval=1, maxval=31, group=timePeriodHeader)
m = input.int(1, title='From Month', minval=1, maxval=12, group=timePeriodHeader)
y = input.int(2005, title='From Year', minval=0, group=timePeriodHeader)
StartTrade = time > timestamp(y, m, d, 00, 00) ? true : false
posEMA20 = EMA20(Length)
prePosAC = AC(nLengthSlow,nLengthFast,nLengthMA,nLengthEMA,nLengthWMA,bShowWMA,bShowMA,bShowEMA)
iff_1 = posEMA20 == -1 and prePosAC == -1 and StartTrade ? -1 : 0
pos = posEMA20 == 1 and prePosAC == 1 and StartTrade ? 1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
if possig == 1
    strategy.entry('Long', strategy.long)
if possig == -1
    strategy.entry('Short', strategy.short)
if possig == 0
    strategy.close_all()
barcolor(possig == -1 ? #b50404 : possig == 1 ? #079605 : #0536b3)

더 많은