2010/09/22

MQL5の注意点と便利な点!

しばらく更新できませんでしたがようやく少し時間が作れたので更新します。
ここしばらく、MQL5に遊ばれて、ようやく使える?程度になってきたので今回は、『私が感じたMQL5の注意点と便利な点』を書いてみます。
【注意点】
①MQL4では行われていた『変数の暗黙の初期化』がMQL5では行われない。
//+------------------------------------------------------+
   int pos;
   if(PositionsTotal()>0) pos=1;
   if(pos==1) PositionClose(_Symbol,100,0,lot)
//+------------------------------------------------------+
上記のようなコードがある場合、MQL4では、問題なく作動しますが、MQL5ではバグを発生します。その原因は、MQL4では、変数【pos】の宣言時に勝手に(暗黙の内に)0で初期化してくれていましたが、MQL5では初期化が行われないためにゴミ(メモリの残り)が入っているためです。
≪対策≫
//+------------------------------------------------------+
   int pos=0;《宣言時に初期化する》
   if(PositionsTotal()>0) pos=1;else pos=0;《必ず設定できるコードにする》
   if(pos==1) PositionClose(_Symbol,100,0,lot)
//+------------------------------------------------------+
対策は上記の2種類あり、宣言時に初期化する方法と、必ず定数を格納できるコードを書く方法です。基本作業ではありますが、この現象が理解できるまで、かなり悩まされました。
②配列の向きがMQL4とMQL5では異なります。
※MQL4とMQL5では、インジケーターバッファの向きが逆である。
例)バッファ数がnの場合
MQL4の場合:Buf[n-1](最古バッファ)→Buf[0](最新バッファ)
MQL5の場合:Buf[0](最古バッファ)→Buf[n-1](最新バッファ)
③MQL5にはポジションの決済用関数がない。
MT5に標準で格納されているクラスにポジション決済の関数が作られていますが、実はポジションと逆の注文を出して決済する仕組みになっています。
例)BUYポジションの決済には、同数のSELLポジションの注文がなされます。 つまり、両建てが基本的にできない構造になっています。
標準で用意されているクラスを使用すれば問題はありませんが、自作する場合は、注意が必要となります。

【便利な点】
①MQL5から構造体、クラスが使えるようになりました。
基本事項ですが使用してみてその利点が十分に理解できました。
特に、構造体が使用できる点が便利です。
また、構造体配列も使用できることを確認しました。
例)
+--------------------------------------------------------+
int maxpos =3;
//ポジション用の構造体
struct Opened_Oder
{
  ulong      magic;//マジック
  int      type;//ポジションタイプ
  datetime time;//発注時間
  double   price;//発注価格
  double   pf;//利確値
  double   sl;//損切値
  double   lot;//注文数
  };
class CPosition
   {
protected:
                Opened_Oder   myoder[];//構造体配列
public:
                     CPosition();//コンストラクタ
                     *******
                     ?????????
   }

void CPosition::CPosition()//コンストラクタ
{
 ArrayResize(myoder,maxpos);//配列数の設定
 ZeroMemory(myoder);//初期化
}
+--------------------------------------------------------+
複数のPCを利用して最適化作業ができて時間の短縮が図れる。
faiさんのサイトで紹介されているので省略します。
input 変数をわかりやすい文字(日本語にも対応)にできる。
例)
+-------------------------------------------------------+
//--- input parameters
input double   pich  = 10.0;//猿
input int      mone  =  100;//犬
input double   wid   = 350.0;//キジ
+--------------------------------------------------------+
input定数の末尾にコメントを記載すると設定画面にそのコメントが表示される。
0511 
第3者にわかりやすい変数名が作成できます。
ちょっぴり感動!

【まとめ】
バグとり作業にかなりの時間を割かれましたが、新しい言語に取り組み始めた時にはつきものなので仕方がないとして!とりあえず『面白い!』の一言でまとめたいと思います。^^;