二重移動平均クロスオーバー取引戦略に基づく


作成日: 2023-11-27 15:32:57 最終変更日: 2023-11-27 15:32:57
コピー: 1 クリック数: 616
1
フォロー
1621
フォロワー

二重移動平均クロスオーバー取引戦略に基づく

概要

この戦略は,2つの異なるパラメータセットの移動平均の交差をベースに,買入と売却の信号を発信する. 短い周期の移動平均が,下から長い周期の移動平均を突破すると,買入の信号を発信する. 短い周期の移動平均が,上から長い周期の移動平均を突破すると,売出の信号を発信する.

戦略原則

この戦略はpineスクリプト言語で記述されている.まず,入力によって,p1とp2と命名された2つの移動平均のタイプ,長さ,価格源を定義する.p1は短い周期の平均線,p2は長い周期の平均線を表す.

クロスオーバーとクロスアンダー関数で2つの均線の交差を判断する.p1が下方向からp2を突破すると,買入信号を発信する.p1が上方向からp2を突破すると,売り信号を発信する.

取引を実行するために,戦略は,strategy.entry関数を使用して,信号を発信するときに多頭または空頭ポジションを確立します.shortOnlyパラメータが有効であれば,取引のみが信号を販売します.

優位分析

この戦略の利点は以下の通りです.

  1. ルールが明確で,理解し,実行しやすい
  2. 平均線交差は古典的でよく知られている取引信号です.
  3. 高度にカスタマイズ可能な平均線の種類,長さ,価格源
  4. 取引の頻度を下げるため,取引は信号を販売するだけです

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 波動的な状況では,均線は,多重な無効交差を生じ,過剰取引を引き起こす可能性があります.
  2. 異なる品種と取引周期に対応するために最適化する必要があります.
  3. 逆勢の予兆が予想される.

平均線の長さを調整し,フィルター条件を導入するなどの方法によって無効信号を減らすことができる。また,トレンド指標と組み合わせて大盤の動きを判断することもできる。

最適化の方向

この戦略は以下の点で最適化できます.

  1. 価格源としてVolume重み平均値または典型価格を導入し,交差信号の信頼性を向上させる

  2. Validation Period を増やす 短期的なエラーの交差を回避する

  3. ATRのストップと,市場変動による最大許容される損失の設定

  4. 曲線適合最適化パラメータを使用して,最適なパラメータの組み合わせを探します.

  5. 大周期的なトレンドが一致しているときに取引シグナルを発信することを考慮する

要約する

この二均線交差戦略は全体的に理解しやすく,実現しやすく,二均線交差によって取引信号が形成され,高度にカスタマイズできる。しかし,震動的な状況でも多くの無効信号が生成される可能性がある。パラメータ最適化とルール最適化によってリスクを軽減できる.その最適化スペースは大きいので,さらなる研究に値する。

ストラテジーソースコード
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © RafaelPiccolo

//@version=4
strategy("Double MA Cross", overlay=true)

type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len1 = input(10, minval=1, title="Length 1")
src1 = input(close, "Source 1", type=input.source)

type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len2 = input(50, minval=2, title="Length 2")
src2 = input(close, "Source 2", type=input.source)

shortOnly = input(false, "Short only")

tema(src, len)=>
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    ema3 = ema(ema2, len)
    return = 3 * (ema1 - ema2) + ema3

getPoint(type, len, src)=>
    return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len)

p1 = getPoint(type1, len1, src1)
p2 = getPoint(type2, len2, src2)

shortCondition = crossunder(p1, p2)
longCondition = crossover(p1, p2)

if (shortCondition)
    strategy.entry("Short", strategy.short)

if (longCondition)
    if (shortOnly)
        strategy.close("Short")
    else
        strategy.entry("Long", strategy.long)

plot(p1, "MA 1", p1 < p2 ? color.red : color.green)
plot(p2, "MA 2", color.blue)