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

 
불행히도 항상 그런 것은 아닙니다. 장기간 연결이 없으면 단말기에서 "계정 비활성화"가 발생하고 그 이후에는 수동으로 로그인해야 합니다. 예를 들어, 이것은 일반적으로 밤에 서버가 꺼져 있는 펀드에서 발생합니다.
 
Dmitri Custurov :
불행히도 항상 그런 것은 아닙니다. 장기간 연결이 없으면 단말기에서 "계정 비활성화"가 발생하고 그 이후에는 수동으로 로그인해야 합니다. 예를 들어, 이것은 일반적으로 밤에 서버가 꺼져 있는 펀드에서 발생합니다.
그리고 이 경우(긴 연결 해제의 경우) "파일" -> "거래 계정에 연결" 명령을 실행하면 창에 정확히 동일한 거래 계정이 있습니까?
 
정확히 동일합니다. 하나의 계정만 만들었습니다.
 
Dmitri Custurov :
모두들 안녕. 몇 페이지 전에 질문했지만 다시 시도하겠습니다. MT5에서 서버와의 연결이 끊어졌을 때 프로그래밍 방식으로 계정을 다시 로그인할 수 있습니까? 포럼을 검색해도 아무것도 나오지 않았습니다.
그리고 터미널을 다시 시작하면 어드바이저 실행으로 시작됩니까(터미널이 설치되어 있지 않아 확인할 수 없습니다)? 그렇다면 재시작을 처리할 셸 스크립트를 작성할 수 있습니다. 그리고 고문에게서 이 스크립트를 가져오십시오.
 
Dmitri Custurov :
불행히도 항상 그런 것은 아닙니다. 장기간 연결이 없으면 단말기에서 "계정 비활성화"가 발생하고 그 이후에는 수동으로 로그인해야 합니다. 예를 들어, 이것은 일반적으로 밤에 서버가 꺼져 있는 펀드에서 발생합니다.
이것은 버그이거나 특정 브로커 설정입니다. 이 문제는 서비스 데스크에 문의 하십시오. 이것은 안됩니다.
 
약속되었지만 구현되지 않은 참조 로 함수 값을 반환할 가능성에 대한 개발자의 의견을 계속 들을 수 있습니까? 손에 익지 않았거나 어려운 점은 없었나요?
 
Dmitri Custurov :
불행히도 항상 그런 것은 아닙니다. 장기간 연결이 없으면 단말기에서 "계정 비활성화"가 발생하고 그 이후에는 수동으로 로그인해야 합니다. 예를 들어, 이것은 일반적으로 밤에 서버가 꺼져 있는 펀드에서 발생합니다.

다음은 "파일" 메뉴를 호출하는 스크립트입니다 - "거래 계정에 연결" 항목 - "확인" 버튼 클릭 - 이런 식으로 터미널은 승인된 마지막 거래 계정에 연결됩니다:

거래 계정에 연결

 //+------------------------------------------------------------------+
//|                                                    ClickMenu.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property script_show_inputs
input int number_menu= 1 ;               //меню "Файл"
input int item_menu= 14 ;                 //пункт "Подключиться к торговому счёту"

#ifndef   _IsX64
#define HWND long
#define HMENU long
#define HBITMAP long
#define ULONG_PTR long
#else
#define HWND int
#define HMENU int
#define HBITMAP int
#define ULONG_PTR int
#endif 

#define UINT int
#define GA_ROOT             0x0002        // Retrieves the root window by walking the chain of parent windows
#define WM_COMMAND         0x0111
#define MIIM_STRING         0x00000040
#define MIIM_SUBMENU       0x00000004
#define BM_CLICK           0x000000F5

#import "user32.dll"
int    GetLastError ();
//+------------------------------------------------------------------+
//| GetAncestor. Retrieves the handle to the ancestor of the         |
//| specified window. Извлекает дескриптор предка заданного окна     |
//+------------------------------------------------------------------+
HWND  GetAncestor(HWND hwnd,UINT gaFlags);
HMENU GetMenu(HWND hWnd);
//int   GetMenuItemCount(HMENU hMenu);
HMENU GetSubMenu(HMENU hMenu, int    nPos);
int    GetMenuItemID(HMENU hMenu, int nPos);
bool   PostMessageW(HWND hWnd,UINT Msg, int wParam, int lParam);
HWND  GetLastActivePopup(HWND hWnd);
HWND  GetDlgItem(HWND hDlg, int nIDDlgItem);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   long   mainChartID= ChartID ();                           //возвращает идентификатор текущего графика
   int    hdlmainChartID=ChartWindowsHandle(mainChartID); //получает хэндл графика   
   HWND  hdlRoot=GetAncestor(hdlmainChartID,GA_ROOT);     //получает хендл предка указанного окна
                                                         //Print("hdlRoot = ",IntegerToString(hdlRoot));

   HMENU hmenu=GetMenu(hdlRoot);                         //получает хэндл главного меню терминала
