この戦略は,異なるパラメータ設定を持つ2つの移動平均値を計算し,そのクロスオーバー状況を比較することで,トレンドを運用するために,価格傾向の方向性を決定する. 急速移動平均が下からゆっくり移動平均を突破すると,それは上昇信号として判断される. 急速移動平均が上からゆっくり移動平均を突破すると,それは下降信号として判断される. この戦略はパラメータを調整することによって,異なるサイクルのトレンドの判断を達成することができます.
この戦略では,異なるパラメータ設定を持つ移動平均値の2セットを比較するために使用する.最初の移動平均値パラメータは len1と type1で設定され,第2の移動平均値パラメータは len2と type2で設定される.ここで len1と len2はそれぞれ2つの移動平均値のサイクルの長さを表現し, type1と type2は移動平均値のアルゴリズム型を表す.
快速移動平均がスロー移動平均を横切ってゴールデンクロスを形成すると,それは上昇信号として判断されます. 快速移動平均がスロー移動平均を下回って死十字を形成すると,それは下落信号として判断されます.
クロスオーバー信号の方向に応じて,ロングまたはショートポジションが実行されます. ブライッシュ信号がトリガーされた場合,needlongパラメータが真であれば,デフォルト_qty_valueまたは%_of_equityの量でロングポジションが開かれます.ベアシグナルがトリガーされた場合,needshortパラメータが真であれば,デフォルト_qty_valueまたは%_of_equityの量でショートポジションが開かれます.
移動平均値は遅延特性があり,価格逆転点を逃す可能性があります.
解決策: 移動平均周期を適切に短縮するか,他の指標と併用するか
波動性が高く,反転が頻繁な市場には適さない
解決策: 振動市場での取引を避けるためにフィルタリング条件を追加
誤った信号の危険性がある
解決策: 信号の信頼性を向上させるため,他のフィルタリング指標を組み合わせに追加します.
この戦略は,2つの移動平均値のクロスオーバーを比較して価格傾向を判断し,傾向を把握し利益を得るために対応する長期・短期操作を行う.利点としては,信号規則がシンプルで明確で,パラメータは調整可能であり,適用性が強力で,さまざまな市場環境に最適化・調整可能である.シグナル品質を改善するためにフィルタリングのための他の指標を追加することで軽減できる移動平均値と不安定な市場の遅れリスクを防ぐことに注意してください.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title = "Noro's MAs Cross Tests v1.0", shorttitle = "MAs Cross tests 1.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 0) needlong = input(true, "long") needshort = input(true, "short") len2 = input(15, defval = 15, minval = 2, maxval = 1000, title = "Fast MA length") type2 = input(1, defval = 1, minval = 1, maxval = 7, title = "Fast MA Type") src2 = input(close, defval = close, title = "Fast MA Source") len1 = input(30, defval = 30, minval = 2, maxval = 1000, title = "Slow MA length") type1 = input(1, defval = 1, minval = 1, maxval = 7, title = "Slow MA Type") src1 = input(close, defval = close, title = "Slow MA Source") col = input(false, defval = false, title = "Color of bar") o = input(false, title = "1 SMA, 2 EMA, 3 VWMA, 4 DEMA, 5 TEMA, 6 KAMA, 7 Price Channel") //DEMA 1 dema1 = 2 * ema(src1, len1) - ema(ema(close, len1), len1) //TEMA 1 xEMA1 = ema(src1, len1) xEMA2 = ema(xEMA1, len1) xEMA3 = ema(xEMA2, len1) tema1 = 3 * xEMA1 - 3 * xEMA2 + xEMA3 //KAMA 1 xvnoise = abs(src1 - src1[1]) nfastend = 0.20 nslowend = 0.05 nsignal = abs(src1 - src1[len1]) nnoise = sum(xvnoise, len1) nefratio = iff(nnoise != 0, nsignal / nnoise, 0) nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) kama1 = nz(kama1[1]) + nsmooth * (src1 - nz(kama1[1])) //PriceChannel 1 lasthigh1 = highest(src1, len1) lastlow1 = lowest(src1, len1) center1 = (lasthigh1 + lastlow1) / 2 //DEMA 2 dema2 = 2 * ema(src2, len2) - ema(ema(close, len2), len2) //TEMA 2 xEMA12 = ema(src2, len2) xEMA22 = ema(xEMA12, len2) xEMA32 = ema(xEMA22, len2) tema2 = 3 * xEMA12 - 3 * xEMA22 + xEMA32 //KAMA 2 xvnoise2 = abs(src2 - src2[1]) nfastend2 = 0.20 nslowend2 = 0.05 nsignal2 = abs(src2 - src2[len2]) nnoise2 = sum(xvnoise2, len2) nefratio2 = iff(nnoise2 != 0, nsignal2 / nnoise2, 0) nsmooth2 = pow(nefratio2 * (nfastend2 - nslowend2) + nslowend2, 2) kama2 = nz(kama2[1]) + nsmooth2 * (src2 - nz(kama2[1])) //PriceChannel 2 lasthigh2 = highest(src2, len2) lastlow2 = lowest(src2, len2) center2 = (lasthigh2 + lastlow2) / 2 //MAs ma1 = type1 == 1 ? sma(src1, len1) : type1 == 2 ? ema(src1, len1) : type1 == 3 ? vwma(src1, len1) : type1 == 4 ? dema1 : type1 == 5 ? tema1 : type1 == 6 ? kama1 : type1 == 7 ? center1 : 0 ma2 = type2 == 1 ? sma(src2, len2) : type2 == 2 ? ema(src2, len2) : type2 == 3 ? vwma(src2, len2) : type2 == 4 ? dema2 : type2 == 5 ? tema2 : type2 == 6 ? kama2 : type2 == 7 ? center2 : 0 plot(ma1, color = blue, linewidth = 3, transp = 0) plot(ma2, color = red, linewidth = 3, transp = 0) //Signals trend = ma2 > ma1 ? 1 : ma2 < ma1 ? -1 : trend[1] up = trend == 1 and ((close < open and close[1] < open[1]) or col == false) dn = trend == -1 and ((close > open and close[1] > open[1]) or col == false) if up strategy.entry("Long", strategy.long, needlong == false ? 0 : na) if dn strategy.entry("Short", strategy.short, needshort == false ? 0 : na)