리소스 로딩... 로딩...

다중 시간 프레임 기하급수적 이동 평균 크로스오버 전략

저자:차오장, 날짜: 2024-07-30 12:02:23
태그:EMASLTPTF

img

전반적인 설명

이 멀티 타임프레임 기하급수적 이동 평균 크로스오버 전략은 EMA 크로스오버 신호를 기반으로 하는 자동화된 거래 시스템이다. 이 전략은 다른 시간 프레임의 EMA를 활용하여 거래 신호를 생성하고 위험 관리에 대한 스톱 로스 및 영리 메커니즘을 통합한다. 이 전략은 주로 빠른 EMA와 느린 EMA, 그리고 더 높은 시간 프레임 EMA 사이의 크로스오버에 의존하여 잠재적 인 거래 기회를 식별한다.

전략 원칙

이 전략의 핵심 원칙은 시장 트렌드를 식별하고 거래 신호를 생성하기 위해 여러 시간 프레임에서 기하급수적인 이동 평균 (EMA) 을 사용하는 것입니다. 구체적으로:

  1. 9주기 EMA를 빠른 라인, 50주기 EMA를 느린 라인, 100주기 EMA를 15분 시간 프레임에서 더 높은 시간 프레임 참조로 사용합니다.

  2. 구매 신호 조건:

    • 빠른 EMA가 느린 EMA를 넘어서고 빠른 EMA가 더 높은 시간 프레임 EMA를 넘어서거나
    • 빠른 EMA는 더 높은 시간 프레임 EMA를 넘습니다.
  3. 판매 신호 조건:

    • 빠른 EMA는 느린 EMA 아래로 넘어가고 빠른 EMA는 더 높은 기간 EMA 아래로 넘어가거나
    • 빠른 EMA는 더 높은 시간 프레임 EMA 아래로 넘습니다.
  4. 무역 관리:

    • 고정된 스톱 로스 (SL) 및 취익 (TP) 수준을 설정합니다.
    • 가격이 첫 번째 취득 수준 (TP1) 에 도달하면 지점의 25%를 닫고 스톱 로스를 손익분기점으로 이동합니다.
    • 나머지 포지션은 두 번째 취득 레벨 (TP2) 또는 스톱 로스를 달성할 때까지 계속 실행됩니다.
  5. 거래 시간 제어:

    • 특정 거래시간과 거래일을 설정할 수 있습니다.

전략적 장점

  1. 다중 시간 프레임 분석: 다른 시간 프레임의 EMA를 결합하면 잘못된 신호를 줄이고 거래 품질을 향상시킵니다.

  2. 트렌드 추적: EMA의 크로스오버와 상대적 포지션을 통해 시장 트렌드를 효과적으로 포착합니다.

  3. 리스크 관리: 고정 스톱 로스 및 단계적 영업 전략, 잠재적인 손실을 제한하면서 수익을 실행 할 수 있습니다.

  4. 유연성: EMA 매개 변수, 스톱 로스 및 영업 수익 수준은 다른 시장과 거래 스타일에 맞게 조정할 수 있습니다.

  5. 자동화: 전략은 TradingView 플랫폼과 PineConnector를 사용하여 완전히 자동화 될 수 있습니다.

  6. 시간 관리: 불리한 시장 조건에서 거래를 피하기 위해 특정 거래 시간 및 날을 설정 할 수 있습니다.

전략 위험

  1. 지연: EMA는 본질적으로 지연 지표이며 변동적인 시장에서 충분히 빠르게 반응하지 않을 수 있습니다.

  2. 잘못된 신호: 유동 시장에서 EMA 크로스오버는 잘못된 신호를 자주 발생시켜 오버 트레이딩으로 이어질 수 있습니다.

  3. 고정 스톱 로스: 고정 포인트 스톱 로스를 사용하는 것은 모든 시장 조건에 적합하지 않을 수 있으며 때로는 너무 크고 너무 작을 수도 있습니다.

  4. 역사적인 데이터에 대한 의존성: 전략의 효과는 백테스팅 기간 동안 시장 행동에 크게 의존하며, 이는 미래에 다를 수 있습니다.

  5. 시장 적응력: 전략은 일부 통화 쌍에서 잘 수행되지만 다른 쌍에서는 효과적이지 않을 수 있습니다.

전략 최적화 방향

  1. 동적 매개 변수 조정: 시장 변동성에 따라 동적으로 EMA 기간, 스톱 로스 및 영업 수익 수준을 조정하는 것을 고려하십시오.

  2. 추가 필터링 조건: 무역 신호를 필터링하고 잘못된 긍정적 인 결과를 줄이기 위해 추가 기술 또는 감정 지표를 도입하십시오.

  3. 개선된 스톱 로스 전략: 시장 변동에 더 잘 적응하기 위해 트레일링 스톱 또는 ATR 기반의 동적 스톱 로스를 구현합니다.

  4. 거래 시간을 최적화: 가장 좋은 거래 시간 및 날짜를 찾기 위해 더 자세한 시간 분석을 수행하십시오.

  5. 포지션 크기의 개선: 시장 변동성과 계정 위험에 따라 포지션 크기를 조정합니다.

  6. 다화폐 상관 분석: 비슷한 시장 위험에 대한 과도한 노출을 피하기 위해 여러 화폐 쌍 사이의 상관관계를 고려하십시오.

  7. 기계 학습 통합: 매개 변수 선택 및 신호 생성 프로세스를 최적화하기 위해 기계 학습 알고리즘을 활용합니다.

결론

멀티 타임프레임 기하급수적 이동 평균 크로스오버 전략은 트렌드 추종과 리스크 관리를 결합한 자동화된 거래 시스템이다. 다른 시간 프레임에서 EMA 크로스오버 신호를 활용함으로써 전략은 시장 트렌드를 파악하고 적절한 시간에 거래를 실행하는 것을 목표로 한다. 전략은 특정 시장 조건에서 잘 수행되지만 여전히 내재된 위험과 한계를 가지고 있다. 전략의 탄력성과 적응력을 더욱 향상시키기 위해 동적 매개 변수 조정, 추가 필터링 조건 및 보다 정교한 리스크 관리 기법을 도입하는 것이 고려될 수 있다. 전반적으로, 이 전략은 양적 트레이더들에게 탄탄한 출발점을 제공하며, 개별적 필요와 시장 특성에 따라 더 이상 최적화 및 사용자 정의될 수 있다.


/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

관련

더 많은