移動平均トレンドベクトル定量取引戦略

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
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)