BreakHigh EMA 크로스오버 전략

저자:차오장, 날짜: 2024-03-29 14:39:27
태그:

img

전반적인 설명

브레이크하이 EMA 크로스오버 전략 (BreakHigh EMA Crossover Strategy) 은 가격 브레이크오버와 기하급수적 이동평균 (EMA) 크로스오버를 기반으로 하는 거래 전략이다. 이 전략은 특정 기간 내 가장 높은 가격을 구매 신호로, EMA를 판매 신호로 사용합니다. 종료 가격이 지정 기간 내 가장 높은 가격 이상으로 떨어지면 전략은 구매 신호를 생성합니다. 종료 가격이 EMA 이하로 떨어지면 전략은 판매 신호를 생성합니다. 전략은 또한 위험을 제어하기 위해 스톱-로스 가격을 설정합니다. 또한 전략은 사용자가 다양한 거래 스타일과 시장 조건에 적응하도록 사용자 정의 할 수있는 여러 매개 변수를 제공합니다.

전략 원칙

브레이크하이 EMA 크로스오버 전략의 핵심 원칙은 가격 브레이크오버와 EMA 크로스오버를 사용하여 시장 트렌드를 포착하는 것입니다. 가격이 지정된 기간 내에 가장 높은 가격 이상으로 넘어지면 시장이 상승 추세에 들어갈 수 있음을 나타냅니다. 따라서 전략은 구매 신호를 생성합니다. 동시에 EMA는 트렌드를 따르는 지표로 작용합니다. 가격이 EMA 이하로 떨어지면 상승 추세가 끝날 수 있음을 나타냅니다. 따라서 전략은 판매 신호를 생성합니다.

이 전략은 거래를 구현하기 위해 다음 단계를 사용합니다.

  1. 정해진 기간 내에 가장 높은 가격을 브레이크아웃 구매 가격으로 계산합니다.
  2. 판매 신호로 EMA를 계산합니다.
  3. 닫기 가격이 파기 구매 가격보다 높을 때, 현재 포지션이 없다면 전략은 구매 신호를 생성합니다.
  4. 닫기 가격이 EMA 이하로 떨어지면, 현재 위치가 있다면, 전략은 판매 신호를 생성합니다.
  5. 정해진 기간 내에 가장 낮은 가격을 스톱 로스 가격으로 계산합니다.
  6. 만약 가격이 스톱 로스 가격 이하로 떨어지면 전략은 즉시 포지션을 닫습니다.

위의 단계를 통해 전략은 시장의 상승 추세에서 이익을 얻을 수 있으며, 다운사이드 위험을 제어하기 위해 스톱 로스를 사용할 수 있습니다.

전략적 장점

BreakHigh EMA 크로스오버 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 트렌드 추적: 이 전략은 시장 트렌드를 파악하기 위해 가격 브레이크오브와 EMA 크로스오버를 사용하며 상승 추세에서 이익을 얻을 수 있습니다.
  2. 리스크 제어: 전략은 하향 리스크를 제어하기 위해 스톱 로스 가격을 사용하며, 이는 전략의 최대 유출을 효과적으로 줄일 수 있습니다.
  3. 매개 변수 유연성: 전략은 사용자가 사용자 정의 할 수있는 여러 매개 변수를 제공합니다. 기간, 위험 비율, 스톱 로스를 사용 여부 등, 다른 거래 스타일과 시장 조건에 따라 조정 할 수 있습니다.
  4. 단순하고 효과적: 전략 논리는 간단하고 명확하고, 이해하기 쉽고 실행하기 쉽고, 트렌딩 시장에서 좋은 수익을 얻을 수 있습니다.

전략 위험

BreakHigh EMA 크로스오버 전략은 몇 가지 장점을 가지고 있지만 다음과 같은 위험도 가지고 있습니다.

  1. 시장 변동성 위험: 시장 변동성이 높은 경우 전략은 더 많은 잘못된 신호를 생성하여 빈번한 거래 및 자본 손실로 이어질 수 있습니다.
  2. 트렌드 역전 위험: 시장 트렌드가 역전되면 전략은 판매를 지연시킬 수 있으며, 이로 인해 수익이 감소하거나 수익을 손실로 바꿀 수 있습니다.
  3. 위험 설정 매개 변수: 전략의 성과는 기간, 위험 비율 등 매개 변수 설정에 달려 있습니다. 매개 변수가 잘못 설정되면 전략의 성과가 떨어질 수 있습니다.

