MQL4のMovingAverageEA を MQL5 に移植する。(2)

昨日の続きです。

MQL5 での注文処理は、以前の日記(MQL5超入門(12)/MT5のOrderSend())で書いたように、OrderSend関数と、2つの構造体を使うと可能です。なので、厳密には class を使わなくてもEAは作れるのですが、便利なclass は使った方が楽なので今回は class を使って注文しています。


最新のインストーラからMetaTrader5をインストールすると、注文用のクラスの定義が微妙に変わっているので、それに対応したバージョンをこちらに用意しました。昨日のコードがコンパイルできない人はこちらを試してみてください。
(Vistaの場合、最新版をインストールしても Terminal Data フォルダ内のファイルは更新されないので要注意です。クラスの定義ファイルを最新にするには、手作業でMQL5フォルダごとコピーして更新する必要があります。)



さて、クラスの使い方ですが、
(1)クラスを定義しているファイルをinclude し、クラスの実体を変数として確保する。

// use CTrade class
#include  
class CTrade MyTrade;//MyTrade という変数をCTrade型クラスの実体とする。

分かりやすい表現はなんて書けばよいのか分かりませんが、普段、グローバルな変数として、

int a;
double b;

と書くのと同じ要領で、

class CTrade MyTrade;

と書いてあると思ってください。



(2) マジックナンバーと、スリッページを設定し、注文をする。

MyTrade.SetExpertMagicNumber(magic);
MyTrade.SetDeviationInPoints(slippage);
bool ret=MyTrade.PositionOpen(symbol,cmd,volume,price,stoploss,takeprofit,comment);

クラスは、変数と関数の集合体のようなもので、その中の関数(メンバ関数、メソッド)を呼び出す時は、MyTrade(ピリオド)関数名..と書いて使います。


(3) 注文結果を受取る。

msg="ret="+(string)ret
    +"\nretcode="+MyTrade.ResultRetcodeDescription()
    +"\ndeal="+(string)MyTrade.ResultDeal()
    +"\norder="+(string)MyTrade.ResultOrder();

(2),(3)ともに、MyTrade の中にある関数を呼び出しています。



MyTrade に含まれる関数の詳細を知りたい場合は、 CTrade というクラスの宣言部分を調べればよく、Trade.mqh というファイルに全て書かれています。

関数名(メソッド名) 機能
ResultXXXX 注文結果を取得する
SetExpertMagicNumber マジックナンバーを設定する
SetDeviationInPoints スリッページを設定する
PositionOpen 成行き注文する
PositionModify 保有中のポジションのsl/tpを変更する
PositionClose 保有中のポジションを決済する
OrderOpen 指値注文する
OrderModify 指値注文を変更する
OrderDelete 指値注文を取り消す


CTrade というクラスは、今後修正される可能性があるのと、もっと便利な注文用クラスが公開されるかもしれないので、これが絶対お勧め..という訳ではないですが、ちょっとしたサンプルEAを作る時には、十分使えます。

自分で構造体を準備して OrderSend するよりも楽かな...と思うのですが、如何でしょう・・?