この戦略は,移動平均クロスオーバーとモメント指標を組み合わせて,効果的にトレンドを追跡し,逆転させる.まずは,黄金クロスロング信号と死亡クロスショート信号を生成するために,高速および遅い移動平均を使用する.その後,特定のパラメータのモメント指標を使用して,黄金クロス後に高速MAのモメントが再び上昇した場合,トレンドは継続され,ロングポジションは維持されると考えられる.モメントが低下すると,トレンド逆転とみなされ,既存のポジションは閉鎖される.同じ論理はトレンド逆転を追跡する際に死亡クロスショート信号に適用される. ADXフィルターは,トレンド状態でないときに間違った信号を避けるためにも使用される.
この戦略の基本論理は,MAクロスオーバーからのトレンド信号と,モメント指標からのトレンド逆転信号に基づいています.主な部分は以下の通りです.
急速なMA価格1 (5期HMA) と遅いMA価格2 (7期HMA) を計算する.
価格1が価格2を上回る黄金十字は長信号を生成する.価格1が価格2を下回る死十字は短信号を生成する.これはMAsの一般的な使用である.
ロング・シグナルの後,価格のモメンタム roc1 が再び上昇すると,トレンドが継続すると考えられ,ロング・ポジションは維持されます.
モメント roc1 が低下すると,トレンド逆転とされ,既存のポジションは閉鎖されます.同じ論理はショート信号に適用されます.
ADX 限界値を導入して,トレンド状態でないときに誤った信号を避ける. ADX 限界値を超えるとのみ信号が生成される.
シンプルなMA戦略と比較して,この戦略の最大の利点は,傾向の逆転をより迅速かつ正確に判断するためのモメント指標の導入である.
MA自体は価格変化に遅れをとり,モメントインジケーターは迅速に逆転信号をキャプチャし,タイムリーストップ・ロースや逆転取引を行うことができます.
トレンド取引中に不要なオープン/閉鎖オーダーを避けるため,モメントに基づく逆転信号はより信頼性があります.
ADXは,トレンドのない市場で間違った信号を避けるため,戦略はより高い確率を持つトレンドに焦点を当てています.
アルゴ取引の初心者にも適しています
異なる市場向けに MA 期間,モメント パラメーター等を調整することで,大きな最適化余地があります.
この戦略の主なリスクは以下のものです.
MAの遅延性により,信号が遅れて,最良のエントリーポイントが欠けている.
不必要な入力や出口を 引き起こした偽のブレイクアウト パラメータのさらなる最適化や追加のフィルタが必要です
トレンド逆転の検出は 動力に依存し 巨大な市場変動時に揺らぐことがあります
ADXはトレンドと統合を検出するのに不十分です. 誤った
取引コストは考慮されません.実際の取引で適切なストップロスを設定する必要があります.
この戦略は,次の側面においてさらに最適化することができる.
他の種類のMAを試すか,よりよい滑らかな効果のためにMAパラメータを調整する.
価格逆転を捉えるためのより高い感度のためにインパクトインジケーターの長さを最適化します.
短期の変動に惑わされないように 動きが逆転するときに価格フィルターを設定します
異なる ADX レベルで異なるパラメータを使用して ADX の利用を向上させる.
音量指標を導入して信号の質を向上させ 誤ったブレイクをフィルタリングします
単一の取引損失を制御するためのストップ損失メカニズムを追加します.適切な利益目標とストップ損失を設定するために現実的な取引コストを評価します.
この戦略は,トレンドを追跡し,逆転を捉えるためにMAとモメンタムインジケーターの利点を組み合わせている.純粋なトレンドフォロー戦略と比較して,トレンドクライマックスからの損失を回避し,トレンドトレードを維持しながら,異なる市場段階に対処するのにより柔軟である.パラメータ最適化と補助条件の導入によりさらなる改善が可能である.全体的に言えば,この戦略は明確でシンプルな論理を有し,アルゴトレード初心者が学び,適用するのに非常に適している.
/*backtest start: 2023-09-23 00:00:00 end: 2023-10-23 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //study(title="MA Crossover Strategy", overlay = true) strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true) src = input(open, title="Source") price = request.security(syminfo.tickerid, timeframe.period, src) ma1 = input(5, title="1st MA Length") type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"]) ma2 = input(7, title="2nd MA Length") type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"]) adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") adxthreshold = input(20, title="ADX threshold") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) //study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="") //plot(sig, color=color.red, title="ADX") f_hma(_src, _length)=> _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length))) price1 = if (type1 == "SMA") sma(price, ma1) else if (type1 == "EMA") ema(price, ma1) else f_hma(price, ma1) price2 = if (type2 == "SMA") sma(price, ma2) else if (type2 == "EMA") ema(price, ma2) else f_hma(price, ma2) //plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0) plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0) plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0) //longCondition = price1> price2 longCondition = price1> price2 and sig > adxthreshold if (longCondition) strategy.entry("Long", strategy.long) shortCondition = price1 < price2 and sig > adxthreshold if (shortCondition) strategy.entry("Short", strategy.short) lookback1 = input(1, "Lookback 1") roc1 = roc(price1, lookback1) ma1up = false ma1down = false ma2up = false ma2down = false ma1up := nz(ma1up[1]) ma1down := nz(ma1down[1]) ma2up := nz(ma2up[1]) ma2down := nz(ma2down[1]) trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01 if crossover(roc1, trendStrength1) ma1up := true ma1down := false if crossunder(roc1, -trendStrength1) ma1up := false ma1down := true shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold if (shortexitCondition) strategy.close("Short") longexitCondition = ma1down and ma1up[1] and sig > adxthreshold if (longexitCondition) strategy.close("Long")