
この戦略は,典型的な三重指数移動平均取引戦略の実装である.これは,比較的に速い5日EMA,中速の20日EMA,そして遅い50日EMAの交差状況によって取引信号を生成する.同時に,それは,現在のK線の終止価格が,前日の終止価格より上昇または下落の一定ティクスを組み合わせて偽信号をフィルターする.さらに,この戦略は,利益をロックするためにストップ・ロスを採用する.
5日EMAで20日EMAを横切って,3つのEMAが多頭並列している場合 ((5日EMA > 20日EMA > 50日EMA),当前K線閉盘価格が前日閉盘価格より上昇して一定ティックを超えた場合,多行する. 5日EMAで20日EMAを横切って,3つのEMAが空頭並列している場合 ((5日EMA < 20日EMA < 50日EMA),当前K線閉盘価格が前日閉盘価格より下落して一定ティックを超えた場合,空行する.
入場後,価格が一定のティックを超えると,トラッキングストップメカニズムを起動し,価格の変動に応じてストップラインを継続的に調整して,より利利利なをロックします.
三重EMAを使用して取引信号を形成し,市場騒音を効果的にフィルターし,トレンドを識別できます.高速EMAは最新の変化を反映し,中速EMAはトレンドの方向を決定し,遅速EMAは振動をフィルターします.
Kラインの現在の閉店価格と前日の閉店価格の比較を加えることで,偽信号をさらにフィルターし,不必要な取引を減らすことができます.
トラッキング・ストップ・メカニズムは,市場動向に応じてストップ・ラインを動的に調整して,利益を最大限にロックすることができます.
この策略のパラメータは,日線から分線まで,異なる品種と周期に応じて最適化できる柔軟な設定である.
EMAの交差信号は頻繁に発生し,取引費やスライドポイントのコストを増加させるため,過剰な取引を容易にする.
ストップトラッキングは,大きな揺れでストップを早め,トレンド全体を保持することができません.
EMAの遅延特性は,トレンドの転換点を逃し,損失を生じさせる可能性があります.
EMAサイクル長さ,ストップロースティックの追跡などの最適化パラメータが必要で,品種や周期によって効果が大きく異なっています.
MACD,KDなどの他の指標と組み合わせて,取引シグナルをフィルタリングすることができます.
特定の品種と周期のパラメータに基づいてテストおよび最適化を行い,最適なパラメータの組み合わせを見つけることができる.
人工介入や機械学習などの方法によってパラメータを動的に調整できます.
特定の状況下では,追跡ストップをオフにしたり,全ポジションを保有する傾向を考慮することができる.
自動ストップと組み合わせることで,単純に追跡するストップの代わりになる.
この戦略は,EMA交差,価格突破,ストップロスを追跡する3つの一般的な技術分析方法を統合し,より包括的で信頼性の高いトレンド追跡取引システムを形成している.パラメータの最適化により,様々な品種と周期に適応し,傾向が顕著な市場ではより効果的です.しかし,この戦略には,より多くの市場状況に対応するためにさらに最適化する必要がある典型的な技術分析戦略の弱点もあります.全体的に,この戦略は,量的な取引のための簡単な実用的な考え方を提供しており,一般的な戦略思想の良い実践と演示です.
/*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)