이러한 위험을 완화하기 위해 다음과 같은 조치를 고려할 수 있습니다.

  1. 매개 변수를 적절히 조정합니다. 다른 시장 조건과 거래 도구에 따라 잘못된 신호와 빈번한 거래를 줄이기 위해 기간을 늘리고 위험 비율을 줄이는 것과 같은 전략 매개 변수를 적절히 조정하십시오.
  2. 다른 지표와 결합: 트렌드 및 신호의 유효성을 확인하고 전략의 신뢰성을 향상시키기 위해 RSI, MACD 등과 같은 다른 기술적 지표와 결합합니다.
  3. 합리적인 스톱 로스를 설정하십시오: 합리적인 스톱 로스 가격을 설정하여 하락 위험을 제어하고 너무 일찍 손실을 멈추지 않도록하여 수익 기회를 놓칠 수 있습니다.

전략 최적화 방향

BreakHigh EMA 크로스오버 전략의 성과를 더 향상시키기 위해 다음 최적화 방향은 고려할 수 있습니다.

  1. 동적 매개 변수 조정: 시장 변동성 및 트렌드 강도에 따라 전략 매개 변수를 동적으로 조정합니다. 예를 들어 변동성이 높을 때 기간을 늘리고, 트렌드가 강할 때 위험 비율을 늘리는 등 다양한 시장 조건에 적응합니다.
  2. 긴 짧은 메커니즘을 도입: 원래의 긴 거래를 바탕으로 하락 추세에서도 이익을 얻기 위해 짧은 거래 메커니즘을 도입하여 전략의 적응력과 수익성을 향상시킵니다.
  3. 스톱 로스 및 테이크프로피스를 최적화: 스톱 로스 및 테이크프로피스 설정, 예를 들어 후속 스톱 로스, 부분 테이크프로피스 등을 사용하여 리스크를 더 잘 제어하고 수익을 차단하는 것을 최적화하십시오.
  4. 근본 분석과 결합: 근본 분석과 기술적 분석을 결합합니다. 예를 들어 기업 수익 보고서와 경제 데이터 발표와 같은 중요한 사건 전과 이후에 전략의 위치와 매개 변수를 조정하여 가능한 시장 변화에 대처하십시오.

위의 최적화 조치는 BreakHigh EMA 크로스오버 전략의 안정성, 적응력 및 수익성을 향상시켜 더 많은 시장 환경에서 좋은 성과를 낼 수 있습니다.

요약

브레이크하이 EMA 크로스오버 전략 (BreakHigh EMA Crossover Strategy) 은 가격 브레이크오버와 EMA 크로스오버를 사용하여 하락 리스크를 제어하는 동시에 스톱 로스를 사용하여 시장 트렌드를 포착하는 간단하고 효과적인 트렌드 추적 전략이다. 전략 논리는 명확하고 매개 변수는 유연하며 이해하기 쉽고 구현하기 쉽습니다. 전략에는 시장 변동성 위험, 트렌드 역전 위험 및 매개 변수 설정 위험과 같은 특정 위험이 있지만, 이러한 위험은 매개 변수 조정, 다른 매개 변수와 결합하고 합리적인 스톱 로스를 설정하는 것과 같은 적절한 리스크 제어 조치를 통해 완화 할 수 있습니다. 또한 전략은 동적 매개 변수 조정, 긴 단 손실 메커니즘을 도입, 스톱 및 취리 수익을 최적화하고 전략의 성과 적응성을 향상시키기 위해 근본 분석과 결합하여 더 많은 최적화 공간을 갖추고 있습니다. 브레이크하이 EMA 크로스오버 전략은 양적 인 전략이며 전반적으로 평가할 가치가 있습니다.


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version = 5
strategy(title="BreakHigh Strategy", overlay=true)
Period = input.int(34, "Number of previous bars(34,52 Recommend)")
showbg = input(defval = false,title = "Show BackGround Color")
showema = input(defval = true ,title = "Show Line")
MarkBuySig = input(defval = true ,title = "Show Buy/Sell Signal")

