EMA 기반 거래 전략


생성 날짜: 2023-11-24 15:46:48 마지막으로 수정됨: 2023-11-24 15:46:48
복사: 0 클릭수: 847
avatar of ChaoZhang ChaoZhang
1
집중하다
1237
수행원

EMA 기반 거래 전략

개요

이 전략은 4개의 서로 다른 주기의 EMA 평균선을 사용하며, 그 배열 순서에 따라 거래 신호를 형성하며, 트래픽 라이트와 유사한 빨간색, 노란색, 초록색 3가지 표시등을 사용한다. 따라서 ?? 트래픽 라이트 거래 전략 ?? 이라고 명명되었다. 그것은 트렌드와 반전 양쪽 관점에서 시장을 종합적으로 판단하여 거래 의사결정의 정확성을 높이기 위해 고안되었다.

전략 원칙

  1. 빠른 선 ((8주기), 중간 선 ((14주기), 느린 선 ((16주기) 3개의 EMA 평균선을 설정하고, 긴 선 ((100주기) 1개의 EMA 평균선을 필터로 추가한다.

  2. 빠른 중간 느린 3 평균 선의 배열 순서와 필터와의 교차 상황을 판단하여 과잉과 공백의 시간을 결정합니다:

  • 빠른 선에서 중간 선 또는 중간 선에서 느린 선을 통과 할 때, 다중 신호로 판단

  • 중선 아래에서 단선을 통과하면 평도 신호로 판단한다.

  • 빠른 선 아래 중간 선 또는 중간 선 아래 느린 선을 통과할 때, 공백 신호로 판단

  • 중선에서 단선을 통과할 때, 평평한 신호로 판단

  1. 빠른 중 느린 3 평행선의 순서로 트렌드 방향과 강도를 판단하고, 평행선과 필터의 교차 판단 반전점을 결합하여 트렌드 추적과 반전 캡처의 유기적 결합을 구현한다.

우위 분석

이 전략은 트렌드 추적과 반전 거래의 장점을 통합하여 시장 기회를 더 잘 잡을 수 있습니다. 주요 장점은 다음과 같습니다:

  1. 다중 EMA 평균선을 사용해서 판단력이 강해져 잘못된 신호가 줄어들었습니다.
  2. 유연한 설정으로 더 많은 공백 조건을 설정하여 거래 기회를 놓치지 않도록하십시오.
  3. 3자리 사용 길고 짧은 주기 평균선, 판단력 포괄
  4. 사용자 정의 할 수 있는 차단 중지 조건, 위험 제어 위치

매개 변수를 최적화하여, 이 전략은 더 많은 품종에 적응할 수 있으며, 재검토에서 더 높은 수익성과 안정성을 보여준다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 다중 그룹 EMA의 평균 선순서가 혼동되면 판단의 어려움이 증가하고 거래의 의심이 발생합니다.
  2. 시장의 비정상적인 변동을 효과적으로 필터링할 수 없는 가짜 신호, 큰 변동이 있을 경우 손실을 초래할 수 있는 신호
  3. 매개 변수 설정이 부적절한 경우, 스톱스트로드 조건이 너무 완만하거나 엄격하게 설정되어 손실된 이익이나 과도한 손실이 발생할 수 있습니다.

변수 최적화, 스톱로스 레벨 설정, 신중한 운영 등의 방법으로 전략 안정성을 더욱 높이고 위험을 제어하는 것이 좋습니다.

최적화 방향

이 전략의 주요 최적화 방향은 다음과 같습니다.

  1. 더 많은 품종을 위해 EMA 평균의 주기 변수를 조정합니다.
  2. MACD, 브린 밴드 등과 같은 다른 지표 필터를 추가하여 판단의 정확도를 높여줍니다.
  3. 위험과 이익의 최적화된 균형에 대한 스톱-스트로드 비율 최적화
  4. ATR 상쇄와 같은 적응적 상쇄 메커니즘을 추가하여 하향 위험을 더욱 제어합니다.

다방면의 변수 조정과 위험 제어 수단의 도입을 통해 전략의 안정성과 수익성을 지속적으로 향상시킬 수 있습니다.

요약하다

이 교통 신호 거래 전략은 트렌드 추적과 역전 판단을 통합하고, 4 개의 EMA 그룹을 사용하여 거래 신호를 형성합니다. 매개 변수를 최적화하여 더 많은 품종에 적합하며, 재검토에서 강력한 수익성을 보여줍니다. 추가 위험 제어 및 다원화 지표의 도입을 통해 안정적이고 효율적인 양적 거래 전략이 될 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-01-01 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
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/
// © maxits

// 4HS Crypto Market Strategy
// This strategy uses 4 ema to get Long or Short Signals
// Length are: 8, 14, 16, 100
// We take long positions when the order of the emas is the following:
// green > yellow > red (As the color of Traffic Lights) and they are above white ema (Used as a filter for long positions)
  
// We take short positions when the order of the emas is the following:
// green < yellow < red (As the color of inverse Traffic Lights) and they are below white ema (Used as a filter for short positions)

//@version=4
strategy(title="Trafic Lights Strategy",
         shorttitle="TLS",
         overlay=true,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0
         )

// User Inputs
// i_time         = input(defval = timestamp("28 May 2017 13:30 +0000"), title = "Start Time", type = input.time) //Starting time for Backtesting

sep1           = input(title="============ System Conditions ============", type=input.bool, defval=false)

enable_Long    = input(true, title="Enable Long Positions")   // Enable long  Positions
enable_Short   = input(true, title="Enable Short Positions") // Enable short Positions

sep2           = input(title="============ Indicator Parameters ============", type=input.bool, defval=false)

f_length       = input(title="Fast EMA Length",   type=input.integer, defval=8,   minval=1) 
m_length       = input(title="Medium EMA Length", type=input.integer, defval=14,   minval=1) 
s_length       = input(title="Slow EMA Length",   type=input.integer, defval=16,  minval=1) 
filter_L       = input(title="EMA Filter",        type=input.integer, defval=100, minval=1) 
filterRes      = input(title="Filter Resolution", type=input.resolution, defval="D")        // ema Filter Time Frame

sep3           = input(title="============LONG Profit-Loss Parameters============", type=input.bool, defval=false)

e_Long_TP      = input(true, title="Enable a Profit Level?")
e_Long_SL      = input(false, title="Enable a S.Loss Level?")
e_Long_TS      = input(true, title="Enable a Trailing Stop?")           
long_TP_Input  = input(40.0,   title='Take Profit %',   type=input.float,   minval=0)/100
long_SL_Input  = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100 
atrLongMultip  = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)   // Parameters to calculate Trailing Stop Loss
atrLongLength  = input(14,    title='ATR Length',      type=input.integer, minval=1)

sep4           = input(title="============SHORT Profit-Loss Parameters============", type=input.bool, defval=false)

e_Short_TP     = input(true, title="Enable a Profit Level?")
e_Short_SL     = input(false, title="Enable a S.Loss Level?")
e_Short_TS     = input(true, title="Enable a Trailing Stop?")
short_TP_Input = input(30.0,   title='Take Profit %',   type=input.float,   minval=0)/100
short_SL_Input = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100
atrShortMultip = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)
atrShortLength = input(14,    title='ATR Length',      type=input.integer, minval=1)

// Indicators

fema   = ema(close, f_length)
mema   = ema(close, m_length)
sema   = ema(close, s_length)
filter = security(syminfo.tickerid, filterRes, ema(close, filter_L))

plot(fema,   title="Fast EMA",   color=color.new(color.green,  0))
plot(mema,   title="Medi EMA",   color=color.new(color.yellow, 0))
plot(sema,   title="Slow EMA",   color=color.new(color.red,    0))
plot(filter, title="EMA Filter", color=color.new(color.white,  0))

// Entry Conditions

longTrade  = strategy.position_size >  0
shortTrade = strategy.position_size <  0
notInTrade = strategy.position_size == 0
inTrade    = strategy.position_size != 0
priceEntry = strategy.position_avg_price

goLong  = fema > mema and mema > sema and fema > filter and  enable_Long  and (crossover (fema, mema) or crossover (mema, sema) or crossover (sema, filter))
goShort = fema < mema and mema < sema and fema < filter and  enable_Short and (crossunder (fema, mema) or crossunder (mema, sema) or crossunder (sema, filter))

close_L = crossunder(fema, mema)
close_S = crossover (fema, mema)

// Profit and Loss conditions

// Long
 
long_TP = priceEntry * (1 + long_TP_Input)  // Long Position Take Profit Calculation
long_SL = priceEntry * (1 - long_SL_Input)  // Long Position Stop Loss Calculation
atrLong = atr(atrLongLength)                // Long Position ATR Calculation
long_TS = low - atrLong * atrLongMultip

long_T_stop  = 0.0                          // Code for calculating Long Positions Trailing Stop Loss/
long_T_stop := if (longTrade)
    longStop = long_TS
    max(long_T_stop[1], longStop)
else 
    0
    
//Short

short_TP = priceEntry * (1 - short_TP_Input) // Long  Position Take Profit Calculation
short_SL = priceEntry * (1 + short_SL_Input) // Short Position Stop Loss Calculation
atrShort = atr(atrShortLength)               // Short Position ATR Calculation
short_TS = high + atrShort * atrShortMultip

short_T_stop   = 0.0                // Code for calculating Short Positions Trailing Stop Loss/
short_T_stop  := if shortTrade
    shortStop  = short_TS
    min(short_T_stop[1], shortStop)
else 
    9999999

// Strategy Long Entry

if goLong and notInTrade 
    strategy.entry("Go Long", long=strategy.long, comment="Go Long", alert_message="Open Long Position")

if longTrade and close_L
    strategy.close("Go Long", when=close_L, comment="Close Long", alert_message="Close Long Position")
    
if e_Long_TP    // Algorithm for Enabled Long Position Profit Loss Parameters
    if (e_Long_TS and not e_Long_SL)
        strategy.exit("Long TP & TS", "Go Long", limit = long_TP, stop = long_T_stop)
    else
        if (e_Long_SL and not e_Long_TS)
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP)
else
    if not e_Long_TP 
        if (e_Long_TS and not e_Long_SL)
            strategy.exit("Long TP & TS", "Go Long", stop = long_T_stop)
        else
            if (e_Long_SL and not e_Long_TS)
                strategy.exit("Long TP & TS", "Go Long",stop = long_SL)
    

// Strategy Short Entry

if goShort and notInTrade 
    strategy.entry("Go Short", long=strategy.short, comment="Go Short", alert_message="Open Short Position")

if shortTrade and close_S
    strategy.close("Go Short", comment="Close Short", alert_message="Close Short Position")

if e_Short_TP   // Algorithm for Enabled Short Position Profit Loss Parameters
    if (e_Short_TS and not e_Short_SL)
        strategy.exit("Short TP & TS", "Go Short", limit = short_TP, stop = short_T_stop)
    else
        if (e_Short_SL and not e_Short_TS)
            strategy.exit("Short TP & SL", "Go Short",limit = short_TP, stop = short_SL)
        else 
            strategy.exit("Short TP & TS", "Go Short",limit = short_TP)
else
    if not e_Short_TP 
        if (e_Short_TS and not e_Short_SL)
            strategy.exit("Short TS", "Go Short", stop = short_T_stop)
        else
            if (e_Short_SL and not e_Short_TS)
                strategy.exit("Short SL", "Go Short",stop = short_SL)

// Long  Position Profit and Loss Plotting

plot(longTrade and e_Long_TP  and long_TP                          ? long_TP      : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_SL  and long_SL and not e_Long_TS        ? long_SL      : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_TS  and long_T_stop and not e_Long_SL    ? long_T_stop  : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)

// Short Position Profit and Loss Plotting

plot(shortTrade and e_Short_TP and short_TP                        ? short_TP     : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_SL and short_SL and not e_Short_TS     ? short_SL     : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_TS and short_T_stop and not e_Short_SL ? short_T_stop : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)