この戦略は,主にトレンドを特定するためにEMAモメンタムとDEMAモメンタムのクロスオーバーを使用し,偽ブレイクをフィルタリングするためにATR波動性インデックスを組み込み,二重モメンタム指標と波動性フィルタリングを用いた定量的な取引戦略を実装する.
この戦略の主な構成要素は以下の通りである.
価格のEMAとDEMAを二重のモメンタム指標として計算する.長期EMAは長期的な傾向を反映し,DEMAはより敏感な短期モメンタム指標として機能する.DEMAがEMAを超えると購入信号が生成される.
ATR波動性指数を計算する. ATR値を使用して市場の波動性および流動性条件を決定する. 波動性が高すぎると偽のブレイクを避けるためにモメントインジケーター信号をフィルターする.
ATR波動性は,パラメータ化された移動平均線によって高くまたは低く判断される.モメントインジケータ信号は,ATR波動性が移動平均線を下回るときにのみ起動する.
パラメータはATRの時間枠,ATRの長さ,ATRの移動平均の種類,長さなどを制御する.
ロングポジションのストップ・ロスト,取利益,ストップ・レインディングのルールを設定します
双 EMA フィルターは,基本的な EMA クロス 戦略と比較して,誤った信号とオーバートレードを大幅に削減することができます. ATR 変動指数を追加することで,わずかな変動から誤った信号を効果的にフィルタリングし,罠にはまりないようにします.
単一モメントインジケーターと比較して,ダブルデザインは判断の有効性を向上させることができる.より反応性の高い短期モメントインジケーターとして,DEMAは安定した長期EMAと組み合わせて信頼性の高いコンボ信号を形成する.
ATR パラメータを調整することで,異なるティッカーに対して適切な波動性
最大のリスクは,不適切なパラメータ設定の結果,取引信号が少ないことにある.過剰に長いDEMAとEMA長度,またはATR波動性
また,極端な市場状況では,価格変動がATRパラメータの制約を破って損失を引き起こす可能性がある可能性もあります.必要に応じて戦略実行を一時停止するために,市場異常の手動監視が必要です.
最適な設定を見つけるために異なるモメント指標パラメータの組み合わせをテストする.
二重EMAからMACDまたは他の指標にモメント指標を入れ替えるのを試してみてください.
異なる変動指数構成をテストする.例えば,全体的な過去ATR,市場変動指数など.
価格の誤ったブレイクによるリスクを避けるため,ボリュームフィルタリングを追加します.
ストップ・ロスのメカニズムを最適化し リスク・リターン比を向上させる
この戦略は,モメンタム分析と波動性研究を堅牢な理論的基盤と統合している.パラメータチューニングと論理最適化によって,安定し信頼性の高いアルゴリズム取引システムになることができる.明確な取引信号と制御可能なリスクにより,ライブ取引で検証し実装する価値があります.
/*backtest start: 2023-11-21 00:00:00 end: 2023-12-21 00:00:00 period: 1h basePeriod: 15m 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/ // © Qorbanjf //@version=4 strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true) // DEMA length = input(10, minval=1, title="DEMA LENGTH") src = input(close, title="Source") e1 = ema(src, length) e2 = ema(e1, length) dema1 = 2 * e1 - e2 plot(dema1, "DEMA", color=color.yellow) //EMA len = input(25, minval=1, title="EMA Length") srb = input(close, title="Source") offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) ema1 = ema(srb, len) plot(ema1, title="EMA", color=color.blue, offset=offset) // Inputs atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution) atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer) useMA = input(title = "Show Moving Average?", type = input.bool, defval = true) maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type") maLength = input(defval = 20, title = "Moving Average Period", minval = 1) //longLossPerc = input(title="Long Stop Loss (%)", // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01 longTrailPerc = input(title="Trail stop loss (%)", type=input.float, minval=0.0, step=0.1, defval=50) * 0.01 longProfitPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=3000) / 100 // === INPUT BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2017, title = "From Year", minval = 2000) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30) atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback)) atrp = (atrValue/close)*100 // Moving Average Logic ma(maType, src, length) => maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc) maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength)) // variables for enter position enterLong = crossover(dema1, ema1) and atrp < maFilter // variables for exit position sale = crossunder(dema1, ema1) // stop loss //longStopPrice = strategy.position_avg_price * (1 - longLossPerc) // trail stop // Determine trail stop loss prices longStopTrail = 0.0 longStopTrail := if (strategy.position_size > 0) stopValue = close * (1 - longTrailPerc) max(stopValue, longStopTrail[1]) else 0 //Take profit Percentage longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) //Enter trades when conditions are met strategy.entry(id="long", long=strategy.long, when=enterLong, comment="long") // strategy.close("long", when = sale, comment = "Sell") //place exit orders (only executed after trades are active) strategy.exit(id="sell", limit = longExitPrice, stop = longStopTrail, comment = "SL/TP")