Risk_Per_Trade = input(2.5, '% of Risk Per Trade') / 100  // Risk% Per Trade Switch
SLDAY = input(title='Lowest price of the previous number of bars', defval=9)
Buysig = input(defval=true, title='Start Strategy')
UseSl = input(defval=false, title='Use Stoploss Price')
Compound = input(defval = false ,title =  "Compound Profit")
xtf = input.timeframe(title='** Fix chart to which time frame ? **)', defval='D')


//BUY
float buyLine = na
buyLine := ta.highest(high,Period)[1] 
plot(showema ? buyLine : na, linewidth=1, style=plot.style_linebr, color=color.new(color.green, 0))

//SELL
output = ta.ema(close, Period)
show = request.security(syminfo.tickerid, xtf, output)
FastL = plot(showema ? show : na, color=color.new(color.white, 0), linewidth=2, title='Slow EMA')

//Buy-Sell Signal
Green = close > buyLine   // Buy
Red = close < show // Sell

buycond = Green and Green[1] == 0
sellcond = Red and Red[1] == 0

bullish = ta.barssince(buycond) < ta.barssince(sellcond)
bearish = ta.barssince(sellcond) < ta.barssince(buycond)

buy = bearish[1] and buycond
sell = bullish[1] and sellcond

plotshape(MarkBuySig ? buy : na, style=shape.labelup, text='Buy Next Bar', textcolor=color.new(color.black, 0), location=location.belowbar, color=color.new(color.green, 0))
plotshape(MarkBuySig ? sell : na, style=shape.labeldown, text='Sell Next Bar', textcolor=color.new(color.black, 0), location=location.abovebar, color=color.new(color.red, 0))
bgcolor(showbg ? bullish ? color.new(color.green,90) : color.new(color.red,90) : na )


// === BACKTEST RANGE === //
use_date_range = input(true)
FromYear = input.int(defval=2012, title='From Year', minval=1950)
FromMonth = input.int(defval=1, title='From Month', minval=1)
FromDay = input.int(defval=1, title='From Day', minval=1)
ToYear = input.int(defval=9999, title='To Year', minval=1950)
ToMonth = input.int(defval=1, title='To Month', minval=1)
ToDay = input.int(defval=1, title='To Day', minval=1)
in_date_range = use_date_range ? time > timestamp(FromYear, FromMonth, FromDay, 00, 00) and time < timestamp(ToYear, ToMonth, ToDay, 23, 59) : true

//****************************************************************************//

//////////////////////////////////////////////
//    define strategy entry / exit          //
//////////////////////////////////////////////

//****************************************************************************//
// LONG CONDITIONS

Select_Long_Condition_1 = close > buyLine // Buy when Have Signal
Open_Long_Condition = Select_Long_Condition_1 and strategy.opentrades == 0

//****************************************************************************//
// STOP LOSS Price

float longSL = na
longSL := Open_Long_Condition ? ta.lowest(low, SLDAY)[1] : longSL[1]  


//****************************************************************************//
// Cal StopLoss

Long_Entry_Price = close
Diff_OPEN_to_SL = math.abs(Long_Entry_Price - longSL)

// Exit CONDITIONS

Exit_Long_Condition = close < show // Sell when Have Signal

//****************************************************************************//
// POSITION SIZE CAP

strategy.initial_capital = 50000

float portSize = Compound ? strategy.netprofit + strategy.initial_capital : strategy.initial_capital
float LossAmoutUnit = portSize * Risk_Per_Trade //50
float PercentSL = ( Diff_OPEN_to_SL / Long_Entry_Price ) * 100
float PositionSize = LossAmoutUnit / Diff_OPEN_to_SL


//****************************************************************************//
// ENTRY/EXIT

if Buysig
    if Open_Long_Condition and in_date_range 
        strategy.entry('LONG', strategy.long, qty=PositionSize)


if Exit_Long_Condition and in_date_range
    strategy.close('LONG')
if close < longSL and UseSl
    strategy.close('LONG')

//****************************************************************************//
// PLOT STOP LOSS

longPlotSL = strategy.opentrades > 0 and strategy.position_size > 0 ? longSL : na
// label.new(bar_index, high, text=str.tostring(longPlotSL),color=color.white, textcolor=color.black)
plot(longPlotSL, title="", linewidth=2, style=plot.style_linebr, color=color.new(color.red, 0))



//****************************************************************************//



더 많은