2010/09/30

せっかく作成したので・・・・

MQL5ナンピン用EAのテンプレートを作成しましたので最適化作業等にご使用ください。
ファイル名:MQL5テンプレート .zip ヘッダーファイル:MYTrade.mqh(保存先/MetaTrader5/MQL5/Include/Trade) テンプレート :EATemplates.mq5(保存先 ・・・・・・・・/MQL5/Experts)
テンプレートには、RSIを基準にナンピンするように作成してあります。 下図は、テンプレートをそのまま稼働させた場合の参考図です。 INPUT エラーや不明な点がありましたら連絡ください。

2010/09/27

ATC2010の参加者受付が終了しました。

申請者数1726人その内、参加資格を得た人数が284人(申請者の約16%)いったい何があったのでしょうか? 新しい言語とはいえあまりにも失格者が多いように思えます。
ATC2010 そこで今回は、私がぶち当たったエラーを紹介します。 まず以下の資料見てください。【5.Statistics】の部分がエラー内容です。 これは、ルールで最大5lotまでのオーダーしか受け付けないのに6.10lotのSELLオーダーをしたために出たエラーです。 err1
しかし、今回作成したEAは、lot計算で5lotを超えた場合、分割注文を出すようにしてあるため、こんなオーダーが起こるはずはありませんでした。 では・・なぜ?起きたのでしょうか?
その原因は、単純なものでした。 それは、ポジションの決済時に一括決済を行うコードがあり、その一括決済(ポジションの逆注文)が、規定lotを超えていたために起きたエラーだったのです。つまり、決済時も規定lotを超えてはならないという暗黙のルールを犯していたようです。 その原因を、何とか対応できたので、審査はパスしたようです。 しかし、締切間際にMT5の更新があったり、募集期間の延長があったりと何やら問題の多いATCになりそうです。
ここまで読んで頂いた方は、私に期待するかもしれませんが・・・・・・・ 今回提出したEAは、全く自身がありません(謙遜ではなく)。 また、問題を抱えたEAだったんです。 実は、今日コードのバグを思いついてしまったんです。 それは、ポジションを抱えたままEAが初期化(サーバーの電源が落とされるなど・・・)されればこのEAは、エラーを吐きまくることになると思います。 (実に情けない・・・・・) ともあれ、何とか初ATCにたどり着くことができたかな?

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者にわかりやすい変数名が作成できます。
ちょっぴり感動!

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