이동 평균 추세 벡터 양적 거래 전략

SMMA MA EMA DEMA TEMA WMA VWMA HullMA LSMA ALMA SSMA TMA SL TP
생성 날짜: 2025-02-20 10:59:37 마지막으로 수정됨: 2025-02-27 17:49:25
복사: 2 클릭수: 383
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

이동 평균 추세 벡터 양적 거래 전략 이동 평균 추세 벡터 양적 거래 전략

개요

이 전략은 오픈 가격과 클로징 가격의 이동 평균 교차를 거래 신호로 사용하고 SMMA, EMA, DEMA 등과 같은 다양한 이동 평균 유형을 지원합니다. 이 전략은 고도로 구성 가능하며 다른 시장 환경과 거래 요구에 따라 변수를 최적화 할 수 있습니다.

전략 원칙

전략의 핵심은 시장의 트렌드 전환점을 확인하기 위해 오프닝 가격 이동 평균선과 오프닝 가격 이동 평균선의 교차점을 모니터링하는 것입니다. 오프닝 가격 평균선에서 오프닝 가격 평균선을 통과하면 다중 신호가 발생하며 오프닝 가격 평균선 아래 오프닝 가격 평균선을 통과하면 다중 신호가 발생합니다. 전략은 여러 시간 주기를 지원하며 위험을 관리하기 위해 스톱 스로프 기능을 제공합니다.

전략적 이점

  1. 유연한 평균선 선택: 11개의 다른 유형의 이동 평균선을 지원하고, 시장 특성에 따라 가장 적합한 평균선 유형을 선택할 수 있다.
  2. 리스크 관리: 내장된 스톱 스톱 손실 메커니즘으로 거래 당 위험을 효과적으로 제어할 수 있습니다.
  3. 다주기 적응: 분에서 달까지의 여러 시간주기를 지원하고, 매개 변수를 조정하여 주기배수를 최적화할 수 있다.
  4. 시각화 지원: 트렌드 색상 표기 기능을 제공하여 시장 움직임을 직관적으로 이해할 수 있습니다.

전략적 위험

  1. 지연 위험: 이동 평균선은 본질적으로 지연 지표이며, 격렬한 변동 시장에서 지연 신호를 일으킬 수 있다.
  2. 흔들림 시장의 위험: 가로판 흔들림 시장에서, 빈번한 교차 신호는 과도한 거래로 이어질 수 있다.
  3. 매개 변수 의존성: 전략 효과는 매개 변수 선택에 크게 의존하며, 다른 시장 환경에는 다른 매개 변수 조합이 필요할 수 있다.

전략 최적화 방향

  1. 신호 필터링: 트래픽, 변동률 등의 보조 지표를 추가하여 가짜 신호를 필터링 할 수 있다.
  2. 동적 매개 변수: 시장 상태의 동성에 따라 평균선 주기 및 유형을 조정하는 적응 매개 변수 메커니즘을 도입한다.
  3. 포지션 관리: 포지션 관리 시스템을 최적화하여 시장의 변동성과 트렌드 강도에 따라 포지션 비율을 동적으로 조정한다.

요약하다

이 전략은 여러 개의 이동하는 평평선의 교차 신호를 통해 시장 추세의 전환점을 포착하고, 강력한 구성성과 위험 관리 능력을 갖는다. 합리적인 매개 변수 최적화 및 신호 필터링을 통해 다양한 시장 환경에서 안정적인 성능을 유지할 수 있다. 전략의 성공에 핵심은 적절한 평평선 유형과 매개 변수 조합을 선택하고, 효과적인 위험 제어 장치를 구축하는 데 있다.

