브레이크아웃 및 주파수 필터링(롱만 해당)을 기반으로 한 트렌드 추종 전략

EMA AO
생성 날짜: 2024-05-28 14:00:24 마지막으로 수정됨: 2024-05-28 14:00:24
복사: 0 클릭수: 501
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

브레이크아웃 및 주파수 필터링(롱만 해당)을 기반으로 한 트렌드 추종 전략

개요

이 전략은 파격과 주파수 필터링을 기반으로 한 트렌드 추적 전략으로, 다중 거래만 수행한다. 전략의 주요 아이디어는 EMA 지표를 사용하여 현재 트렌드 방향을 판단하고, 가격이 특정 범위 내의 최고 가격을 돌파 할 때 다중 신호를 생성하며, 주파수 필터를 사용하여 거래 주파수를 제어하여 너무 자주 포지션을 열지 않도록 한다. 전략은 또한 위험을 제어하기 위해 스톱포드를 설정하고, 트렌드가 끝날 때 평평한다.

전략 원칙

  1. 현재 트렌드 방향을 판단하기 위해 EMA 지표를 계산한다. EMA 상위에서 종결할 때, 현재 트렌드가 다면적이라고 생각한다.
  2. 특정 범위 내의 최고 가격을 계산하여, 돌파 조건으로. 상쇄 가격이 가장 짧은 회귀 기간 또는 가장 긴 회귀 기간 내의 최고 가격을 돌파하고, 현재 트렌드는 다목적일 때, 다중 신호를 생성한다.
  3. 주파수 필터를 도입하여 상장 개시의 최소 간격을 제어하여 거래 주파수가 너무 높지 않도록 한다.
  4. 스톱로스를 설정하고, 스톱로스 가격보다 낮은 가격에 포지션을 해제하고, 위험을 통제한다.
  5. 트렌드 종료 신호를 정의합니다. 종식 가격이 EMA를 넘어지면 트렌드가 종료되었다고 생각하며, 이 시점에 더 많은 주문을 보유하면 평점입니다.

전략적 이점

  1. 트렌드 추적: EMA 지표를 통해 트렌드 방향을 판단하고, 트렌드에 따라 거래하여 전략 수익을 높이는 데 도움이 됩니다.
  2. 브레이크 확인: 가격 브레이크를 입시 신호로 사용하여 트렌드 초기에 적시에 입시하여 더 많은 수익 공간을 잡을 수 있습니다.
  3. 주파수 제어: 주파수 필터를 도입하여 연속적으로 포지션을 열 수 있는 시간 간격을 제어하고, 너무 자주 거래하는 것을 피하고, 거래 비용과 위험을 줄인다.
  4. 스톱 로즈 보호: 가격 역변동이 일정 규모에 도달했을 때 스톱 로즈를 설정하여 하향 위험을 효과적으로 제어한다.
  5. 동적 평소: 트렌드 종료 신호에 따라 동적 평소, 이미 얻은 수익을 적시에 고정하고, 트렌드 반전의 손실을 피할 수 있다.

전략적 위험

  1. 매개 변수 민감성: 정책의 성능은 매개 변수 선택에 민감하며, 다른 매개 변수 설정은 정책 성능에 큰 차이를 초래할 수 있다. 매개 변수를 충분히 재검토하고 최적화해야 한다.
  2. 파격 실패: 가격 파격은 트렌드가 계속될 것을 보장하지 않으며, 파격 실패가 발생할 수 있으며, 전략이 연속적으로 손실을 초래할 수 있습니다.
  3. 트렌드 식별: 전략은 EMA 지표 판단 트렌드에 의존하지만, EMA 지표가 지연되거나 잘못된 판단이 발생할 경우 전략의 정확성에 영향을 미칩니다.
  4. 자주 거래: 전략이 주파수 필터를 도입했음에도 불구하고, 시장의 변동이 큰 경우, 거래 비용을 증가시키는 빈번한 입금 및 청산이 발생할 수 있습니다.
  5. 스톱 로즈 위험: 스톱 로즈의 설정은 전략의 최대 회수를 완전히 피할 수 없으며, 극단적인 상황에서는 여전히 큰 손실이 발생할 수 있다.

