エラー、バグ、質問 - ページ 2522

 

WinAPIについて教えてほしいのですが。MT5でこの2つのアクションを行えるようにする必要がある。

表示されたメニューを呼び出し、レポートを保存するを選択します。


表示されたメニューを呼び出し、セットファイルを読み込むを選択します。


MT4では、このようなことは非常に簡単です。MT5ではそうではありません。

つまり、メニューを開いて、適切なオプションを選択する必要があります。しかし、それができない。


そうあるべきようだ。

 

タスク 2 のコンテキストメニューを呼び出す Message log を書くと、次のような結果になります。


このメニューをSendMessage WinApiでプログラム的に呼び出してみてください。

 
Sergey Dzyublik:

タスク 2 のコンテキストメニューを呼び出す Message log を書くと、次のような結果になります。

このメニューをSendMessage WinApiでプログラム的に呼び出してみてください。

成功しない。

#include <WinAPI\winuser.mqh>

#define  GA_ROOT           0x00000002

#define  GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {}; // Пробовал углубляться по дереву окон - не помогает.
  GET_HANDLE
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}
 
fxsaber:

うまくいかなかった

ハンドルネームを間違えているのでは?
チャートは、MDIClientオブジェクトの中に実装されているので、rootのterminal.exeウィンドウまで行き、そこからウィンドウを下りて、ハイライトされた "SysListView32 "に行き、そのハンドルを使用する必要があるのです。
もっと簡単な方法があるかもしれませんので、試してみてください...。


 
Sergey Dzyublik:

ハンドルネームを間違えている可能性が高いです。
チャートは、MDIClientオブジェクトの中に実装されているので、rootのterminal.exeウィンドウまで行き、そこからウィンドウを下りて、ハイライトされた "SysListView32 "に行き、そのハンドルを使用する必要があるのです。
もっと簡単な方法があるかもしれませんので、試してみてください...。

ハンドルネームにたどり着いたが、役に立たなかった。

#include <WinAPI\winuser.mqh>

#define  GA_ROOT           0x00000002

#define  GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {0xE81E, 0x804E, 0x28EF, 0x28FE};
  GET_HANDLE
  
  Print(Handle); // Распечатал хендл.
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}


おそらく、別のメッセージでしょう。

 

長い間、私を悩ませてきたのは、思考回路を正しく動機づけるにはどうしたらいいかということです。

if (値[0] > 値[1])

またはその逆

は、最初のゼロから次のゼロへ?

 

VMware x64で ターミナルがこのような動作をする理由を教えてください。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

ぐっどうぃる博士 2019.07.31 12:16

2019.07.31 08:20:46.595 ターミナル MetaTrader 5 x64 build 2085 開始 (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 ターミナル Windows 10 (build 14393)on VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Memory: 2728 / 4095 Mb, Disk: 69 / 99 Gb, GMT+3.
2019.07.31 08:20:46.596 ターミナル C:\PROGIMT-5


ターミナルにチャートオブジェクトがロードされているときに発生することが多いように感じます。

例:トレード、カレンダーイベント

故障後のインジケーター

しばらくすると、インジケーターが正常に動作しなくなる。

- M1チャート。

- 任意の指標(図では標準移動平均線)。

- は3台のマシンでテストしました。

スケジュール期間を 変えれば、すべてがうまくいく。

私のEAでは、チャートインジケータからのシグナルを使用しているため、これは非常に重要です。

 
Gudgeon:

こんにちは、なぜ端末がこのような動作をするのか、教えていただけませんか?


しばらくすると、インジケーターが正常に動作しなくなる。

- M1チャート。

- 任意の指標(画像は標準的な移動平均線)。

- 3台のマシンで確認しました。

グラフの周期を 変えれば、すべてがうまくいくのです。

私はExpert Advisorでチャートインジケータからのシグナルを使用しているので、これは非常に重要です。

データを指定する。

ログ」タブから3行をコピー(3行を選択→右クリック→コピー)


をクリックし、メッセージに貼り付けてください。このようなものが出てくるはずです。

2019.07.31 11:53:10.681 MetaTrader 5 x64 build 2093 started (MetaQuotes Software Corp.)
2019.07.31 11:53:10.685 Windows 10 (build 18362) x64, IE 11, UAC, Intel Core i3-3120 M  @ 2.50 GHz, Memory: 3188 / 8077 Mb, Disk: 99 / 415 Gb, GMT+2
2019.07.31 11:53:10.685 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
 

2019.07.31 08:20:46.595 ターミナル MetaTrader 5 x64 build 2085 開始 (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 ターミナル Windows 10 (build 14393) on VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Memory: 2728 / 4095 Mb, Disk: 69 / 99 Gb, GMT+3.
2019.07.31 08:20:46.596 ターミナル C:\PROGIMT-5


ターミナルにグラフィカルなオブジェクトがロードされているときによく発生するようです。

例:トレード、カレンダーイベント、スモールタイムフレーム
 
fxsaber:

ハンドルネームにたどり着いたが、役に立たなかった。
おそらく、別のメッセージでしょう。

WM_CONTEXTMENUで取得しました。
コードを少しいじったので、デバッグがしやすくなり、再利用も可能です。

#include <WinAPI\winuser.mqh>

#define  GA_ROOT            0x00000002
#define  WM_CONTEXTMENU     0x007B


#define  PRINT(x) ; Print(#x, ":", string(x))
#define  PRINT64(x) ; printf("%s%s%#.08x", #x, ":", x)


long GetHandle(long handle, int &controls[]){
   long next_handle = handle;                                                                        
   for (int i = 0; i < ArraySize(controls); i++){
      next_handle = user32::GetDlgItem(next_handle, controls[i]);
      PRINT64(next_handle);
   }           
   return next_handle;                
}
  

void OnStart(){
  long RootHandle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT);
  PRINT64(RootHandle);  
  
  int controls[] = {0xE81E, 0x804E, 0x28EF, 0x28FE}; 
  long handle = GetHandle(RootHandle, controls);
  PRINT64(handle);
  
  
  //PRINT(user32::SendMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT(user32::PostMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT("Sleep");

  Sleep(10 * 1000);
}