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

 
残念ながら、そうとは限りません。長時間接続しないと、端末が「Account disable」と出て、手動でログインしなければならない。例えば、夜間にサーバーの電源を切ることが多い財団法人では、このようなことが起こります。
 
Dmitri Custurov:
残念ながら、そうとは限りません。長時間接続しないと、端末が「Account disable」と出て、手動でログインしなければならない。例えば、夜間にサーバーの電源を切ることが多い財団法人では、このようなことが起こります。
そして、この場合(接続の長い欠如で)、あなたがウィンドウでコマンド "ファイル"-> "取引口座に接続 "を実行すると、まったく同じ取引口座になるのでしょうか?
 
全く同じです。アカウントは1つしか設定していません。
 
Dmitri Custurov:
皆さん、こんにちは。何ページか前に質問したのですが、もう一度質問します。 MT5のサーバー接続が中断されたときに、自分のアカウントに再ログインする方法はありますか?フォーラムで検索しても何も出てきません。
ターミナルを再起動すると、EAを実行した状態で起動するのでしょうか(ターミナルがインストールされていないので確認できません)。もしそうなら、再起動を行うシェルスクリプトを書くことができます。そして、このスクリプトをEAから引っ張ってきてください。
 
Dmitri Custurov:
残念ながら、そうとは限りません。長時間接続しないと、端末が「Account disable」と出て、手動でログインしなければならない。例えば、夜間にサーバーの電源を切ることが多いファンドでは、このようなことが起こります。
これはバグか、ブローカーの特定の設定のどちらかです。この問題は、サービスデスクに お問い合わせください。あってはならないことです。
 
約束されていながら未実装の、関数の値を 参照で返す機能について、開発者のコメントをお願いします。 まだ手をつけていないのか、それとも何か問題があるのでしょうか?
 
Dmitri Custurov:
残念ながら、いつもそうとは限りません。長時間接続しない場合、端末が「Account disable」と表示し、手動でログインする必要があります。例えば、夜間にサーバーの電源を切ることが多い財団法人では、このようなことが起こります。

以下は、「ファイル」メニュー-「取引口座に接続」-「OK」ボタンをクリックするスクリプトで、端末が最後に認証された取引口座に接続するようにします。

取引口座への接続

//+------------------------------------------------------------------+
//|                                                    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()の 説明には「unicodeからansiに変換された文字列をuchar型の配列の指定された場所にシンボリックにコピーする」と書かれています。記述に間違いがあるような気がします。この関数を使うと、文字を文字コードに対応する数値に変換するだけで、文字コードに依存した変換ができます(関数は5つのパラメータを持っています)。つまり、ここでは「...unicodeからansiへの...」という変換はありません。間違っていたら訂正してください。

例えば、Ansiの€記号のコードを見つける必要がある場合、第5パラメータにCP_ACPと記述することになります。UTF7 の場合は、CP_UTF7 となります。Unicodeの場合は、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
  }