English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
自動トレーディングシステム選手権2010に向けたExpert Advisor迅速作成法

自動トレーディングシステム選手権2010に向けたExpert Advisor迅速作成法

MetaTrader 5 | 6 10月 2015, 16:36
555 0
Andrey Kornishkin
Andrey Kornishkin

はじめに

自動トレーディングシステム選手権2010に参加するためのエクスパートを作成するのに、 『トレードロボットのプロトタイプ』稿の準備済みExpert Advisorのテンプレートを使います。MQL5プログラマの初心者でもこのタスクをこなすことは可能です。というのも戦略のために基本クラス、関数、テンプレートがすでに作成されているからです。よってみなさんのトレーディングの考えに合う最低限のコードを書いて実装すれば十分です。

準備に必要なものは?
  • 戦略の選択
  • Expert Advisorの記述
  • 検証
  • ストラテジーテスタの最適化
  • 戦略の最適化
  • 異なる間隔での検証


1. 戦略の選択

トレンドでのトレーディングの方がレンジでのトレーディングより収益性が高い、またイントラーダレベルからのバウンスはチャンネル境界のブレークダウンよりも頻繁に起こると信じられています。

こういった仮定を踏まえ、チャンネル境界(エンベロープ)から現在のバウンスに向かうポジションをオープンします。 ポジションクローズの信号、またはストップロスやテイクプロフィットレベルが到達するときポジションをクローズします。

トレンド信号についてはMACDの増減を日次チャートで、そして時の時間枠でチャンネル境界からのバウンスでトレードを行います。

図1 EURUSD日次チャートのMACD指数

図1 EURUSD日次チャートのMACD指数

MACD指数が連続2バー分増加すると、これは「買い」の信号です。 それが連続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 初期設定パラメータによるトレーディングシステム検証結果

図3. 初期設定パラメータによるトレーディングシステム検証結果

結果はたいして感心するほどのものではありません。よってここでストップロスとテイクプロフィットレベルの静的化を始めます。


4. ストラテジーテスタの最適化

ストップロスとテイクプロフィットのパラメータをステップ50の間隔10~500に最適化します。

最良結果:ストップロス = 160、テイクプロフィット= 310。ストップロスとテイクプロフィットの最適化をしたら、前は36%だった収益性に対し、67%の結果を得、ネット収益は$1522.97となりました。簡単な操作で損益分岐レベルに、またいくらか利益をあげるシステムにグレードアップしました。

図4 最適化されたストップロスとテイクプロフィットに関するトレーディングシステムの検証結果

図4 最適化されたストップロスとテイクプロフィットに関するトレーディングシステムの検証結果

次は「エンベロープ」期間とdeviationの最適化を行います。

エンベロープ期間はステップ4で10から40に、偏差はステップ0.1で 0.1から1 に変更します。

最良の最適化結果は、エンベロープ期間= 22、エンベロープdeviation = 0.3です。今でも、ネット収益$14418.92で収益性79%のトレードです。

図5 最適化されたエンベロープ期間とエンベロープ偏差に関するトレーディングシステムの検証結果

図5 エンベロープ期間とエンベロープ偏差に関するトレーディングシステムの検証結果

リスクを0.8に上げれば、$77330.95のネット収益があがります。

図6 最適化されたリスク値におけるトレーディングシステムの検証結果

図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. トレード条件変更

実験的にトレード条件も変更してみます。

  1. システムを逆行させます。エンベロープの低い境界からバウンスで買い、 エンベロープの高い境界からバウンスで売ります。
  2. その日のトレンドは追わずにシステムをチェックします。トレードブロックに以下のコードを挿入するだけでできます。
    //------------------------------------------------------------------ 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%
まとめ:Expert Advisorをあまり積極的な資金管理に使用するのは好ましくありません。リスクは減らしましょう。


おわりに

簡単な考察:本テンプレートを基にしてみなさんは最短時間と最小労力をかけてトレーディング思想を実装することが可能です。

システムパラメータとトレード基準の最適化もまた問題はありません。

よりよく安定して動作するトレーディングシステムの作成のため、より長い時間間隔ですべてのパラメータを最適化することが望まれます。

使用されているソースのリス:

  1. 『MQL5における20のトレード信号』
  2. 『トレードロボットのプロトタイプ』
  3. 『MQL5でトレンドを検出するいくつかの方法』
  4. 『人気のトレーディングシステムを基にしたExpert Advisorsとトレーディングロボット最適化の秘術』
  5. 『Expert Advisorsの制約と検証』
  6. 『MQL5オブジェクトに基づくプログラム手法を用いたExpert Advisorのプログラミング』
  7. 『Expert Advisorにおける資金管理のための関数』

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/148

添付されたファイル |
mabol.mq5 (6.65 KB)
macena.mq5 (6.94 KB)
maena.mq5 (6.58 KB)
エラーとログの発見 エラーとログの発見
MetaEditor 5にはデバッグ機能が備わっています。しかし、MQL5プログラムを書くとき、個別の値ではなく検証中やオンライン作業中に現れるメッセージをすべて表示したいと思うことがよくあります。ログファイルのサイズが大きい場合、要求されるメッセージを速く簡単に回復するよう自動化するのは疑う余地がありません。本稿では、MQL5プログラム内エラーを発見する方法とログ手法を考察していきます。また、ファイルに単にログインし、ログを簡単に閲覧するためのプログラム、LogMonについての知識も深めていきます。
Expert Advisor動作中のバランス曲線勾配調整 Expert Advisor動作中のバランス曲線勾配調整
トレードシステムのルールを見つけ、それをExpert Advisorにプログラムするのが仕事の半分です。Expert Advisorはトレーディング結果を集積するので、いくらかの処理を修正する必要があります。本項では、バランス曲線の勾配測定のフィードバックを作成することで、Expert Advisorのパフォーマンスを向上させる方法の一つについて述べます。
Simulink:Expert Advisors開発者へのガイド Simulink:Expert Advisors開発者へのガイド
私はプロのプログラマではありません。そのため、トレーディングシステムの作業をする際、「シンプルから複雑へ」という原則は私にとって重要なものです。では私にとってシンプルとは正確にどういうことを言うのでしょうか?まず、システム作成プロセスの視覚化、そしてその動作のロジックです。また、手書きコードを最小限に抑えることです。本稿では、Matlabパッケージを基にトレーディングシステムを作成し検証することを目指しています。そしてIMetaTrader 5用のExpert Advisorを書いていきます。検証段階ではMetaTrader 5からの履歴データを使用します。
Expert AdvisorプログラミングにおけるMQL5標準トレードクラスライブラリの使用 Expert AdvisorプログラミングにおけるMQL5標準トレードクラスライブラリの使用
本稿は、Expert Advisorプログラミングにおいてポジションのクローズ、変更、指値注文出し、取引セット前のマージン削除と検証を実装する MQL5標準トレードクラスライブラリの使用方法について述べていきます。注文と取引詳細情報の取得に使用できるトレードクラスの使い方もお見せします。