この戦略は典型的な三倍指数移動平均 (EMA) 取引システムを実装する.高速5日EMA,中期20日EMA,遅い50日EMAを比較することで取引信号を生成する.また,偽の信号をフィルターするために,以前のバーの接近価格と比較して現在のバーの接近価格を使用する.さらに,トライリングストップロスは利益をロックするために使用される.
5日間のEMAが20日間のEMAを上回り,すべての3つのEMAが上昇傾向にある場合 (5日間のEMA>20日間のEMA>50日間のEMA),現在のバーの閉じる値は,特定のティックの近くでの前のバーより高くなる場合,ロングに行く. 5日間のEMAが20日間のEMAを下回り,すべての3つのEMAが下降傾向にある場合 (5日間のEMA <20日間のEMA <50日間のEMA),現在のバーの閉じる値は,特定のティックの近くでの前のバーより低くなる場合,ショートに行く.
入場後,価格が一定の値を下げると,価格変動に基づいてストップロスを調整し,より大きな利益を得るために,ストップロスを開始します.
信号を生成するために三重EMAを使用することで,市場の騒音を効果的にフィルターし,トレンドを識別することができます. 急速EMAは最新の変化を反映し,中期EMAはトレンド方向を決定し,遅いEMAは振動をフィルターします.
現在のバー・ローズと前のバー・ローズを比較すると,偽の信号をさらにフィルタリングし,不必要な取引を減らすことができます.
トレイリングストップ・ロスは,価格の動きに基づいてストップ・ロスを動的に調整し,利益を最大化します.
この戦略の柔軟なパラメータ設定は,日数から分数バーまでの異なる製品とタイムフレームに最適化することができます.
EMAの頻繁なクロスオーバーは,差異市場での過剰な取引を生み出し,手数料やスライドによるコストを増加させる可能性があります.
トレイリングストップロスは,巨大なウィップソースの間にトレンドを早急に終了する可能性があります.
EMAの遅れは大きな転換点や損失を欠く可能性があります.
EMA期間のようなパラメータや ストップティックは 異なる製品やタイムフレームに最適化する必要があります
MACD,KDなどの他の指標を組み込み,取引信号をフィルターします.
最適な組み合わせを見つけるために 特定の製品と時間枠のパラメータをテストし最適化します
人工監視や機械学習によって パラメータを動的に調整します
特定の市場条件では 追跡停止を無効にし 完全なポジションを保持することを検討してください
シンプルなストップ・ロスを より高度な自動利益採取メカニズムに置き換える
この戦略は,3つの一般的な技術分析技術 - EMAクロスオーバー,価格ブレイクアウト,トライリングストップロスを,かなり包括的で堅牢なトレンドフォロートレーディングシステムに統合している.パラメータ最適化を通じて,異なる製品とタイムフレームに適応し,強いトレンド市場で良好なパフォーマンスを発揮することができる.しかし,より多くの市場の状況に対処するためにさらなる最適化を必要とする技術分析戦略の典型的な弱点もあります.全体的に,この戦略は,いくつかの一般的な戦略コンセプトを非常によく示することによって,定量的な取引のためのシンプルで実践的なアイデアを提供します.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-02 12:00:00 period: 1m basePeriod: 1m 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/ // © Matt Dearden - IndoPilot // @version=4 /////////////////////////////////////////////////////// Initial Parameters /////////////////////////////////////////////////////// SystemName = "Triple EMA Strategy" ShortSystemName = "TEMA" InitPosition = 0 InitCapital = 50000 InitCommission = 0.004 //approx value to compensate for Oanda spreads InitPyramidMax = 0 CalcOnorderFills = true strategy(title=SystemName, shorttitle=ShortSystemName, overlay=true, pyramiding=InitPyramidMax, default_qty_type=strategy.cash, default_qty_value=InitPosition, commission_type=strategy.commission.percent, commission_value=InitCommission, initial_capital=InitCapital, max_lines_count=500, max_labels_count=500, process_orders_on_close=false, calc_on_every_tick=false) ///////////////////////////////////////////////////////////// Inputs ///////////////////////////////////////////////////////////// DateFilter = input(false, "═════ Data Filtering ═════") InitYear = input(title="Year", type=input.integer, defval=2021, minval=2000, maxval=2021) InitMonth = input(title="Month (0=ALL)", type=input.integer, defval=0, minval=0, maxval=12) InitStopLoss = input(title="Stop Loss (ticks)", type=input.integer, defval=100, minval=0, maxval=1000) TrailingStopLoss = input(title="Trailing S/L (ticks)", type=input.integer, defval=130, minval=0, maxval=1000) InitBuffer = input(title="Buffer (ticks)", type=input.integer, defval=15, minval=0, maxval=1000) InitEMA1 = input(title="EMA 1", type=input.integer, defval=5, minval=0, maxval=1000) InitEMA2 = input(title="EMA 2", type=input.integer, defval=20, minval=0, maxval=1000) InitEMA3 = input(title="EMA 3", type=input.integer, defval=50, minval=0, maxval=1000) //////////////////////////////////////////////////////////// Variables /////////////////////////////////////////////////////////// var StopLoss = float(0.0) var StartPrice = float(0.0) //setup multipliers and catch JPY difference Multiplier = syminfo.currency == "JPY" ? 10 : 1000 //get the daily exchange rate from yesterday //X_rate = security(AccountCurrency+syminfo.currency, "D", close[1]) OrderQty = 1 Buffer = InitBuffer / (Multiplier * 100) /////////////////////////////////////////////////////// Triple EMA Strategy ////////////////////////////////////////////////////// EMA1 = ema(close, InitEMA1) EMA2= ema(close, InitEMA2) EMA3 = ema(close, InitEMA3) //entry conditions longCondition = crossover(EMA1, EMA2) and close > EMA3 and EMA1 > EMA3 and EMA2 > EMA3 and close > (close[1] + Buffer) shortCondition = crossunder(EMA1, EMA2) and close < EMA3 and EMA1 < EMA3 and EMA2 < EMA3 and close < (close[1] - Buffer) /////////////////////////////////////////////////////// Trailing Stoploss //////////////////////////////////////////////////////// if (strategy.position_size > 0 and (close > (StartPrice + (TrailingStopLoss / (100 * Multiplier))))) StopLoss := max(StopLoss, close - (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Long Stoploss", "Long") if (strategy.position_size < 0 and (close < (StartPrice - (InitStopLoss / (100 * Multiplier))))) StopLoss := min(StopLoss, close + (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Setup entries ///////////////////////////////////////////////////////// if (longCondition) StartPrice := close StopLoss := StartPrice - (InitStopLoss / (100 * Multiplier)) strategy.entry("Long", strategy.long, qty=OrderQty) strategy.exit("Long Stoploss", "Long") if (shortCondition) StartPrice := close StopLoss := StartPrice + (InitStopLoss / (100 * Multiplier)) strategy.entry("Short", strategy.short, qty=OrderQty) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Draw the EMAs ///////////////////////////////////////////////////////// plot(EMA1, "EMA1", color=#00FF00) plot(EMA2, "EMA2", color=#FF0000) plot(EMA3, "EMA3", color=#4040FF)