
この戦略は,移動平均線交差と運動量指標を融合させ,トレンドを効果的に追跡し,時効的に逆転する.戦略は,まず,高速移動平均線と遅い移動平均線を使用して金叉多し,死叉空し信号を形成する.その後,一定のパラメータの運動量指標を組み合わせて,金叉多し,高速移動平均線上の運動量指標が再び上昇した場合,トレンドを継続し,多しを維持する.
この戦略の核心的な論理は,移動平均の交差によって形成されたトレンドシグナルと,トレンドの逆転を判定する動量指標に基づいています. 鍵となる部分のコード論理は次のとおりです.
速動平均 price1と遅動平均 price2を計算する. price1は5周期HMA, price2は7周期HMAである.
価格1が価格2を突破すると多信号が生成され,価格1が価格2を突破すると空白信号が生成されます.これは移動平均に基づいた常用法です.
多数信号が触発された後,もし速動平均値1の動量指標roc1が再び上昇した場合は,トレンドが継続して多数状態を保持していると考えられます.
動量指数roc1が下がると,トレンドが逆転すると考え,平仓を実行する。空調信号の処理ロジックは同じ。
ADXの値を導入し,非トレンド状態の誤信号をフィルタリングするために使用し,ADXが値より高い場合にのみ実際の多空信号が生成される.
単純な移動平均策略と比較して,この策略の最大の利点は,動量指標を導入してトレンドの逆転を判断し,より迅速かつ正確にトレンドと逆転を追跡できるということです.具体的利点は以下のとおりです:
移動平均は価格の変化に遅れて反応するので,動量指標は反転信号をより早く捉え,タイミングでストップ損失または反転開札に有利である.
動態指標に基づく反転信号はより信頼性が高く,トレンド取引における不必要な繰り返し平衡を減らすことができます.
ADX指標の適用は,非トレンド市場での誤信号を回避し,戦略をトレンド段階により集中させ,利益の確率を向上させる.
戦略の論理は明確でシンプルで,簡単に理解し,追跡でき,アルゴリズム取引の初心者向けに適しています.
指数パラメータの最適化スペースは広く,移動平均周期,動量パラメータなどの調整によって異なる市場向けに最適化が可能である.
この戦略の主なリスクは以下の通りです.
移動平均は,価格の変化に反応し遅れているため,信号が遅れて最適な入場時間を逃す可能性があります.
偽の突破は不必要な開行または平行状態を引き起こし,指標パラメータをさらに最適化するか,追加のフィルタリング条件を導入する必要があります.
トレンド反転判断は動態指標に依存し,市場が急激に変化するときに動態指標の効果は割引される可能性がある.
ADXはトレンドと整合を完璧に判断できないため,値が高くても低くても問題が生じます.
戦略は取引コストを考慮していない.実際の運用では,リスクを制御するためにストップ・ロスを設定することに注意する必要があります.
この戦略は,以下の点でさらに最適化できます.
他の種類の移動平均を試すか,移動平均のパラメータを調整して,指標の平滑性を最適化する.
動態指標の長さのパラメータを最適化して,価格の反転により敏感に捉えることができる.
動量指標の逆転時に価格フィルターを設定し,短期的な小波動に惑わされないようにしてください.
ADX の使用をさらに強化し,例えば,異なる ADX レベルが異なるパラメータを使用するなど.
取引量指標などの補助条件を導入し,信号品質を向上させ,偽突破をフィルターする.
単一損失を制御するストップ・メカニズムを追加する.実際の市場の手数料レベルを評価し,合理的なストップ・ストップを設定する.
この戦略は,移動平均指標と動量指標の優位性を統合し,トレンドの追跡と逆転の捕捉を実現する.純トレンド追跡と比較して,この戦略は,市場の異なる段階に対してより柔軟に対応し,トレンド取引を維持しながら,回による損失を回避することができる.パラメータ最適化と補助条件の導入により,戦略の効果をさらに向上させる余地がある.全体的に,この戦略の論理は明確で,シンプルで,信頼性が高く,アルゴリズム取引の初心者の学習と使用に適しています.
/*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")