
自動トレーディングシステム選手権2010に向けたExpert Advisor迅速作成法
はじめに
自動トレーディングシステム選手権2010に参加するためのエクスパートを作成するのに、 『トレードロボットのプロトタイプ』稿の準備済みExpert Advisorのテンプレートを使います。MQL5プログラマの初心者でもこのタスクをこなすことは可能です。というのも戦略のために基本クラス、関数、テンプレートがすでに作成されているからです。よってみなさんのトレーディングの考えに合う最低限のコードを書いて実装すれば十分です。
準備に必要なものは?- 戦略の選択
- Expert Advisorの記述
- 検証
- ストラテジーテスタの最適化
- 戦略の最適化
- 異なる間隔での検証
1. 戦略の選択
トレンドでのトレーディングの方がレンジでのトレーディングより収益性が高い、またイントラーダレベルからのバウンスはチャンネル境界のブレークダウンよりも頻繁に起こると信じられています。
こういった仮定を踏まえ、チャンネル境界(エンベロープ)から現在のバウンスに向かうポジションをオープンします。 ポジションクローズの信号、またはストップロスやテイクプロフィットレベルが到達するときポジションをクローズします。
トレンド信号についてはMACDの増減を日次チャートで、そして時の時間枠でチャンネル境界からのバウンスでトレードを行います。
図1 EURUSD日次チャートのMACD指数
MACD指数が連続2バー分増加すると、これは「買い」の信号です。 それが連続2バー分減少すると、これは「売り」の信号です。
図2 「エンベロープ境界」からの価格バウンス
2. Expert Advisorの記述
2.1. インクルードされたモジュール
エキスパートはExpertAdvisor.mqhモジュールからのExpertAdvisorクラスを使用します。
#include <ExpertAdvisor.mqh>
2.2. 入力変数
input int SL = 50; // Stop Loss distance input int TP = 100; // Take Profit distance input int TS = 50; // Trailing Stop distance input int FastEMA = 15; // Fast EMA input int SlowEMA = 26; // Slow EMA input int MACD_SMA = 1; // MACD signal line input int EnvelPer = 20; // Envelopes period input double EnvelDev = 0.4; // Envelopes deviation input double Risk = 0.1; // Risk
2.3. CExpertAdvisorから引き継がれたクラス
class CMyEA : public CExpertAdvisor { protected: double m_risk; // size of risk int m_sl; // Stop Loss int m_tp; // Take Profit int m_ts; // Trailing Stop int m_pFastEMA; // Fast EMA int m_pSlowEMA; // Slow EMA int m_pMACD_SMA; // MACD signal line int m_EnvelPer; // Envelopes period double m_EnvelDev; // Envelopes deviation int m_hmacd; // MACD indicator handle int m_henvel; // Envelopes indicator handle public: void CMyEA(); void ~CMyEA(); virtual bool Init(string smb,ENUM_TIMEFRAMES tf); // initialization virtual bool Main(); // main function virtual void OpenPosition(long dir); // open position on signal virtual void ClosePosition(long dir); // close position on signal virtual long CheckSignal(bool bEntry); // check signal }; //------------------------------------------------------------------
2.4. インディケータ削除
//------------------------------------------------------------------ void CMyEA::~CMyEA() { IndicatorRelease(m_hmacd); // delete MACD indicator IndicatorRelease(m_henvel); // delete Envelopes indicator } //------------------------------------------------------------------
2.5. 変数初期化
//------------------------------------------------------------------ Init bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf) { if(!CExpertAdvisor::Init(0,smb,tf)) return(false); // initialize parent class // copy parameters m_risk=Risk; m_tp=TP; m_sl=SL; m_ts=TS; m_pFastEMA=FastEMA; m_pSlowEMA=SlowEMA; m_pMACD_SMA=MACD_SMA; m_EnvelPer = EnvelPer; m_EnvelDev = EnvelDev; m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE); // create MACD indicator m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false); // if there is an error, then exit m_bInit=true; return(true); // trade allowed }
2.6. トレード関数
//------------------------------------------------------------------ CheckSignal long CMyEA::CheckSignal(bool bEntry) { double macd[4], // Array of MACD indicator values env1[3], // Array of Envelopes' upper border values env2[3]; // Array of Bollinger Bands' lower border values MqlRates rt[3]; // Array of price values of last 3 bars if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array { Print("CopyRates ",m_smb," history is not loaded"); return(WRONG_VALUE); } // Copy indicator values to array if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2) { Print("CopyBuffer - no data"); return(WRONG_VALUE); } // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] && macd[2]<macd[3]) return(bEntry ?ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] && macd[2]>macd[3]) return(bEntry ?ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell return(WRONG_VALUE); // if there is no signal } CMyEA ea; // class instance
また、コードを書いた後、ストラテジーテスタにエキスパートの結果を送信します。
3. 検証
ストラテジーテスタでEURUSDについて「去年」で期間以下のチャートを取得します。
図3. 初期設定パラメータによるトレーディングシステム検証結果
結果はたいして感心するほどのものではありません。よってここでストップロスとテイクプロフィットレベルの静的化を始めます。
4. ストラテジーテスタの最適化
ストップロスとテイクプロフィットのパラメータをステップ50の間隔10~500に最適化します。
最良結果:ストップロス = 160、テイクプロフィット= 310。ストップロスとテイクプロフィットの最適化をしたら、前は36%だった収益性に対し、67%の結果を得、ネット収益は$1522.97となりました。簡単な操作で損益分岐レベルに、またいくらか利益をあげるシステムにグレードアップしました。
図4 最適化されたストップロスとテイクプロフィットに関するトレーディングシステムの検証結果
次は「エンベロープ」期間とdeviationの最適化を行います。
エンベロープ期間はステップ4で10から40に、偏差はステップ0.1で 0.1から1 に変更します。
最良の最適化結果は、エンベロープ期間= 22、エンベロープdeviation = 0.3です。今でも、ネット収益$14418.92で収益性79%のトレードです。
図5 エンベロープ期間とエンベロープ偏差に関するトレーディングシステムの検証結果
リスクを0.8に上げれば、$77330.95のネット収益があがります。
図6 最適化されたリスク値におけるトレーディングシステムの検証結果
5. 戦略の最適化
戦略の最適化は以下のステップで行われると思われます。
- トレンド指数の変更
- 別エンベロープの選択
- 別時間枠の選択
- トレード条件変更
5.1. トレンド指数の変更
『MQL5におけるトレンドの見つけ方 』稿にあるように、最良のトレンドインディケータは移動平均と移動平均の『ファン』です。
MACDインディケータを単純な移動平均に置き換えます。エクスパートのコードは添付のMacena.mq5ファイルで確認できます。
5.2. 別エンベロープの選択
エンベロープ以外に事由に別のエンベロープを選択することが可能です。たとえば、価格チャンネル、ボーリンジャーバンド 、移動平均を基にしたエンベロープです。
エクスパートの例では、MAとボーリンジャーバンド を使用しています。それらはMaboll.mq5ファイルで参照可能です。
5.3. 別時間枠の選択
時間枠を大きくまたは小さく変更します。大きい時間枠としH4を、小さい時間枠としてM15をシステムの検証と最適化を行います。
このために、コードを1行だけ置き換えます。
m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
時間枠H4の場合
m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
時間枠M15の場合
m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
5.4. トレード条件変更
実験的にトレード条件も変更してみます。
- システムを逆行させます。エンベロープの低い境界からバウンスで買い、 エンベロープの高い境界からバウンスで売ります。
- その日のトレンドは追わずにシステムをチェックします。トレードブロックに以下のコードを挿入するだけでできます。
//------------------------------------------------------------------ CheckSignal long CMyEA::CheckSignal(bool bEntry) { double env1[3], // Array of Envelopes' upper border values env2[3]; // Array of Bollinger Bands' lower border values MqlRates rt[3]; // Array of price values of last 3 bars if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array { Print("CopyRates ",m_smb," history is not loaded"); return(WRONG_VALUE); } // Copy indicator values to array if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2) { Print("CopyBuffer - no data"); return(WRONG_VALUE); } // Buy if there is a bounce from the Evelopes' lower border if(rt[1].open<env2[1] && rt[1].close>env2[1]) return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy // Sell if there is a bounce from the Evelopes' upper border if(rt[1].open>env1[1] && rt[2].close<env1[1]) return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell return(WRONG_VALUE); // if there is no signal } CMyEA ea; // class instance //------------------------------------------------------------------ OnInit
3. 価格が下がりすぎず、返って上がっていくときにショートポジションをクローズします。
4. 価格が上がりすぎず、返って下がっていくときにロングポジションをクローズします。
トレーディング戦略を最適化する方法はたくさん思いつくと思います。その中には対応する文献に述べられているものもあります。
もっと調査しようと思えばそれは皆さん次第です。
6. 異なる間隔での検証
われわれのExpert Advisorを1ヶ月シフトの等間隔で検証します。検証期間として『去年』を取ります。期間 - 3ヶ月
検証間隔 | Profit, USD | 収益性のあるトレード |
---|---|---|
1.01.2010 - 30.03.2010 | 7239.50 | 76.92% |
1.02.2010 - 30.04.2010 | -6577.50 | 0% |
1.03.2010 - 30.05.2010 | -8378.50 | 50% |
1.04.2010 - 30.06.2010 | -6608.00 | 0% |
1.05.2010 - 30.07.2010 | 41599.50 | 80% |
1.06.2010 - 30.08.2010 | 69835.50 | 85% |
おわりに
簡単な考察:本テンプレートを基にしてみなさんは最短時間と最小労力をかけてトレーディング思想を実装することが可能です。
システムパラメータとトレード基準の最適化もまた問題はありません。
よりよく安定して動作するトレーディングシステムの作成のため、より長い時間間隔ですべてのパラメータを最適化することが望まれます。
使用されているソースのリス:
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/148





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索