2016年4月27日水曜日

[MQL超入門] その017 とりあえずやってみよう!簡単EA作成4

本格的なEA作成に入る前に、今まで省いていた前回までのコードの説明をしたいと思います。

まずは準備として最初に追加した部分の説明から。

#include <Custom/TradingWrapper.mqh>
まず、この一文です。
前に書いたとおり、本ブログではEAに注文クラスというものを使用しています。その注文クラスが定義されているソースファイルを使いますよ、という指定になります。

このように別のソースファイルなどを読み込んで使用することを「インクルード」と言います。
ソースコードの中でよく必要になる汎用的な関数や定数宣言などを機能ごとにファイルにまとめておき、必要に応じてインクルードすることで、ソースファイルの役割分担がはっきりしたり、1つ1つのソースファイルの中身をすっきりさせることができるんですね。

input int MagicNumber = 37858260; //マジックナンバー 他のEAと当らない値を使用する。
input int MaxPosition = 1;        //最大ポジション数
input double SpreadFilter = 2;    //最大スプレット値(PIPS)
// トレード補助クラス
CTradingWrapper m_wrapper(Symbol(), MagicNumber, MaxPosition, SpreadFilter);
上はインジケータでも出てきた入力パラメータですね。
下が、たびたび話に出てきた注文クラスの宣言と、同時にインスタンスを生成しています。
インスタンスとは実体のことですが、クラスやインスタンスについては別に説明したいと思います。

余談ですが、今までずっと注文クラスと書いてきましたが、コメントはトレード補助クラスとなっていて統一性がないですね。すいません^^;

注文クラス生成の引数は以下の通りです。
・string symbol
  通貨ペア。Symbol()関数は、現在の通貨ペアを返します。
  Symbol()関数
・int magicNumber
  識別(マジック)番号。EAごとに異なる番号を指定します。
・int maxPosition
  最大ポジション数。保有ポジション数がこの数を超えるようになる取引はしない。
・double spreadFilter
  最大スプレッド値。この値よりもスプレッドが大きい場合は取引しない。

この引数に、入力パラメータを使用しています。
例えば最大ポジション数ですが、このEAの場合は必ず1ポジションしか持たないようにしているのでいくつを指定しても同じなんですが、この辺はパラメータとしておいたほうが何かと使いやすいので、こういうものとしておいていいと思います。

では、取引に関する部分を説明していきます。
取引の内容はOnTick()内に記述します。
OnTick()は、価格の更新がある度に呼ばれる関数です。

   string symbol = Symbol();
   static ENUM_TIMEFRAMES target = PERIOD_H1;
   static datetime before = 0;

   // 1時間の確定足でのみ動作
   datetime current = iTime(symbol, target, 0);   
   if( before == current )
   {
      return ;
   }
   before = current;
最初のこの部分は、1時間足が確定し、次の1時間足の形成が始まった時にのみ処理を行うための記述です。

ここで使用しているiTime()関数は、足の形成開始時刻を取得する関数です。
iTime()関数の引数は以下の通りです。
・string symbol
  足の形成開始時刻を取得したい通貨ペア名。
・int timeframe
  足の形成開始時刻を取得する時間軸。時間軸は、以下のように定義されています。
  ENUM_TIMEFRAMES列挙型
・int shift
  形成開始時刻を取得したい足の位置。(0~)
  現在形成中の足の場合は0、1本前の場合は1、2本前の場合は2、となります。

このコードでは、時間軸を1時間とし、足の形成開始時刻が前回から変わるまでは処理をせず終了してしまいます。そのため、1時間おきの足の形成が始まった時のみにその後の処理を行います。
このEAでは足の確定時で十分なのでこうしていますが、EAによっては足の形成中でも処理を行う必要があると思いますので、必ず必要な記述ではありません。

   counter++;
   if ( counter < 5 )
   {
      // 5本に1回しか処理しない
      return;
   }   
   // カウンターをリセット
   counter = 0;
ここでは、1時間に1回の処理をさらに5回に1回のみ処理するようにして、5時間ごとに取引をするようにしています。
結果を分かりやすくするために5時間ごとにしただけなので、特に意味はありません。

   m_wrapper.RefreshPositions();
これは注文クラス独自の処理です。
注文クラスが管理している保有中ポジションのリストを最新の状態に更新しています。
ストップロスや利益確定などで自動的にポジション決済などが行われることがありますので、OnTick()で処理を行う前には必ずこれを呼ぶというお約束事と思ってください。

さてここからがやっと実際に取引するコードになるんですが、長くなってしまったので次回にしたいと思います。
実際の取引以外のところはサッと書いて終わろうと思ったのに、思ったよりも長々と書いてしまいました^^;

次の回へ


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。