피보나치 확장과 결합된 다중 EMA 교차를 사용한 추세 추종 전략

EMA
생성 날짜: 2024-07-29 16:42:56 마지막으로 수정됨: 2024-07-29 16:42:56
복사: 0 클릭수: 547
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

피보나치 확장과 결합된 다중 EMA 교차를 사용한 추세 추종 전략

개요

이 전략은 다중 지수 이동 평균 ((EMA) 의 교차와 피보나치 팽창 수준을 결합한 트렌드 추적 시스템이다. 이 전략은 잠재적인 트렌드 시작과 끝을 식별하기 위해 다른 주기의 EMA 간의 상호 작용을 이용하며, 수익 목표를 결정하기 위해 피보나치 팽창 수준을 사용합니다. 이 전략에는 위험을 관리하고 수익을 보호하기 위해 구체적인 중지 규칙이 포함되어 있습니다.

전략 원칙

이 전략의 핵심은 트렌드의 시작과 끝을 잡기 위해 여러 시간 프레임의 EMA를 횡단하는 것입니다. 구체적으로, 5주기, 10주기 및 30주기 EMA를 사용합니다. 전략은 4개의 다른 입문 조건을 포함하고 있으며, 각 조건은 다른 시장 상황을 잡기 위해 고안되었습니다.

  1. 가격이 30주기 EMA에 도달하거나 그보다 낮아지고, 그 다음에는 그 위에 닫히고, 동시에 10주기 EMA가 5주기 EMA보다 높고, 30주기 EMA가 5주기 EMA보다 1% 낮아지면 첫 번째 입시 조건을 유발한다.

  2. 5주기 EMA에 30주기 EMA를 뚫고 있고, 지난 6개의 K선 안에 30주기 EMA가 5주기 EMA를 뚫고 있을 때, 두 번째 입시 조건을 유발한다.

  3. 현재 두 개의 K 라인의 최고 가격은 각각 5 주기 EMA보다 낮고, 5 주기 EMA는 10 주기 EMA보다 낮고, 10 주기 EMA는 30 주기 EMA보다 낮으며, 또한 전 K 라인의 최고 가격은 현재 종결 가격보다 낮으면, 세 번째 입시 조건을 유발한다.

  4. 10주기 EMA에 30주기 EMA를 뚫고 있고, 지난 4개의 K선 안에 5주기 EMA가 30주기 EMA를 뚫고 있었고, 10주기 EMA와 5주기 EMA의 현재 값이 그 이전의 값보다 높았을 때, 네 번째 입시 조건을 유발한다.

스톱로즈의 경우, 전략은 다양한 입시 조건에 대한 특정 규칙을 설정합니다:

  • 첫 번째 조건에 대해, 30주기 EMA에 10주기 EMA를 다면 평점이다.
  • 다른 조건의 경우, 종전 가격이 상위 3개의 K선에서 가장 낮은 지점으로 떨어지면 평점이다.

이윤 목표는 0.618, 0.786, 1.0 및 1.618 레벨을 포함한 피보나치 확장 수준에 따라 설정됩니다. 가격이 이러한 수준에 도달하면 전략은 특정 규칙에 따라 평형됩니다.

또한, 전략에는 이익 잠금 조건이 포함되어 있습니다. 최근 두 개의 K 선의 최저가 5주기 EMA보다 높고, EMA가 상승 배열을 나타낸다면 ((5 > 10 > 30) 는 흑자를 잠금하기 위해 평점한다.

전략적 이점

  1. 다중 확인: 다중 EMA와 다중 입시 조건을 사용하여 전략이 트렌드의 시작과 지속을 더 정확하게 식별 할 수 있습니다. 이러한 다중 확인 메커니즘은 가짜 신호를 줄이고 거래의 정확성을 향상시킬 수 있습니다.

  2. 적응력: 4개의 다른 입시 조건으로 전략은 다양한 시장 환경에 적응할 수 있고, 빠른 돌파구 또는 느린 추세 형성에서 거래 기회를 잡을 수 있습니다.

  3. 위험 관리: 전략에는 특정 중지 손실 규칙이 포함되어 있으며, 이는 각 거래의 위험을 제어하는 데 도움이됩니다. 다른 입시 조건은 다른 중지 손실 전략에 대응하며, 전략은 위험 관리에 대한 중요성을 나타냅니다.

  4. 수익 목표가 명확하다: 피보나치 팽창 수준을 수익 목표로 사용하여 거래자에게 명확한 탈퇴 지점을 제공합니다. 이것은 조기 수익을 얻거나 너무 오래 유지하는 것을 피하는 데 도움이됩니다.

  5. 이윤 보호: 이윤 잠금 조건은 트렌드가 역전될 때 이미 얻은 이윤을 보호하는 데 도움이 되며, 이는 많은 트렌드 추적 전략이 무시하는 중요한 측면이다.

  6. 기술 지표 결합: 전략은 EMA와 피보나치 도구를 결합하여 두 가지 인기있는 기술 분석 도구의 장점을 활용합니다.

전략적 위험

  1. 과도한 거래: 여러 입시 조건이 과도한 거래로 이어질 수 있으며, 특히 변동성이 높은 시장에서는 거래 비용을 증가시킬 수 있으며 더 많은 가짜 신호로 이어질 수 있습니다.

  2. 파라미터 민감성: 전략은 여러 개의 고정된 EMA 주기 및 퍼센트 하락값을 사용한다. 이러한 파라미터는 다른 시장과 시간 프레임에 따라 조정해야 할 수도 있고, 그렇지 않으면 전략의 부적절한 성능을 초래할 수 있다.

  3. 트렌드 의존성: 트렌드 추적 전략으로서, 상반기 또는 흔들리는 시장에서 좋지 않을 수 있다. 이러한 시장 환경에서는, 반복적으로 잘못된 신호와 작은 손실이 발생할 수 있다.

  4. 뒤떨어진: EMA는 본질적으로 뒤떨어진 지표입니다. 빠르게 변화하는 시장에서 전략은 트렌드의 전환점을 제 시간에 잡을 수 없습니다.

  5. 복잡성: 전략의 여러 조건과 규칙이 복잡성을 증가시키며, 이는 전략의 이해와 유지보수를 어렵게 만들 수 있으며, 과도한 적합성의 위험을 증가시킨다.

전략 최적화 방향

  1. 동적 변수 조정: 시장의 변동성에 따라 동적으로 EMA 주기를 조정하는 적응 메커니즘을 도입하는 것을 고려할 수 있습니다. 이것은 다양한 시장 환경에서 전략의 적응력을 향상시킬 수 있습니다.

  2. 거래량 지표를 추가: 거래량 분석을 결합하여 입출장 결정의 정확성을 향상시킬 수 있습니다. 예를 들어, 입출장 시 거래량을 증가시켜 트렌드의 강도를 확인 할 수 있습니다.

  3. 시장 환경 필터링: 시장 환경 식별 메커니즘을 도입하여, 예를 들어 ATR (Average True Rate) 또는 변동률 지표를 사용하여, 트렌드 추적에 적합하지 않은 시장 환경에서 거래를 중지하십시오.

  4. 최적화된 스톱로스 메커니즘: 고정된 스톱로스 대신 추적 스톱로스를 사용하는 것을 고려할 수 있다. 이것은 이윤을 보호하면서 이윤이 계속 성장할 수 있다.

  5. 시간 필터: 특정 시간대에 거래하는 것을 제한하고, 변동성이 높거나 유동성이 낮은 시간대를 피하여 전략의 안정성을 높일 수 있습니다.

  6. 기계 학습을 도입: 기계 학습 알고리즘을 사용하여 매개 변수 선택 및 입학 결정을 최적화하여 전략의 적응성과 성능을 향상시킬 수 있습니다.

  7. 다중 시간 프레임 분석: 더 긴 시간 프레임의 트렌드 분석과 결합하여, 진출 결정의 정확성을 높여 주류 트렌드가 역전될 경우 진출을 피할 수 있다.

요약하다

이 다중 EMA 횡단 트렌드 추적 전략은 피보나치 팽창을 결합하여 여러 기술 지표와 거래 개념을 결합한 포괄적인 거래 시스템을 보여줍니다. 여러 EMA와 입시 조건을 사용하여 전략은 트렌드를 포착하고 가짜 신호를 줄이는 사이에 균형을 맞추려고합니다. 피보나치 팽창 수준을 사용하는 것은 수익 목표를 설정하는 데 객관적인 기반을 제공하며, 구체적인 중지 손실 및 수익 잠금 규칙은 위험 관리에 대한 중요성을 나타냅니다.

전략이 여러 가지 확인과 적응성의 장점을 가지고 있음에도 불구하고, 그것의 복잡성과 파라미터 선택에 대한 민감성 또한 약간의 도전을 가져옵니다. 전략의 안정성과 성능을 더욱 향상시키기 위해, 동적 파라미터 조정, 시장 환경 필터링 및 다중 시간 프레임 분석과 같은 최적화 방향을 도입하는 것이 고려 될 수 있습니다.

전체적으로, 이 전략은 트렌드 추적을 위한 흥미로운 프레임 워크를 제공하지만, 실제 적용 시 거래자는 충분한 피드백과 변수 최적화를 수행하고, 특정 시장과 거래 스타일에 따라 적절한 조정을 수행해야 합니다. 지속적인 모니터링과 최적화를 통해, 이 전략은 효과적인 트렌드 추적 도구가 될 잠재력을 가지고 있습니다.

전략 소스 코드
/*backtest
start: 2024-06-01 00:00:00
end: 2024-06-30 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Combined Strategy with Specific Stop Loss", overlay=true)

// Define the EMAs
ema30 = ta.ema(close, 30)
ema10 = ta.ema(close, 10)
ema5 = ta.ema(close, 5)

// Define the conditions for opening an order
open_condition1 = low <= ema30 and close > ema30  and ema10 > ema5 and ema30 * 1.01 < ema5
open_condition2 = ta.crossover(ema5, ema30) and (ta.crossover(ema30[1], ema5[1]) or ta.crossover(ema30[2], ema5[2]) or ta.crossover(ema30[3], ema5[3]) or ta.crossover(ema30[4], ema5[4])  or ta.crossover(ema30[5], ema5[5]) or ta.crossover(ema30[6], ema5[6]) )
open_condition3 = high[2] < ema5[2] and high[1] < ema5[1] and ema5 < ema10 and ema10 < ema30 and high[1] < close 
open_condition4 = ta.crossover(ema10, ema30) and (ta.crossover(ema5[0], ema30[0]) or ta.crossover(ema5[1], ema30[1]) or ta.crossover(ema10[2], ema30[2]) or ta.crossover(ema10[3], ema30[3])) and ema10[1] < ema10 and ema5[1] <ema5

// Calculate the lowest low of the previous two bars
lowest_low_prev_two_bars = ta.lowest(low, 3)

// Track the entry price and the lowest low of the previous two bars for open_condition3
var float entry_price = na
var float low_entry_price = na
var float entry_lowest_low1 = na
var float entry_lowest_low2 = na
var float entry_lowest_low3 = na
var float entry_lowest_low4 = na

var bool order1 = false
var bool order2 = false
var bool order3 = false
var bool order4 = false
// Fibonacci extension levels based on the last significant swing
var float fib_extension_level_0_618 = na
var float fib_extension_level_0_786 = na
var float fib_extension_level_1 = na
var float fib_extension_level_1_618 = na

    // Calculate Fibonacci extension levels
var float swing_low = na
var float swing_high = na
// Here we assume the latest swing low and swing high, adjust based on your logic
swing_low := ta.lowest(low, 20)
swing_high := ta.highest(high, 20)

// Open a long order when any of the conditions are met
if open_condition1 and not order2 and not order1 and not order3 and not order4
    strategy.entry("Long", strategy.long, comment="<ema30")
    entry_lowest_low1 := lowest_low_prev_two_bars
    low_entry_price := low
    fib_extension_level_0_618 := low_entry_price + (swing_high - swing_low) * 0.618
    fib_extension_level_0_786:= low_entry_price + (swing_high - swing_low) * 0.786
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1.618
    entry_price := close
    order1 := true
if open_condition2 and not order2 and not order1 and not order3 and not order4
    strategy.entry("Long", strategy.long, comment="ema5xema30")
    entry_lowest_low2 := lowest_low_prev_two_bars
    low_entry_price := low
    fib_extension_level_0_618 := low_entry_price + (swing_high - swing_low) * 0.618
    fib_extension_level_0_786:= low_entry_price + (swing_high - swing_low) * 0.786
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1.618
    entry_price := close
    order2 := true

if open_condition3 and not order2 and not order1 and not order3 and not order4
    strategy.entry("Long", strategy.long, comment="high<ema5")
    entry_price := close
    low_entry_price := low
    entry_lowest_low3 := lowest_low_prev_two_bars
    fib_extension_level_0_618 := low_entry_price + (swing_high - swing_low) * 0.618
    fib_extension_level_0_786:= low_entry_price + (swing_high - swing_low) * 0.786
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1.618
    order3 := true

if open_condition4 and not order2 and not order1 and not order3 and not order4
    strategy.entry("Long", strategy.long, comment="high<ema5444")
    entry_price := close
    low_entry_price := low
    entry_lowest_low4 := lowest_low_prev_two_bars
    fib_extension_level_0_618 := low_entry_price + (swing_high - swing_low) * 0.618
    fib_extension_level_0_786:= low_entry_price + (swing_high - swing_low) * 0.786
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1
    fib_extension_level_1:= low_entry_price + (swing_high - swing_low) * 1.618
    order4 := true




// Set a stop loss only if the order was opened with the specified conditions
if (not na(entry_price))
    if order1
        if ta.crossover(ema30,ema10)
            strategy.close("Long", comment="stop loss1" )
            entry_price := na
            order1 := false
            low_entry_price := na


    if order2
        if close < entry_lowest_low2
            strategy.close("Long", comment="stop loss2" )
            entry_price := na
            order2 := false
            low_entry_price := na

    if order3
        if close < entry_lowest_low3
            strategy.close("Long", comment="stop loss3" )
            entry_price := na
            order3 := false
            low_entry_price := na

    if order4
        if close < entry_lowest_low4
            strategy.close("Long", comment="stop loss4" )
            entry_price := na
            order4 := false
            low_entry_price := na


    if   low[1] > ema5[1] and low > ema5  and ema5 > ema10 and ema10 > ema30 
        strategy.close("Long", comment="profit low > ema5")
        entry_price := na
        order1 := false
        order2 := false
        order3 := false
        order4 := false
        low_entry_price := na

    // Take profit at Fibonacci extension levels
    if high >= fib_extension_level_0_618 and close <= fib_extension_level_0_618
        strategy.close("Long", comment="at 0.618 Fib")
        entry_price := na
        order1 := false
        order2 := false
        order3 := false
        order4 := false
        low_entry_price := na

    if  high >= fib_extension_level_0_786 and close < fib_extension_level_0_786
        strategy.close("Long", comment="at 0.786 Fib")
        entry_price := na
        order1 := false
        order2 := false
        order3 := false
        order4 := false
        low_entry_price := na

    if  high >= fib_extension_level_1 and close < fib_extension_level_1
        strategy.close("Long", comment="at 1 Fib")
        entry_price := na
        order1 := false
        order2 := false
        order3 := false
        order4 := false
        low_entry_price := na
    if  high >= fib_extension_level_1_618
        strategy.close("Long", comment="at 1 Fib")
        entry_price := na
        order1 := false
        order2 := false
        order3 := false
        order4 := false
        low_entry_price := na


// Plot the EMAs for visual reference
plot(ema30, color=color.blue, title="EMA 30")
plot(ema10, color=color.orange, title="EMA 10")
plot(ema5, color=color.red, title="EMA 5")