오류, 버그, 질문 - 페이지 2522

 

WinAPI에 대한 도움을 요청합니다. MT5에서 이 두 가지를 할 수 있어야 합니다.

표시된 메뉴를 불러오고 보고서를 저장하도록 선택합니다.


표시된 메뉴를 불러오고 세트 파일을 로드하도록 선택합니다.


MT4에서는 이와 같은 작업이 매우 쉽습니다. MT5에서는 작동하지 않습니다.

저것들. 메뉴를 호출하고 메뉴에서 적절한 항목을 선택하기만 하면 됩니다. 하지만 나오지 않습니다.


추신: 당신이 그것을 필요로 하는 것 같습니다

 

태스크 #2의 컨텍스트 메뉴를 호출하는 메시지 로그를 작성하면 다음과 같은 결과를 얻을 수 있습니다.


SendMessage WinApi를 통해 프로그래밍 방식으로 이 메뉴를 호출해 보십시오.

 
Sergey Dzyublik :

태스크 #2의 컨텍스트 메뉴를 호출하는 메시지 로그를 작성하면 다음과 같은 결과를 얻을 수 있습니다.

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 개체 내에서 구현되며 루트 terminal.exe 창으로 이동한 다음 창을 통해 선택한 "SysListView32"로 이동하여 해당 핸들을 사용해야 합니다.
어쩌면 더 간단한 것이 있을지도 모릅니다.


 
Sergey Dzyublik :

잘못된 핸들을 사용하고 있을 가능성이 큽니다.
차트는 MDIClient 개체 내에서 구현되며 루트 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]

혹은 그 반대로도

처음에는 0이고 다음은?

 

안녕하세요! VMware x64 에서 터미널이 왜 이렇게 동작하는지 알려주실 수 있습니까?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

거건 , 2019.07.31 12:16

2019.07.31 08:20:46.595 터미널 MetaTrader 5 x64 빌드 2085 시작(MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 VMware x64 , IE 11, UAC, Intel Core i5-3450 @ 3.10GHz의 터미널 Windows 10(빌드 14393), 메모리: 2728/4095Mb, 디스크: 69/993Gb
2019.07.31 08:20:46.596 터미널 C:\PROGI\MT-5


터미널에 그래픽 개체가 로드될 때 더 자주 발생하는 것 같습니다.

예: 거래 작업 , 일정 이벤트

실패 후 표시기

잠시 후 표시기가 올바르게 작동하지 않습니다.

- 일정 M1;

- 모든 지표(그림은 표준 이동 평균을 나타냄)

- 세 대의 기계에서 테스트되었습니다.

차트의 기간 을 변경하면 모든 것이 제자리에 들어갑니다.

어드바이저에서 그래픽 표시기의 신호를 사용하기 때문에 이것은 중요합니다.

 
Gudgeon :

안녕하세요! 터미널이 왜 이렇게 동작하는지 알려주세요.


잠시 후 표시기가 올바르게 작동하지 않습니다.

- 일정 M1;

- 모든 지표(그림에서 표준 이동 평균)

- 세 대의 기계에서 테스트되었습니다.

차트의 기간 을 변경하면 모든 것이 제자리에 들어갑니다.

어드바이저에서 그래픽 표시기의 신호를 사용하기 때문에 이것은 중요합니다.

다음 데이터를 지정합니다.

"저널" 탭에서 세 줄 복사(세 줄 선택 -> 마우스 오른쪽 버튼 클릭 -> 복사)


메시지를 붙여넣습니다. 다음과 같이 표시되어야 합니다.

 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 빌드 2085 시작(MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, 메모리: 2728 / 4095 Mb, 디스크: 69 / GMT+93Gb의 터미널 Windows 10(빌드 14393)
2019.07.31 08:20:46.596 터미널 C:\PROGI\MT-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 );
}