/*int count_hmenu=GetMenuItemCount(hmenu);
   Print("в главном меню ",IntegerToString(count_hmenu)," элементов");*/

   HMENU hsubmenu=GetSubMenu(hmenu,number_menu);         //получает хэндл заданного подменю ("Файл")
/*int count_hsubmenu=GetMenuItemCount(hsubmenu);
   Print("в подменю ",IntegerToString(number_menu)," ",IntegerToString(count_hsubmenu)," элементов");*/
   
   int hpos=GetMenuItemID(hsubmenu,item_menu);           //получает хэндл пункта "Подключиться к торговому счёту"
   PostMessageW(hdlRoot,WM_COMMAND,hpos, 0 );               //кликаем на пункт "Подключиться к торговому счёту"

   Sleep ( 2000 );
   HWND hlastPopup=GetLastActivePopup(hdlRoot);           //получает хендл последнего PopUp меню
   HWND hOK=GetDlgItem(hlastPopup, 0x00000001 );           //получает хенд кнопки из диалога
   PostMessageW(hOK,BM_CLICK, 0 , 0 );                       //кликаем на кнопку "OK"
  }
//+------------------------------------------------------------------+
//| The function gets the handle graphics                            |
//| Функция получает хэндл графика                                   |
//+------------------------------------------------------------------+
int ChartWindowsHandle( long chart_ID)
  {
//--- prepare the variable to get the property value
//--- подготовим переменную для получения значения свойства
   long result=- 1 ;
//--- reset the error value
//--- сбросим значение ошибки
   ResetLastError ();
//--- receive the property value
//--- получим значение свойства
   if (! ChartGetInteger (chart_ID, CHART_WINDOW_HANDLE , 0 ,result))
     {
       //--- display the error message in Experts journal
       //--- выведем сообщение об ошибке в журнал "Эксперты"
       Print ( __FUNCTION__ + ", Error Code = " , GetLastError ());
     }
//--- return the value of the chart property
//--- вернем значение свойства графика
   return (( int )result);
  }
//+------------------------------------------------------------------+

모든 것이 작동하면 코드를 정리하고 KodoBase에 넣습니다.

파일:
ClickMenu.mq5  5 kb
 

MQL4. StringToCharArray()에 대한 설명은 "유니코드에서 ansi로 변환된 문자열을 문자별로 uchar 배열의 지정된 위치에 복사합니다."라고 말합니다. 설명에 오류가 있는 것 같습니다. 이 기능을 사용하면 문자 인코딩(함수의 매개변수 5)에 따라 문자를 코드에 해당하는 숫자로 간단히 변환할 수 있습니다. 저것들. "...에서 유니코드로 ..." 변환이 없습니다. 틀 렸으면 고쳐줘.

예를 들어 Ansi의 € 기호에 대한 코드를 찾아야 하는 경우 5번째 매개변수 대신 CP_ACP를 작성합니다. UTF7인 경우 CP_UTF7입니다. 유니코드의 경우 StringToShortArray()를 사용합니다(스크립트 참조).

 #property strict
void OnStart ()
  {
   string a = "€" ; // euro symbol
   uchar   ArrayAnsi[ 1 ], ArrayUTF7[ 1 ];
   ushort ArrayUnicode[ 1 ];
   
   int Count;
   Count= StringToCharArray (a,ArrayAnsi, 0 , WHOLE_ARRAY , CP_ACP );
   Print ( "1) € in Ansi = " , IntegerToString (ArrayAnsi[ 0 ]));
   
   Count= StringToCharArray (a,ArrayUTF7, 0 , WHOLE_ARRAY , CP_UTF7 );
   Print ( "2) € in UTF7 = " , IntegerToString (ArrayUTF7[ 0 ]));

   Count= StringToShortArray (a,ArrayUnicode, 0 , WHOLE_ARRAY );
   Print ( "3) € in Unicode = " , IntegerToString (ArrayUnicode[ 0 ]));
  }


 

컴파일러의 버그.

 template < typename T>   void   Func (T&)     {  }
template < typename T>   void   Func (T*&)    {  }

template < typename T>   void   InterFunc(T& var)  { Func(var); }   // 'var' - parameter conversion not allowed
  

class A {  };


void F1()  { A a;   InterFunc(a);  }

void F2()  { A* a;  Func(a);  }

F2 함수를 제거하면 정상적으로 컴파일됩니다.

 

컴파일러 오류입니다.

 class A {  };


void Func(A* const &)   {   }


void OnStart ()
  {    
    A* const a= NULL ;
    
    Func(a);   // 'a' - cannot convert from const pointer to nonconst pointer
  }