この戦略は基本的に移動平均のクロス戦略である.価格の移動平均を計算し,特定の短期および長期移動平均を設定することによって,短期移動平均が長期移動平均を下から越えるときに長引く.短期移動平均が長期移動平均を下から越えるときに短引く.
価格移動平均交差戦略の核心理念は,価格の移動平均は価格変化の傾向を効果的に反映することができる.この戦略は,異なるサイクルの2つの移動平均と特定の取引論理を設定して取引信号を生成することによって市場の傾向の変化を判断する.
ストラテジーは,長期移動平均と短期移動平均を計算する.ロングラインは主に主要なトレンドを判断し,ショートラインは主要なトレンドの間に中期変動を捕捉するために使用される.戦略の取引信号は主にロングライン上のショートラインの交差から来る:ショートラインがロングラインの上を横切るときのロング信号,ショートラインが下を横切るときのショート信号.さらに,戦略は偽信号を避けるためにシグナルをフィルタリングする.
この戦略は,SMA,EMA,VWMAなど7種類の異なる移動平均を使用しています.ユーザーは移動平均の種類を選択できます.移動平均の長さも柔軟に設定できます.また,戦略は特定の取引時間期間やポジション管理メカニズムにも制限を提供します.これらの設定を通じて,ユーザーはさまざまな種類と市場環境に適応するために戦略のパラメータを柔軟に調整できます.
価格移動平均のクロス戦略の主な利点は以下の通りである.
戦略の論理は 明確でシンプルで 分かりやすく 実行可能で 初心者向けに適しています
戦略の原則は堅牢で,完全に検証された移動平均取引のルールに基づいています.
戦略のパラメータは柔軟で調整可能で,利用者は市場での判断と好みに合わせて適切なパラメータを選択できます.
この戦略には,負けるオーダーの保持時間を短縮し,不要なリバースポジションを防ぐための一定のリスク管理メカニズムがあります.
この戦略には複数の種類の移動平均値が含まれています.ユーザーは,取引品種に最も適した移動平均値を選択できます.
この戦略は,主要な休日市場における異常変動を避けるために,特定の取引時間間に取引論理を有効にするのを支持します.
価格移動平均のクロス戦略には多くの利点があるが,実際の取引には依然としていくつかのリスクがあり,これらは主に次の2つの側面に反映される.
ほとんどの移動平均値の遅延により,価格逆転が完了した後の後期にクロスシグナルが現れ,簡単に罠にかかりやすい.
パラメータの設定が正しくない場合,クロスシグナルが頻繁すぎるため,取引活動が高すぎたり,取引コストが上昇したりすることがあります.
上記のリスクに対応して,以下の方法で制御と対処方法を実施します.
適切なストップ損失範囲を設定することによって単一の損失のリスクを制御する.
フィルター条件を追加することで取引頻度を減らし,過剰取引を防ぐ.例えば,価格チャネルまたは価格変動範囲の条件を設定する.
移動平均のパラメータを最適化し,独自の取引品種とサイクルに最適なパラメータの組み合わせを選択します.異なる市場条件下で戦略の安定性をテストします.
この価格移動平均のクロスオーバー戦略のさらなる最適化にはまだ余地があります.
極端な市場状況下で保護メカニズムを強化します.例えば,異常な市場状況を避けるために,激しい価格変動の際に取引を一時停止します.
信号の品質と安定性を向上させるために,より多くのフィルター条件と組み合わせられた取引信号を増やす.例えば,他の技術指標と組み合わせたトレンドクロスオーバーを特定する.
ダイナミックパラメータシステムを採用する.市場状況や品種の特徴に応じて,固定値を使用するのではなく,移動平均長,取引スイッチなどのキーパラメータを自動的に調整する.
複合多様性仲介のような高度な戦略でこの移動平均クロスオーバー信号を適用します. 深い戦略最適化のために他の情報と組み合わせます.
上記の提案は,この戦略の適用環境と有効性を拡大し,より良いリスク/報酬のバランスを達成することができます.
この記事では,シンプルな移動平均クロスオーバー戦略 - Noro
/*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"}] */ //Noro //2019 //@version=4 strategy(title = "Noro's CrossMA", shorttitle = "CrossMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 0, commission_value = 0.1) needlong = input(true, "long") needshort = input(true, "short") lotsize = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %") type = input(defval = "SMA", options = ["SMA", "EMA", "VWMA", "DEMA", "TEMA", "KAMA", "PCMA"], title = "MA type") src = input(close, defval = close, title = "MA Source") len = input(30, defval = 30, minval = 1, title = "MA length") off = input(00, defval = 00, minval = 0, title = "MA offset") anti = input(true, defval = true, title = "Anti-saw filter") showma = input(true, defval = true, title = "Show MA") showbg = input(false, defval = false, title = "Show background") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //DEMA dema = 2 * ema(src, len) - ema(ema(close, len), len) //TEMA xPrice = close xEMA1 = ema(src, len) xEMA2 = ema(xEMA1, len) xEMA3 = ema(xEMA2, len) tema = 3 * xEMA1 - 3 * xEMA2 + xEMA3 //KAMA xvnoise = abs(src - src[1]) nfastend = 0.20 nslowend = 0.05 nsignal = abs(src - src[len]) nnoise = sum(xvnoise, len) nefratio = iff(nnoise != 0, nsignal / nnoise, 0) nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) kama = 0.0 kama := nz(kama[1]) + nsmooth * (src - nz(kama[1])) //PriceChannel lasthigh = highest(src, len) lastlow = lowest(src, len) center = (lasthigh + lastlow) / 2 sma_1 = sma(src, len) ema_1 = ema(src, len) vwma_1 = vwma(src, len) ma2 = type == "SMA" ? sma_1 : type == "EMA" ? ema_1 : type == "VWMA" ? vwma_1 : type == "DEMA" ? dema : type == "TEMA" ? tema : type == "KAMA" ? kama : type == "PCMA" ? center : 0 ma = ma2[off] macol = showma ? color.blue : na plot(ma, color = macol, linewidth = 3, transp = 0) //Background trend = 0 trend := anti == false and close > ma ? 1 : anti == false and close < ma ? -1 : low > ma ? 1 : high < ma ? -1 : trend[1] bgcol = showbg ? trend == 1 ? color.lime : trend == -1 ? color.red : na : na bgcolor(bgcol, transp = 70) //Trading size = strategy.position_size truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59) lot = 0.0 lot := size != size[1] ? strategy.equity / close * lotsize / 100 : lot[1] if trend == 1 and trend[1] == -1 strategy.entry("Long", strategy.long, lot, when = needlong and truetime) if trend == -1 and trend[1] == 1 strategy.entry("Short", strategy.short, lot, when = needshort and truetime) if size > 0 and needshort == false and trend == -1 strategy.close_all() if size < 0 and needlong == false and trend == 1 strategy.close_all() if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short")