전략 소스 코드
/*backtest
start: 2024-08-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Open Close Cross Strategy v6", 
     overlay=true, 
     pyramiding=0, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=10,
     calc_on_every_tick=false)

// === INPUTS ===
var bool useRes = input.bool(true, "Use Alternate Resolution?")
var int intRes = input.int(3, "Multiplier for Alternate Resolution")
var string basisType = input.string("SMMA", "MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
var int basisLen = input.int(8, "MA Period", minval=1)
var int offsetSigma = input.int(6, "Offset for LSMA / Sigma for ALMA", minval=0)
var float offsetALMA = input.float(0.85, "Offset for ALMA", minval=0, step=0.01)
var bool scolor = input.bool(false, "Show coloured Bars to indicate Trend?")
var int delayOffset = input.int(0, "Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
var string tradeType = input.string("BOTH", "What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
var float slPoints = input.float(0, "Initial Stop Loss Points (zero to disable)", minval=0)
var float tpPoints = input.float(0, "Initial Target Profit Points (zero for disable)", minval=0)
var int ebar = input.int(10000, "Number of Bars for Back Testing", minval=0)
var bool dummy = input.bool(false, "- SET to ZERO for Daily or Longer Timeframes")

// Определение таймфрейма для alternate resolution
getAlternateResolution() =>
    timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes) + "M" :
         timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes) + "W" :
         timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes) + "D" :
         timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes) : "60"

stratRes = getAlternateResolution()

// === MA Functions ===
variant(type, src, len, offSig, offALMA) =>
    float result = switch type
        "EMA" => ta.ema(src, len)
        "DEMA" => 2 * ta.ema(src, len) - ta.ema(ta.ema(src, len), len)
        "TEMA" => 3 * (ta.ema(src, len) - ta.ema(ta.ema(src, len), len)) + ta.ema(ta.ema(ta.ema(src, len), len), len)
        "WMA" => ta.wma(src, len)
        "VWMA" => ta.vwma(src, len)
        "SMMA" => ta.sma(src, len)  // Упрощенная версия SMMA
        "HullMA" => ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))
        "LSMA" => ta.linreg(src, len, offSig)
        "ALMA" => ta.alma(src, len, offALMA, offSig)
        "TMA" => ta.sma(ta.sma(src, len), len)
        "SSMA" => 
            a1 = math.exp(-1.414 * math.pi / len)
            b1 = 2 * a1 * math.cos(1.414 * math.pi / len)
            c2 = b1
            c3 = -a1 * a1
            c1 = 1 - c2 - c3
            c1 * (src + nz(src[1])) / 2 + c2 * nz(ta.sma(src, len)[1]) + c3 * nz(ta.sma(src, len)[2])
        => ta.sma(src, len)

// === Series Setup ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)

// Get Alternate resolution Series
closeSeriesAlt = useRes ? request.security(syminfo.tickerid, stratRes, closeSeries, barmerge.gaps_off, barmerge.lookahead_on) : closeSeries
openSeriesAlt = useRes ? request.security(syminfo.tickerid, stratRes, openSeries, barmerge.gaps_off, barmerge.lookahead_on) : openSeries

// === Plotting ===
color trendColor = closeSeriesAlt > openSeriesAlt ? color.green : color.red
color barColor = closeSeries > openSeriesAlt ? color.new(color.lime, 0) : color.new(color.red, 0)

// Перемещаем barcolor в глобальную область видимости
barcolor(scolor ? barColor : na)

var closePlot = plot(closeSeriesAlt, "Close Series", trendColor, 2, plot.style_line)
var openPlot = plot(openSeriesAlt, "Open Series", trendColor, 2, plot.style_line)
fill(closePlot, openPlot, color=trendColor)

// === Trade Conditions ===
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong
shortCond = xshort

// === Strategy Logic ===
float tp = tpPoints > 0 ? tpPoints : na
float sl = slPoints > 0 ? slPoints : na

var int lastPositionType = 0  // 1 для long, -1 для short, 0 для нет позиции

if ebar == 0 or (timenow - time) / (timeframe.multiplier * 60000) <= ebar and tradeType != "NONE"
    // Закрытие позиций
    if lastPositionType == 1 and shortCond
        strategy.close("long")
        lastPositionType := 0
        label.new(bar_index, high, "Exit Long", color=color.red, style=label.style_label_down, textcolor=color.white)
    
    if lastPositionType == -1 and longCond
        strategy.close("short")
        lastPositionType := 0
        label.new(bar_index, low, "Exit Short", color=color.green, style=label.style_label_up, textcolor=color.white)
    
    // Открытие новых позиций
    if longCond and tradeType != "SHORT" and lastPositionType == 0
        strategy.entry("long", strategy.long)
        lastPositionType := 1
        label.new(bar_index, low, "Long", color=color.green, style=label.style_label_up, textcolor=color.white)
    
    if shortCond and tradeType != "LONG" and lastPositionType == 0
        strategy.entry("short", strategy.short)
        lastPositionType := -1
        label.new(bar_index, high, "Short", color=color.red, style=label.style_label_down, textcolor=color.white)
    
    // Take Profit и Stop Loss
    if lastPositionType != 0
        strategy.exit("TP/SL", profit=tp, loss=sl)