Els Instant Trend Line 전략


생성 날짜: 2023-12-20 16:51:05 마지막으로 수정됨: 2023-12-20 16:51:05
복사: 0 클릭수: 938
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

Els Instant Trend Line 전략

개요

엘러스의 즉각적인 트렌드 라인 전략은 존 엘러스가 그의 책상 주식과 선물에 대한 제어 분석 에서 제시했다. 이 전략은 기술 지표를 사용하여 주식이나 선물의 즉각적인 트렌드를 식별하고 트렌드가 역전되면 포지션을 열는다.

전략 원칙

이 전략의 핵심은 즉각적인 트렌드 라인을 계산하는 것입니다. IT 라인의 계산 공식은 다음과 같습니다.

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

여기서 src는 가격을 나타내고, a는 평준화 인자이며, 기본값은 0.07이다. 이 공식은 가격을 평준화하고 트렌드를 생성할 수 있는 2단 필터이다.

또 다른 중요한 지표는 지연선 ((lag)) 이며, 계산 공식은 다음과 같다:

lag = 2.0 * it - nz(it[2])

이 선은 IT 선의 한 주기 뒤떨어진다. 가격이 상단에서 뒤떨어지면, 트렌드가 반전되어 더 많은 것을 얻는다. 가격이 하단에서 뒤떨어지면, 트렌드가 반전되어 더 많은 것을 얻는다.

이 전략은 또한 위험을 통제하기 위해 스톱로스 유닛을 설정합니다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 트렌드를 파악하는 IT 와이어를 사용하여 시장 소음을 효과적으로 필터링하여 신호 품질을 향상시킵니다.
  2. 2단 필터를 적용, 파라미터 최적화 공간이 넓고 조정성이 높다
  3. 트렌드 중 반복적으로 마이너스를 피하기 위해 트레이드 신호를 생성하기 위해 뒤떨어진 라인을 결합합니다.
  4. 스톱 손실 단위 리스크를 설정하여 스톱 손실 비율을 미리 설정할 수 있습니다.
  5. 코드 구조는 명확하고 이해하기 쉽고 수정하기 쉽습니다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. IT 라인 및 지연 라인 파라미터를 잘못 설정하면 잘못된 신호가 발생할 수 있습니다.
  2. 스톱포인트 설정이 잘못되면 너무 일찍 또는 너무 많이 스톱포인트 할 수 있습니다.
  3. 거래 빈도가 높을 수 있으며 거래 비용이 수익에 영향을 미칠 수 있습니다.
  4. 집중 포지션 보유 기간이 너무 길면 수익률에 영향을 미칠 수 있다.

이러한 위험은 다음과 같은 방법으로 줄일 수 있습니다.

  1. 기계 학습 알고리즘 최적화 파라미터를 적용
  2. 자율적 정지 지점을 설정
  3. 포지션 개시 수를 적절히 조정하고 거래 빈도를 낮추는 것
  4. 포지션 주기 중지 설정

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 다른 필터 변수의 결과에 대한 영향을 테스트하고 최적의 변수를 찾습니다.
  2. 다른 지표와 결합하여 거래 신호를 필터링하여 신호 품질을 향상 시키십시오.
  3. 포지션 개시 논리를 최적화하여 트렌드 가속화 시 포지션을 늘립니다.
  4. 시장의 변동에 따라 스톱포드를 조정하는 적응형 스톱포드 전략을 설정합니다.
  5. 거래 시간 및 주기적으로 결과에 영향을 미치는 시간 순서 분석을 수행합니다.

결론적으로

전반적으로, 엘러스의 순간 트렌드 라인 전략은 기술 지표를 사용하여 주식 / 선물의 실시간 트렌드를 식별하고 트렌드가 역전되면 입장을 열습니다. 효과적인 잡음 필터링, 높은 매개 변수 조정성, 명확한 신호 생성 논리 및 내장 된 위험 제어와 같은 장점이 있습니다. 매개 변수 선택, 필터링, 포지션 규모 및 스톱 리조팅을 추가로 최적화하여 이 전략은 더 나은 성능을 얻을 수 있습니다. 명확한 코드 구조는 또한 이해하기 쉽고 수정 할 수 있습니다.

전략 소스 코드
/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()