【MQL5】 MT5のEA作成の勉強 その3 自動作成したinit()はどんな処理? 2/2

【MQL5】 MT5のEA作成の勉強 その3 自動作成したinit()はどんな処理? 2/2

まえがき

 前回の投稿で、MQL5のEA自動作成機能を使って作成したEAのOninit()の解読を開始しました。
本投稿はその続きです。前半は以下をご覧ください。
https://tedukapm.tech/?p=291

OnInit()について -Creating filter CSignalSAR- と -Set filter parameters-

 「 Creating filter CSignalSAR 」は、直訳すると「SARシグナルのフィルター作成」、という感じでしょうか。「Set filter parameters」は「フィルターパラメーターの設定」です。SARとはこのコードを自動作成したときに選択したテクニカル指標「Parabolic SAR」のことです。フィルターパラメーターとは、 選択したテクニカル指標のパラメーターのことでしょう。自動作成の手順は以下の投稿をご覧ください。
https://tedukapm.tech/?p=274
前半の投稿に載せた、Oninit()のコード全体でいうと28行目~41行目に該当します。

//--- Creating filter CSignalSAR
   CSignalSAR *filter0=new CSignalSAR;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.Step(Signal_SAR_Step);
   filter0.Maximum(Signal_SAR_Maximum);
   filter0.Weight(Signal_SAR_Weight);

 抜き出した部分の2行目で「CSignalSAR」という変数が唐突に表れていますが、これは、前半の投稿で学んだように、ソース上部のincludeファイル、「SignalSAR.mqh」に定義が書かれています。また、’*‘で連結された表記は、通常の変数ではなくポインタとして定義するという意味でした。「filter0」を定義した後、前回の投稿で触れた変数signalの「AddFilter」メソッドに引数として渡しています。 詳細は以下の公式リファレンスをご覧ください。

https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpertsignal/cexpertsignaladdfilter

 次に、「Set filter parameters」では 「Parabolic SAR」 用のパラメーターを入力しています。この部分は選択したテクニカル指標によってメソッド名が変わるので、注意したい部分です。また、引数は事前にグローバル変数として定義済みです。
 まとめると、この部分の処理は以下です。

テクニカル指標の読み込みと、設定パラメーターの入力
(設定パラメーターはコード上部で定義)

OnInit()について – Creation of trailing object –

 「 Creation of trailing object」 は直訳すると「トレーリングオブジェクト作成」でしょうか。トレーリングストップ用のオブジェクトを設定する処理のようです。
前半の投稿に載せた、Oninit()のコード全体でいうと42行目~50行目に該当します 。

//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }

 先ほどと同様、ここでも唐突に出てきている「CTrailingNone」はコードの上部でincludeした「TrailingNone.mqh」に定義されています。今回は自動作成時にトレーリングストップを不使用としたため、このファイルを読み込んでいますが、トレーリングストップを使用しる場合は別のファイルが読み込まれます。

まとめると、この部分の処理は以下です。

トレーリングストップ用のオブジェクト作成

OnInit()について – Add trailing to expert – と – Set trailing Parameters –

 「 Add trailing to expert 」 は直訳すると「エキスパートへのトレーリング追加」、「 Set trailing Parameters 」は「トレーリングパラメーターの設定」です。
前半の投稿に載せた、Oninit()のコード全体でいうと51行目~59行目に該当します 。

//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set trailing parameters

 「ExtExpertCExpert)」の定義は前半の投稿を参照してください。 CExpert のメソッド、「InitTrailing」に、先ほど定義したtrailingを引数として渡しています。 詳細は以下の公式リファレンスをご覧ください。

https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpert/cexpertinittrailing

Expert.mql」ファイルを開いて処理を確認したところ、引数として渡した trailingCExpert の変数「m_trailing」に割り当てているようです。「 Set trailing Parameters 」は今回の例では何も記載されていませんが、トレーリングストップを行う設定にしていれば、ここでトレーリングストップの設定を行うのでしょう。
  まとめると、この部分の処理は以下です。

トレーリングストップ用のオブジェクトをEAに読み込み、設定を行う。

OnInit()について – Creation of money object –

 「 Creation of money object」 は直訳すると「資金オブジェクト作成」でしょうか。
