私たちのファンページに参加してください
- ビュー:
- 1711
- 評価:
- パブリッシュ済み:
- 2015.10.29 12:33
- アップデート済み:
- 2021.11.01 10:39
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
MQL5 Wizardは、エキスパートアドバイザーを自動生成することができます。詳細はCreating Ready-Made Expert Advisors in MQL5 Wizardを参照してください。
2つの移動平均に基づいたトレードシグナルMQL5 Wizard - Trade Signals Based on Crossover of Two Exponentially Smoothed Moving Averagesトレンドがあるとき、移動平均は効果的です。しかしそれ以外の場合はダマシが発生します。この手法を改善する方法として、時間フィルターを活用する方法があります。(例として、為替のヨーロッパ時間のときに新規ポジションをたてるなど)
時間フィルター付きの2つの指数平滑移動平均 (fast EMA と slow EMA)のクロスに基づいた手法を検証してみましょう。この手法は(MQL5 Wizard で生成する際)"Signals based on crossover of two EMA with intraday time filter"です。
トレードシグナル:
- 買いポジション: Fast EMA が slow EMA を上抜けして、かつ、ざらば時間の条件が満たされている。
- 売りポジション: Fast EMA が slow EMA を下抜けして、かつ、ざらば時間の条件が満たされている。
この手法は CSignal2EMA_ITF classに実装されています。
このトレード手法は、予約注文に基づいており、価格レベルは移動平均の値によって計算され、ATR単位が使われます。
図1. ざらば時間帯フィルター付きの、2つのEMAのクロスによるトレードシグナル
トレードシグナル
このトレード手法は CSignal2EMA_ITFに実装されており、インジケーターの値に簡単にアクセスできるメソッドが入っています。:
double FastEMA(int ind) // returns the value of fast EMA of the bar double SlowEMA(int ind) // returns the value of slow EMA of the bar double StateFastEMA(int ind) // returns the positive/negative value if fast EMA increased/decreased double StateSlowEMA(int ind) // returns the positive/negative value if slow EMA increased/decreased double StateEMA(int ind) // returns the difference between fast and slow EMA double ATR(int ind) // returns the value of ATR of the bar
- Limit>0. 価格と移動平均の動きがおかしいとき、価格が動いている方向とは逆の方向に入ります。 (Buy Limit と Sell Limit がトレードシグナルによって決められます。)
- Limit<0. 価格が動いている方向に入ります。 (Buy Stop と Sell Stop orders がトレードシグナルによって決められます。)
- Limit=0. この場合、市場価格を使います。
1. 買いポジション
買いポジションの条件: 直近の確定足において、fast EMA と slow EMAの差が"-" から "+"に変わった (StateEMA(1)>0 && StateEMA(2)<0).
次に、ざらば時間帯フィルターの条件を CSignalITF class の CheckOpenLong() method で確認トレードが許可されたら、基本価格レベル(移動平均の値)と直近の確定足のATRを計算します。
Limitのパラメーター設定に応じて買い注文が入ります。基本価格レベル(ATR単位)によって、オーダー価格、テイクプロフィット、ストップロスは計算されます。. オーダーの有効期限は、有効期限のパラメーターによって決められます。(足単位)
//+------------------------------------------------------------------+ //| Checks conditions to open long position (buy) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)>0 && StateEMA(2)<0)) return(false); if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
2. 買いの決済
今回の場合、買い決済の状態を確認する関数は常にfalseを返します。つまり、買いポジションはテイクプロフィットかストップロスで決済されます。必要な場合は、このメソッドに付け加えることが可能です。
//+------------------------------------------------------------------+ //| Checks conditions to close long position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseLong(double& price) { return(false); }
3. 売りポジション
売りポジションの条件: 直近の確定足において、fast EMA と slow EMA の差が "+" から "-" に変わった。(StateEMA(1)<0 && StateEMA(2)>0).
次に、ざらば時間帯フィルターの条件を CSignalITF class の CheckOpenLong() method で確認トレードが許可されたら、基本価格レベル(移動平均の値)と直近の確定足のATRを計算します。
Limitのパラメーター設定に応じて売り注文が入ります。基本価格レベル(ATR単位)によって、オーダー価格、テイクプロフィット、ストップロスは計算されます。. オーダーの有効期限は、有効期限のパラメーターによって決められます。(足単位)
//+------------------------------------------------------------------+ //| Checks conditions to open short position (sell) | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { if(!(StateEMA(1)<0 && StateEMA(2)>0)) return(false); if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price =m_symbol.NormalizePrice(ema+m_limit*atr); sl =m_symbol.NormalizePrice(price+m_stop_loss*atr); tp =m_symbol.NormalizePrice(price-m_take_profit*atr); expiration+=m_expiration*PeriodSeconds(m_period); //--- return(true); }
4. 売りポジションの決済
今回の場合、売り決済の状態を確認する関数は常にfalseを返します。つまり、売りポジションはテイクプロフィットかストップロスで決済されます。必要な場合は、このメソッドに付け加えることが可能です。
//+------------------------------------------------------------------+ //| Checks conditions to close short position | //+------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckCloseShort(double& price) { return(false); }
5. 買い注文のトレーリングストップ
エキスパートアドバイザーは、移動平均とATRの現在値に応じて、注文をトレールします。
//+--------------------------------------------------------------------+ //| Checks conditions to modify pending buy order | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); double spread=m_symbol.Ask()-m_symbol.Bid(); //--- price=m_symbol.NormalizePrice(ema-m_limit*atr+spread); //--- return(true); }
6. 売り注文のトレーリングストップ
エキスパートアドバイザーは、移動平均とATRの現在値に応じて、注文をトレールします。
価格がオーダー価格に達したとき、オーダーは実行されます。
//+--------------------------------------------------------------------+ //| Checks conditions to modify pending buy order | //+--------------------------------------------------------------------+ bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price) { //--- check if(order==NULL) return(false); //--- double ema=SlowEMA(1); double atr=ATR(1); //--- price=m_symbol.NormalizePrice(ema+m_limit*atr); //--- return(true); }
MQL5 WizardでEAを生成する
このロジックに基づいたトレードロボットを生成するには、MQL5 Wizardの"Creating Ready-Made Expert Advisors"の "Signals based on crossover of two EMA with intraday time filter" を選択してください。 :
図2. MQL5 Wizard の "Signals based on crossover of two EMA with intraday time filter" を選択してください。
次に、trailing stop とmoney and risk management の有無を選択します。エキスパートアドバイザーのコードは自動的に生成されるので、コンパイルすれば、MetaTrader 5 client terminalの Strategy Testerでテスト可能です。
テスト結果
過去データでエキスパートアドバイザーをテストしてみましょう。 (EUenSD M15, テスト期間: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).
エキスパートアドバイザーの生成において、今回は固定ロット(Trading Fixed Lot, 0.1), トレーリングストップ(Trailing not used)はなしを選択しました。
図3. ITFフィルターなしの2つのEMAのクロスに基づいたトレードシグナルのバックテスト結果
ザラバ時間帯フィルターを使わないと、ダマシが多く発生します。トレード時間のトレード分析をすれば、トレードシグナルを改善できます。
今回の場合、2つのEMAのクロスは 6:00 から 23:59の間にダマシが多くなることが分かります。フィルターのパラメーターを設定することにより、ざらば時間帯フィルターを調整することができます。
例えば、0:00 から 5:59の間だけ、エントリーを許可するようなざらば時間帯フィルターを設定することが可能です。BadHoursOfDay=16777152=111111111111111111000000b と設定することによりできます。その他の時間帯のはすべて"悪い"です。そのため、6:00 からの新規ポジションは禁止するようにした方が賢明です。
BadHoursOfDay=16777152のように設定すると、多くのダマシをカットすることができます。:
図4. 2つのEMAとザラバ時間帯フィルターに基づいた、このトレードシグナルのエキスパートアドバイザーのトレード結果 (BadHoursofDay=16777152)
CSignalITF は他にも時間フィルターの役割をします。 (分、時間、日の良し悪しを判断)
アタッチメント: Signal2EMA-ITF.mqh と CSignal2EMA_ITF class が terminal_data_folder\MQL5\Include\Expert\Signal folderになければなりません。
MQL5 Wizard を使って生成したエキスパートアドバイザーのコードは、expert_2ema_itf.mq5 です。
MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/264
![MQL5 Wizard - MACDのメインラインとシグナルラインのクロスに基づいたトレードシグナル](https://c.mql5.com/i/code/expert.png)
MACD(CSignalMACD from MQL5 Standard Library)のメインラインとシグナルラインのクロスに基づいたトレードシグナルを検証することができます。 この戦略のエキスパートのコードは、MQL5ウィザードで自動生成させることができます。
![MQL5 Wizard - 2つのEMAのクロスによるトレードシグナル](https://c.mql5.com/i/code/expert.png)
2つのEMAのクロスによるトレードシグナルを検証できます。この戦略のエキスパートのコードは、MQL5ウィザードで自動生成させることができます。
![MQL5 Wizard - アリゲーターのクロスによるトレードシグナル](https://c.mql5.com/i/code/expert.png)
アリゲーターのクロスによるトレードシグナルを検証することができます。この戦略のエキスパートのコードは、MQL5ウィザードで自動生成させることができます。
![MQL5 Wizard - ロウソク足の転換によるシグナル](https://c.mql5.com/i/code/expert.png)
ロウソク足の転換によるシグナルです。この戦略のエキスパートのコードは、MQL5ウィザードで自動生成させることができます。