전략 최적화 방향

  1. 변수 최적화: 전략의 핵심 변수인 EMA 길이, 회귀 기간 길이, 스톱 손실 비율 등을 최적화하여 전략의 안정성과 수익성을 높이기 위해 최적의 변수 조합을 찾습니다.
  2. 신호 필터링 (Signal Filtering): 돌파 신호가 발생한 후, 신호에 대한 2차 확인을 위해 다른 기술 지표 또는 조건을 도입할 수 있으며, 신호 품질을 향상시키고, 오판과 가짜 신호를 줄일 수 있다.
  3. 트렌드 판단: 다른 트렌드 판단 지표인 MACD, DMI 등을 사용하거나 여러 지표가 함께 트렌드를 판단하여 트렌드 식별의 정확성을 향상시킬 수 있습니다.
  4. 동적 스톱: 시장의 변동에 따라 동적으로 스톱 포인트를 조정합니다. 예를 들어, ATR 지표를 사용하여 동적 스톱 가격을 계산하거나, 추적 스톱 전략을 도입하여 위험을 더 잘 제어합니다.
  5. 포지션 관리: 포지션 관리 전략을 최적화하고, 시장의 변동과 계좌 자금 상황에 따라 포지션 크기를 동적으로 조정하고, 단일 거래의 위험 틈새를 제어하고, 자금 사용 효율을 향상시킵니다.

요약하다

이 전략은 브레이크와 주파수 필터링을 기반으로 한 트렌드 추적 전략으로, EMA 지표를 통해 트렌드 방향을 판단하고, 가격 돌파구를 입시 신호로 사용하며, 주파수 필터를 도입하여 거래 주파수를 제어하고, 스톱 리스크를 설정합니다. 전략의 장점은 트렌드 추적, 브레이크 확인, 주파수 제어, 스톱 리스 보호 및 동적 평점입니다. 그러나 또한 파라미터 민감성, 브레이크 실패, 트렌드 식별, 빈번한 거래 및 스톱 리스크와 같은 잠재적인 위험이 있습니다.

전략 소스 코드
/*backtest
start: 2023-05-22 00:00:00
end: 2024-05-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trend Following with Breakout and Frequency Filter (Long Only)", overlay=true)

// 输入参数
emaLength = input.int(50, title="EMA长度")
lookbackPeriodMin = input.int(80, title="最短回溯期")
lookbackPeriodMax = input.int(120, title="最长回溯期")
stopLossPct = input.float(2, title="止损百分比") / 100  // 止损百分比
minHoldBars = input.int(10, title="最小持仓K线数量")  // 最小持仓K线数量

// 计算EMA
ema = ta.ema(close, emaLength)

// 计算最高价和最低价
highestHigh = ta.highest(high, lookbackPeriodMax)
lowestLow = ta.lowest(low, lookbackPeriodMax)

// 定义趋势方向
isBullish = close > ema

// 定义突破信号
breakoutCondition = (ta.crossover(close, highestHigh[lookbackPeriodMin]) or ta.crossover(close, highestHigh[lookbackPeriodMax])) and isBullish

// 计算止损点
stopLossLevelLong = close * (1 - stopLossPct)

// 绘制EMA
plot(ema, title="EMA", color=color.blue)

// 记录上次开仓时间
var float lastEntryTime = na

// 策略执行并标注信号
if (breakoutCondition and (na(lastEntryTime) or (time - lastEntryTime) > minHoldBars * timeframe.multiplier))
    strategy.entry("做多", strategy.long)
    label.new(bar_index, high, text="买入", style=label.style_label_up, color=color.green, textcolor=color.white)
    strategy.exit("止损", from_entry="做多", stop=stopLossLevelLong)
    lastEntryTime := time

// 定义趋势结束信号
exitCondition = close < ema

if (exitCondition and (strategy.position_size > 0) and (time - lastEntryTime) > minHoldBars * timeframe.multiplier)
    strategy.close("做多")
    label.new(bar_index, low, text="卖出", style=label.style_label_down, color=color.red, textcolor=color.white)