前半の投稿に載せた、Oninit()のコード全体でいうと60行目~68行目に該当します 。

//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }

 先ほどと同様、ここでも唐突に出てきている「CMoneyFixedLot」はコードの上部でincludeした「MoneyFixedLot.mqh」に定義されています。中身はそれほど長くなく、現在の資金量で注文が成立するかを判定するのが主なようです。
 まとめると、この部分の処理は以下です 。

資金管理用のオブジェクト作成

OnInit()について – Add money to expert – と – Set money Parameters –

   「 Add money to expert 」 は直訳すると「エキスパートへの資金オブジェクトの追加」、「 Set money Parameters 」は「資金パラメーターの設定」です。
前半の投稿に載せた、Oninit()のコード全体でいうと69行目~79行目に該当します 。

//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);

  CExpert のメソッド、「InitMoney」に、先ほど定義したmoneyを引数として渡しています。 詳細は以下の公式リファレンスをご覧ください。

https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpert/cexpertinitmoney

Expert.mql」ファイルを開いて処理を確認したところ、引数として渡した trailingCExpert の変数「m_money」に割り当てているようです。「 Set money Parameters 」は自動作成時に指定した利益率とロット数が入力されています。引数として渡されているこれらの変数はコード上部で事前に定義されています。
  まとめると、この部分の処理は以下です 。

資金管理用のオブジェクトをEAに読み込み、設定を行う。

OnInit()について – Check all trading objects parameters -   

Check all trading objects parameters 」 は直訳すると「全てのトレーディングパラメーターの確認」です。
前半の投稿に載せた、Oninit()のコード全体でいうと80行目~86行目に該当します 。

//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }

  CExpert のメソッド、「ValidationSettings」を呼び出しています。「Expert.mql」ファイルを開いて処理を確認したところ、これまで設定してきた CExpert の引数、「m_signal」と「m_trailing」と「m_money」の確認をしているようです。詳細は以下の公式リファレンスをご覧ください。

https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpertbase/cexpertbasevalidationsettings

  ちなみに、 「ValidationSettings」 というメソッドは各引数の型にも含まれており、上記メソッド内でも引数の種類ごとに使用されています。リファレンスを参照する際は間違いのないようご注意ください。
まとめると、この部分の処理は以下です 。

これまでExtExpertに渡した 引数の確認を行う。

OnInit()について – Tuning of all necessary indicators -   

Tuning of all necessary indicators 」 は直訳すると「必須インジケーターのチューニング」です。
前半の投稿に載せた、Oninit()のコード全体でいうと87行目~94行目に該当します 。

//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }

  CExpert のメソッド、「InitIndicators」を呼び出しています。「Expert.mql」ファイルを開いて処理を確認したところ、これまで設定してきた CExpert の引数、「m_signal」と「m_trailing」と「m_money」の「UsedSeries」に各情報を割り当てているです。詳細は以下の公式リファレンスをご覧ください。

UsedSeriesについて
https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpertbase/cexpertbasevalidationsettings
SetPriceSeriesについて
https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpertbase/cexpertbasesetpriceseries
SetOtherSeriesについて
https://www.mql5.com/ja/docs/standardlibrary/expertclasses/expertbaseclasses/cexpertbase/cexpertbasesetotherseries

  なぜこんなことをしているのか今のところははっきりわかりません(-_-;)。価格やスプレッドの情報がほしい場合は、その名前の変数に直にアクセスするのではなく、 UsedSeriesから取りなさいということなのでしょうか。何かわかったら加筆したいと思います。知ってる方はコメント頂けると嬉しいです。
まとめると、この部分の処理は以下です 。

価格やスプレッドのポインタを UsedSeries に格納する。

まとめ

 二回に分けてOninit()の処理を勉強してきましたが、MQL5既定のライブラリに依存する部分が極めて多く、使い方を理解するのはとても難しいと思いました。しかし、いったん理解してしまえば、高度にパッケージ化されている分コーディング量は少なくて済みますし、他の人のコードも理解しやすいのではないかと思っています。
 また、リファレンスはしっかりと全てのメソッドを網羅していて、わかりやすい・・・かどうかはともかく、強い味方になると感じました。引き続き勉強を続けて行きたいと思います。