この戦略は,異なるパラメータ設定を持つ2つの移動平均値のクロスオーバーに基づいて購入・売却信号を生成する.短期間移動平均値が下から長い期間移動平均値を超えると,購入信号が生成される.短期間移動平均値が上から長い期間移動平均値を下に越えると,販売信号が生成される.
この戦略はパイン文字で書かれています.まず,入力を通じてタイプ,長さ,価格ソースをカスタマイズできるp1とp2という2つの移動平均値を定義します.ここでp1は短い期間のMAを表し,p2は長い期間のMAを表します.
クロスオーバーとクロスアンダー機能は,両MA間のクロスオーバーを検出するために使用されます. p1が下からp2を横切ると,購入信号が生成されます. p1が上からp2を下に横切ると,販売信号が生成されます.
取引を実行するには,戦略は信号が起動すると,strateg.entryを使用してロングまたはショートポジションに入ります. shortOnly入力が有効であれば,販売信号のみが取引されます.
この戦略の利点は以下の通りです.
この戦略にはいくつかのリスクもあります:
リスクは,MA長さを調整し,フィルター条件を追加して等減らせる.市場バイアスを決定するためにトレンドインジケーターも追加することができます.
戦略は次の側面から強化される:
クロスオーバー信号をより信頼性のあるものにするために,VWAPまたは典型的な価格を価格源として使用する.
短期間の誤差を避けるため 検証期間を追加します
市場変動に応じて最大許容可能な損失をベースに ATR ストップを組み込む.
最適な組み合わせを見つけるために曲線フィッティングによるパラメータ最適化
高い時間枠の傾向に沿った信号のみを考慮します
ダブルMAクロスオーバー戦略は,理解し実装しやすい.高度なカスタマイズ可能性を持つ2つのMAクロスオーバーから取引信号を生成する.しかし,不安定な市場中に過度に無効な信号も生成する可能性があります.さらなる研究に価値がある豊富な強化機会を持つパラメータと論理最適化によってリスクは低下することができます.
/*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)