EMA 트렌드를 추적하고 오스칠레이션 전략을 억제합니다

저자:차오장, 날짜: 2023-12-12 15:52:37
태그:

img

전반적인 설명

이 전략은 EMA, 트렌드 추적 전략 (TTS) 및 샤프 트렌드 사이클 (STC) 이라는 세 가지 지표의 장점을 결합하여 강력한 단기 트렌드 추적 전략을 형성합니다. 구체적으로, 전략은 세 가지 지표의 구매 및 판매 신호가 일관성 있는지 여부를 판단합니다. 일관성있는 경우 거래 신호가 생성됩니다. 그렇지 않으면 거래가 이루어지지 않습니다. 이것은 일부 잘못된 신호를 필터링하고 전략을 더 신뢰할 수 있습니다.

전략 원칙

전략은 EMA 지표, TTS 트렌드 추적 전략 및 STC 지표로 구성되어 있습니다.

우선 200주기 EMA 지수적 이동 평균 라인을 계산합니다. 가격이 이 EMA 라인 아래에 있다면, EMA 지표는 판매 신호를 제공합니다: -1; 가격이 라인 위에 있다면, EMA 지표는 구매 신호를 제공합니다: 1.

두 번째로, TTS 트렌드 추적 전략의 관련 매개 변수를 계산합니다. 상부와 하부 레일의 가격 브레이크에 따라 시장 트렌드 방향이 결정됩니다. 가격이 상부 레일을 통과하면 구매 신호 1이 생성됩니다. 가격이 하부 레일을 통과하면 판매 신호 -1이 생성됩니다.

마지막으로, 사프 트렌드 사이클 (STC) 지표가 계산되며, 이는 가격 통합의 변화 경향을 반영합니다. STC 지표가 상승하면 구매 신호 1을 생성합니다. STC 지표가 떨어지면 판매 신호 -1을 생성합니다.

세 가지 지표에서 판단 신호를 얻은 후 전략은 그들이 일관성 있는지 여부를 결정합니다. 세 가지 지표 판단 신호가 일관성있는 경우에만 실제 거래 신호가 생성됩니다. 이것은 일부 잘못된 신호를 효과적으로 필터링하고 전략을 더 신뢰할 수 있습니다.

거래 신호를 생성하기로 결정되면 긴 또는 짧은 포지션이 열리고 수익/손실 중지 포인트가 설정됩니다.

장점

  1. 이 전략은 시장 동향 방향을 효과적으로 결정하기 위해 세 가지 다른 유형의 지표를 결합합니다.

  2. 잘못된 신호를 필터링하기 위해 세 가지 지표의 판단 신호의 일관성을 사용하면 불필요한 거래를 줄이고 전략을 더 신뢰할 수 있습니다.

  3. 합리적인 수익/손실 중지 지점을 설정하면 수익을 확보하고 손실이 확대되는 것을 방지할 수 있습니다.

  4. 최적화된 매개 변수는 대부분의 주식과 외환 상품에 적합합니다.

  5. 간단하고 이해하기 쉬운 거래 논리

위험성

  1. 지표 판단의 불일치로 인해 거래 기회가 손실 될 수 있습니다. 판단 규칙은 더 이상 최적화 될 수 있습니다.

  2. STC 표시기는 매개 변수에 민감합니다. 다른 제품에는 매개 변수가 조정되어야합니다.

  3. 하락 추세에서 스톱 로스는 침투하여 큰 손실을 초래할 수 있습니다. 적응 스톱 로스는 고려 될 수 있습니다.

  4. 옆집합은 효과적으로 식별 할 수 없으며 함정 위치로 이어집니다.

개선

  1. 더 강력한 판단 규칙을 찾기 위해 더 많은 지표 조합을 테스트하십시오. 예를 들어 RSI 지표를 추가하십시오.

  2. 다른 제품에서 더 나은 적응을 위해 STC 매개 변수를 최적화합니다. 적응 매개 변수 최적화 모듈을 추가합니다.

  3. 역동적으로 스톱 손실 포인트를 최적화 하기 위해 적응 스톱 손실 모듈을 증가.

  4. 포지션 클로싱 모듈을 강화해서 옆으로 이동할 수 있는 거리를 파악하고 함정을 피하세요.

  5. 높은 주파수 거래에 대한 알고리즘을 최적화하여 대기 시간을 줄이고 주문 이행률을 향상시킵니다.

결론

이 전략은 시장 방향을 결정하기 위해 EMA, TTS 및 STC 지표를 결합하고, 세 개의 트레이드에서 일관된 판단을 통해 잘못된 신호를 효과적으로 필터링합니다. 트렌드 추적 기능을 더욱 강화하기 위해 더 많은 지표 조합을 테스트하고, 적응 알고리즘을 추가하고, 고주파 거래 모듈을 최적화하여 최적화 할 수있는 많은 공간이 있습니다. 단순히 움직이는 평균을 따르는 전통적인 전략과 비교하면이 전략은 더 지능적으로 시장을 판단하고, 함정을 피하면서 트렌드를 포착 할 수 있습니다.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01

////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1

////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
         close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:=  close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)


////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")

AAAA(BBB, BBBB, BBBBB) =>
    fastMA = ta.ema(BBB, BBBB)
    slowMA = ta.ema(BBB, BBBBB)
    AAAA = fastMA - slowMA
    AAAA

AAAAA(EEEEEE, BBBB, BBBBB) =>
    AAA = input.float(0.5, group ="Schaff Trend Cycle")
    var CCCCC = 0.0
    var DDD = 0.0
    var DDDDDD = 0.0
    var EEEEE = 0.0
    BBBBBB = AAAA(close, BBBB, BBBBB)
    CCC = ta.lowest(BBBBBB, EEEEEE)
    CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
    CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
    DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
    DDDD = ta.lowest(DDD, EEEEEE)
    DDDDD = ta.highest(DDD, EEEEEE) - DDDD
    DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
    EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
    EEEEE

mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1

////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0

currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0

signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0

stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)

if signal == 1
    strategy.entry(id="L", direction=strategy.long)
    strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
    strategy.entry(id="S", direction=strategy.short)
    strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)

////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')

////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")


더 많은