
この戦略は,2つの指標の移動平均 ((EMA) の交差信号に基づいて取引する.短期EMAの上を長期EMAが突破するときは,ポジションを多く開く;短期EMA下を長期EMAが突破するときは,平仓する.この戦略は,リスクを制御し,戦略のパフォーマンスを最適化するために,ストップダストメカニズムと取引時間フィルターを導入する.
この戦略は,2つの異なる周期のEMAをトレンド判断基準として使用する. SMAは,SMAと比べて価格変化により迅速に反応し,より合理的な重量配分を行う. 短期EMAの上を通るときは,価格が上昇傾向を形成し,その時にポジションを多く開くことを意味する. 逆に,短期EMAの下を通るときは,上昇傾向が終了し,その時にポジションを平にすることを意味する.
均線交差信号に加えて,この戦略は,止損機構も導入している.一方,固定パーセントの止損を設定している.すなわち,価格が相対的に開場価格が特定のパーセントを超えると,平仓を強制して損失を制御する.一方,価格の閉場価格が前のK線閉場価格より低いときに平仓を選択することもできる.この2つの止損方法は,戦略の撤回を効果的に制御する.
さらに,この戦略は取引時間フィルターも導入している.ユーザーは,取引の開始と終了時間を自分で設定して,特定の時間帯 (例えば,休日,非取引時間など) で取引を避けることができます.
シンプルで使いやすい:この戦略の論理は明確で,取引信号として2つのEMAしか使わず,理解し,実行しやすい.
トレンド追跡:EMAは価格の変化に迅速に反応し,トレンド形成と終了をタイムリーに捉え,トレンド追跡の利益を得ることができます.
リスク管理:固定パーセントのストップと,前K線のクローズアップ価格に基づくストップを導入し,単一取引の損失と撤回を効果的に制御することができる.
パラメータの柔軟性:ユーザーは,自分のニーズに応じて,EMA周期,ストップパーセンテージ,前Kラインのクローズオフ価格ストップ,取引時間帯を使用するかどうかなどのパラメータを調整して,戦略のパフォーマンスを最適化することができます.
パラメータ最適化リスク:この戦略のパフォーマンスは,EMA周期,停止比率などのパラメータの選択に依存し,不適切なパラメータは,戦略の不良パフォーマンスを引き起こす可能性があります.したがって,最も最適なパラメータを選択するために,歴史的データ上でパラメータ最適化および反測を行う必要があります.
市場リスク:この戦略は,主にトレンド市場に適用され,震動的な市場またはトレンドが逆転すると,頻繁な取引が大きな引き下げにつながる可能性があります.したがって,市場の状況に応じて戦略のパラメータを調整する必要があり,またはこの戦略の使用を停止する必要があります.
コストリスク:この戦略は,取引の数が多くなり,取引コストが増加する可能性があります. したがって,適切な取引標識と取引量を選択し,取引ごとにコストを制御する必要があります.
より多くの技術指標を導入:EMAの交差信号に基づいて,RSI,MACDなどの他の技術指標を導入し,多因子取引信号を形成し,トレンド判断の正確性を向上させる.
ダイナミック・ストップ:市場の波動率,ATRなどの指標に基づいて,ストップの位置を動的に調整し,リスクを制御しながら,ストップによる利益損失をできるだけ減らす.
ポジション管理:市場のトレンドの強さ,価格と平均線からの偏差程度などに応じて,ポジションの大きさを動的に調整し,トレンドが強いときはポジションを大きくし,トレンドが弱くなったり不明になった場合はポジションを小さくする.
機械学習最適化: 機械学習アルゴリズムを使用して,戦略パラメータを最適化して,最適のパラメータの組み合わせを自動的に選択し,戦略の収益性を向上させ,過適合のリスクを軽減します.
この双均線交差量化戦略は,2つのEMAの交差信号によってトレンドを判断し,同時に止損機構と取引時間フィルターを導入し,トレンド追跡能力とリスク管理の間の良いバランスを取っています. この戦略の論理は単純ですが,合理的なパラメータ最適化とリスク管理により,トレンド市場で安定した収益を得ることができます. この戦略は,より多くの技術指標,ダイナミックな止損ポジション,管理,機械学習最適化などの導入から将来的に完善され,戦略のパフォーマンスと利性をさらに向上させることができます.
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © ZenAndTheArtOfTrading / www.PineScriptMastery.com
// @version=5
strategy("EMA strategy",
overlay=true,
initial_capital=50000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100, // 100% of balance invested on each trade
commission_type=strategy.commission.cash_per_contract,
commission_value=0.005) // Interactive Brokers rate
// Get user input
i_ma1 = input.int(title="MA 1 Length", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA")
i_ma2 = input.int(title="MA 2 Length", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA")
i_stopPercent = input.float(title="Stop Loss Percent", defval=0.10, step=0.1, group="Strategy Parameters", tooltip="Failsafe Stop Loss Percent Decline")
i_lowerClose = input.bool(title="Exit On Lower Close", defval=false, group="Strategy Parameters", tooltip="Wait for a lower-close before exiting above MA2")
i_startTime = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")
// Get indicator values
ma1 = ta.ema(close, i_ma1)
ma2 = ta.ema(close, i_ma2)
// Check filter(s)
f_dateFilter = true
// Check buy/sell conditions
var float buyPrice = 0
buyCondition = close > ma1 and strategy.position_size == 0 and f_dateFilter
sellCondition = close < ma2 and strategy.position_size > 0 //and (not i_lowerClose or close < low[1])
stopDistance = strategy.position_size > 0 ? ((buyPrice - close) / close) : na
stopPrice = strategy.position_size > 0 ? buyPrice - (buyPrice * i_stopPercent) : na
stopCondition = strategy.position_size > 0 and stopDistance > i_stopPercent
// Enter positions
if buyCondition
strategy.entry(id="Long", direction=strategy.long)
if buyCondition[1]
buyPrice := open
// Exit positions
if sellCondition or stopCondition
strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
buyPrice := na
// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)
plot(ma1, color=color.blue)
plot(ma2, color=color.orange)