【ExpertsLogPeeper】複数チャート設定時のアクセス違反の修正
「function 'FindLogHandle' call from dll 'ExpertsLogPeeper.dll' critical error・・・」
というエラーが起こることがあります。
同一プロセス(terminal.exe)の複数スレッド(チャート)ではDLLのデータメモリが共有されるため、
DLL関数でのメモリ確保・解放がコンフリクトするせいです。
アクセス違反を回避するために実行中関数には再入しないように対策しました。
エクスポートしている関数がビジーの時は(-8)が返ります。
ビジー->忙しい->磯?->蛸?->足って8本だっけ?
「ExpertsLogPeeper1.01」のダウンロードは→こちら←をクリック。

【ExpertsLogPeeper】EAからExpertsログを取得するDLL!
MT4のExpertsログの取得部分をdllにしてみました。

インジケータから出力されるアラートもExpertsログに出力されるので、
EAからマウス自動クリックツールをキックするようにコーディングすれば、
インジケータのアラート→なんちゃら証券のブラウザ画面でオーダーなんて事ができそうです(*⌒д⌒)b
【ファイル構成】
ExpertsLogPeeper100.zip
│ お読みください.txt・・・取説ファイル
│ update.txt・・・更新履歴
└─MetaTrader4
│
└─experts
│ sample.mq4・・・使い方のサンプルEA
├─include
│ ExpertsLogPeeper.mqh・・・ExpertsLogPeeper.dll使用時のインクルードファイル
└─libraries
ExpertsLogPeeper.dll・・・dll本体
【EAコーディング及び実行時のファイル配置】
・ExpertsLogPeeper.mqh
MT4フォルダ\experts\includeへ配置してください。
・ExpertsLogPeeper.dll
MT4フォルダ\experts\librariesへ配置してください。
【関数一覧】
int FindLogHandle(int ChartWindowHandle, string Keyword);
Expertsログウィンドウのウィンドウハンドルを探索する関数です。
あらかじめPrint()関数でKeywordを出力しておきます。
引数ChartWindowHandleには通常WindowHandle(Symbol(), Period())を渡します。
ウィンドウの誤認を防ぐためKeywordは複雑な文字列が良いです。
探索が成功すると0以外の値(ウィンドウハンドル)が返ります。
int GetLogRowCount(int LogHandle);
Expertsログの行数を取得する関数です。
引数LogHandleにはFindLogHandle()の返値を渡します。
int GetLogData(int LogHandle, int RowNo, string Buff, int BuffSize);
Expertsログデータを1行取得します。
引数LogHandleにはFindLogHandle()の返値を指定します。
RowNoは取得する行番号で最上行が1です。
Buffに取得されたログデータが返ります。BuffSizeにはBuffのサイズを指定します。
返値は取得したバイト数です。
RowNoが範囲外の場合は-1を、BuffSizeが1より小さい場合は-2を返します。
BuffはEA側での宣言時に十分な長さの文字列で初期化しておく必要があります。
行の長さがBuffSize-1より長い場合、行の残りは切り捨てられます。
時間列とメッセージ列はタブ("\t")で区切られています。
取得データは0x00でターミネートされます。
【使用法】
//Expertsログウィンドウを探すためのキーワード
extern string Keyword = "If a body catch a body comin' through the rye";
//行読み取りバッファ・・・できるだけ長い文字列で初期化する
static string Buff = "****************... "; //実際には256文字埋める
//Buffの長さを定義
#define BUFF_SIZE 256
int LogHandle = 0;
int init()
{
//探索用にキーワードを出力
Print(Keyword);
}
int start()
{
if(LogHandle == 0){
//ハンドルが未取得なら取得する
LogHandle = FindLogHandle(WindowHandle(Symbol(), Period()), Keyword);
if(LogHandle <= 0){
Print(Keyword); //探索用キーワードを再出力
return(0);
}
}
//ログの行数を調べる
if(GetLogRowCount(LogHandle) > 0){
//先頭行のログを取得する
if(GetLogData(LogHandle, 1, Buff, BUFF_SIZE) > 0)
Comment(Buff); //コメントに表示
}
return(0);
}
より詳細で具体的な使用法についてはExpertsLogPeeper100.zip内のsample.mq4をご覧ください。
日本語でコメントを記述しているのでMeta Editorのフォントを
MSゴシック等の日本語にしてご覧ください。
「ExpertsLogPeeper1.00」のダウンロードは→こちら←をクリック。

| h o m e |