ボタンやマウスクリックの傍受による自動化。 - ページ 10

 
DKeN:

F9(Order)で呼び出されたウィンドウをキャッチする方法を教えてください。

テキストで探すことができない。

これまでのところ、以下のように捕捉されています。

これでは、信頼できる方法とは到底思えません。注文ウィンドウが開いているときに、チャートのプロパティ、ターミナルの設定、グローバル変数など、何か別のウィンドウを開いてみてください。GetLastActivePopupはどのようなウィンドウを表示するのでしょうか?
 

こんにちは。

テスターで稼働しているEAからMTディスクリプタを判断する方法を教えてください。

構成は。

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
が機能しないのは
WindowHandle(Symbol(),Period())

0を返します。

 

この時点でこのようなグラフは開かれているのでしょうか?(記号とピリオドを指定)

 
Meat:

この時点でこのようなグラフが開かれているのでしょうか?(指定された記号と期間を含む)

はい、もちろんです。

両方の方法を試した。

それともWindowHandle関数の機能なのでしょうか(ヘルプには一言も書かれていませんが・・・)。

それとも私が馬鹿なのか...。

 
lasso:

はい、もちろんです。

両方の方法を試した。

あるいは、WindowHandle関数の特殊性(ヘルプには何も書かれていませんが・・・)。

それとも私が馬鹿なのか...。

ビジュアライゼーションモードでは、ハンドルは問題なく動作しています。そして、おそらくビジュアルモードでテストしていないのでしょう。それなら、窓もなければハンドルもない、ということになります。他の開いているウィンドウについては、私の理解では、テスターからアクセスできないようになっています。
その場合、FindWindowExA(...)を使って全ウィンドウの中からメタトレーダー・ウィンドウを探すしかないでしょう。
 
Meat:

可視化モードでは、ハンドルは問題なく読み取ることができます。ただし、ビジュアルモードでのテストは行ってはいけません。それなら、窓もなければハンドルもない、ということになります。他の開いているウィンドウについては、テスターからアクセスできないとのことですが。
その場合、FindWindowExA(...)を使って全ウィンドウのリストから必要なウィンドウを探すしかない。

はい、5ページ 目のIlnurの コードを適用してみました。


イルナー

ストラテジーテスターを起動し、その完了を待つスクリプトの例です。ボタンテキストは、GetWindowTextA() で読み取ります。

興味深いことに、この場合、テスターウィンドウは必ずしも表示されている必要はありません。

しかし、テスターではこの仕掛けはうまくいかなかった。 (テスターから最適化のために別の端末を立ち上げているので、この処理の完了を追跡したい)

差し支えなければ、FindWindowExA(...)の例かリンクを教えていただけませんか?

 

ここでは、そのようなウィンドウを探すための機能を紹介します。

#import "user32.dll"
  int FindWindowExA(int hwndParent,int hwndChildAfter, string lpClassName, string lpWindowName);       
  int GetWindowThreadProcessId(int hWnd,int lpdwProcessId);
  int GetWindowTextA(int hWnd,string lpString,int nMaxCount);
#import

//инициализируем текстовый буффер длиной 128 байт. Вообще должен быть 255 байт! Но он не влезает на экран, из-за чего окно форума сильно растягивается :)
string textbuf="АбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюя";

int FindWindow(string class, string caption, bool captionexactly=false)
{    
  //int CurrentThreadID=GetWindowThreadProcessId(WindowHandle(Symbol(),Period()),0);
  string null_string;
  int h=0;
  while(true)
  {    
    if (captionexactly)
      h=FindWindowExA(0,h,class,caption);
     else
      h=FindWindowExA(0,h,class,null_string);
    if (h==0) return(0);
    //if (GetWindowThreadProcessId(h,0)!=CurrentThreadID) continue;
    if (captionexactly) return(h);
    int len=StringLen(caption);
    if (GetWindowTextA(h,textbuf,128)<len) continue;
    if (StringSubstr(textbuf,0,len)==caption) return(h);  
  }
  return(0);
}
 

SPY++で必要なウィンドウのクラス名とタイトルを調べます。

スレッドIDのチェックはこの場合不要なのでコメントアウトしました(比較するソースウィンドウがない)。

一般的に、WinAPI関数を使用する場合は、WinAPI関数を扱うことをお勧めします。機能の詳細については、MSDN(http://msdn.mi crosoft.com/en-us/library/ff818516.aspx)を参照してください。

 
cm=GetDlgItem(hdlg,ID_SYMBOL)とする。
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);// リストの番号を取得します。
//ペアを探す
string fs=";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs)。
Print(ll," ",fs);
}

オーダーウィンドウ(F9)でツールのリストを正しく取得する方法を教えてください。

要素数は取得できますが、行数を正確に取得することができず、-1が返されます。

#define ID_SYMBOL 0x053E //選択する文字列の名前

cmhandle コンボボックス


 
Meat:

ここでは、そのようなウィンドウズ・サーチの機能を紹介します。


Alexeyさん、ありがとうございます。この機能は動作しますが...
肉類

フローIDのチェックは今回は必要ない(比較するソースウィンドウがない)のでコメントアウトしています。


2つの端子が絡んでいるので、スレッドIDだけ必要です。

ヘッダー識別で抜けましたが、やはりテスターの下からフローIDを判断する方法を知りたいのですが?

理由: