Ads by Google
新しい記事を書く事で広告が消せます。
MetaTrader についてのあれこれ Part5 (include)
開発のためのTipsです。
MetaTraderでは、デバック情報等を出力する出力先に
Printとか、Alertを使用している人が多いかと思います。
私も、当初はそのようなやり方をしていたのですが、
正直、開発しにくくてたまりませんでした。
で、ファイルにメッセージを吐き出す簡単な関数を作ったのですが、
これらは共通的なものであるので、複数のindicatorで共通的に使いたいわけです。
これを実現するには方法が二つあり
・include
・libraries
のどちらかを使用することになります。
本来は、librariesとして扱うのが正しいと思うのですが、
どうも、エラーがでまくって落ちてしまうので、今回はinclude
で実装しました。
C:Program Files\MetaTrader 4\experts\include
に、ファイルを作り、共通的に使いたい関数の記述を行います。
まだ、たいした共通機能はつくっていなのですが、
たとえばこんなのを共通機能として定義します。
CommonUtil.mqh
===============================================
//ファイルへのハンドラ
int LOG_FILE;
/**
ログ関連のAPI
*/
//フォーマット指定で時間を出す。
string timeStr() {
return (TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS));
}
//Open時の基礎情報を出す。
void mySignalLog(int x) {
myPrint( TimeToStr(Time[x] ,TIME_DATE|TIME_SECONDS) +" : "+ Open[x] ) ;
}
//Open時の基礎情報に、メッセージを付加して出す。
void mySignalLogWithMsg(int x,string msg) {
myPrint( TimeToStr(Time[x] ,TIME_DATE|TIME_SECONDS) +" : "+ Open[x] +" : "+msg) ;
}
//ファイルへの書き込みの本体
void myPrint(string logMsg) {
FileWrite( LOG_FILE ,logMsg) ;
FileFlush( LOG_FILE);
return (0);
}
===============================================
で、この関数を使いたいindicatorのヘッダーに下記の一行を追記すると、
そのMQL内で上述の共通機能が使用できるようになります。
#include <CommonUtil.mqh>
あと、ファイルのオープンとクローズはindicatorの方でやってます。
これは、ファイル名を分けたりする場合があるからです。
ファイルのオープンは、init()に以下の一行を追加
LOG_FILE =FileOpen("XXX.log",FILE_WRITE);
ファイルのクローズは、deinit()に以下の一行を追加
FileClose (LOG_FILE);
という感じです。
このファイルのモード(?)では、起動するたびにログファイルの中身を消すので、
ログをアペンド(前の内容を残して追記)したい場合は、
FileSeek(handle, 0, SEEK_END);
を追記するといいようです。
ちなみに、このようにして作ったファイルは、
C:Program Files\MetaTrader 4\experts\files
に出力されます。
できましたら、下記の協力お願いいたします。
お客さん来ないんでちょっとは宣伝しようと思っております。
FC2 Blog Ranking
MetaTraderでは、デバック情報等を出力する出力先に
Printとか、Alertを使用している人が多いかと思います。
私も、当初はそのようなやり方をしていたのですが、
正直、開発しにくくてたまりませんでした。
で、ファイルにメッセージを吐き出す簡単な関数を作ったのですが、
これらは共通的なものであるので、複数のindicatorで共通的に使いたいわけです。
これを実現するには方法が二つあり
・include
・libraries
のどちらかを使用することになります。
本来は、librariesとして扱うのが正しいと思うのですが、
どうも、エラーがでまくって落ちてしまうので、今回はinclude
で実装しました。
C:Program Files\MetaTrader 4\experts\include
に、ファイルを作り、共通的に使いたい関数の記述を行います。
まだ、たいした共通機能はつくっていなのですが、
たとえばこんなのを共通機能として定義します。
CommonUtil.mqh
===============================================
//ファイルへのハンドラ
int LOG_FILE;
/**
ログ関連のAPI
*/
//フォーマット指定で時間を出す。
string timeStr() {
return (TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS));
}
//Open時の基礎情報を出す。
void mySignalLog(int x) {
myPrint( TimeToStr(Time[x] ,TIME_DATE|TIME_SECONDS) +" : "+ Open[x] ) ;
}
//Open時の基礎情報に、メッセージを付加して出す。
void mySignalLogWithMsg(int x,string msg) {
myPrint( TimeToStr(Time[x] ,TIME_DATE|TIME_SECONDS) +" : "+ Open[x] +" : "+msg) ;
}
//ファイルへの書き込みの本体
void myPrint(string logMsg) {
FileWrite( LOG_FILE ,logMsg) ;
FileFlush( LOG_FILE);
return (0);
}
===============================================
で、この関数を使いたいindicatorのヘッダーに下記の一行を追記すると、
そのMQL内で上述の共通機能が使用できるようになります。
#include <CommonUtil.mqh>
あと、ファイルのオープンとクローズはindicatorの方でやってます。
これは、ファイル名を分けたりする場合があるからです。
ファイルのオープンは、init()に以下の一行を追加
LOG_FILE =FileOpen("XXX.log",FILE_WRITE);
ファイルのクローズは、deinit()に以下の一行を追加
FileClose (LOG_FILE);
という感じです。
このファイルのモード(?)では、起動するたびにログファイルの中身を消すので、
ログをアペンド(前の内容を残して追記)したい場合は、
FileSeek(handle, 0, SEEK_END);
を追記するといいようです。
ちなみに、このようにして作ったファイルは、
C:Program Files\MetaTrader 4\experts\files
に出力されます。
できましたら、下記の協力お願いいたします。
お客さん来ないんでちょっとは宣伝しようと思っております。
コメント
教えて頂きたいのですが・・・
こんばんわ
ちょっと詳細がわからないのですが、
使用するインディケイターの方で、
#include <CommonUtil.mqh>
は登録してますよね。
あと、注意点は、
CommonUtil.mqhをおくのは、
experts \ include
で、普通のインディケイターフォルダでは
ないというところかなと思います。
使用するインディケイターの方で、
#include <CommonUtil.mqh>
は登録してますよね。
あと、注意点は、
CommonUtil.mqhをおくのは、
experts \ include
で、普通のインディケイターフォルダでは
ないというところかなと思います。
コメントの投稿
« MetaTrader 小物Tips3 l Home l MetaTrader についてのあれこれ Part4 (Onlineライブラリ) »

Start function not found and cannot be run.
をいうメッセージがでてXXX.logが生成されませんでした。
あまりに素人な質問かもしれませんので恐縮ですがお教えいただけないでしょうか?