Fehler, Irrtümer, Fragen - Seite 1620

 
Leider nicht immer. Wenn Sie längere Zeit keine Verbindung herstellen, meldet das Terminal "Account disable" und Sie müssen sich dann manuell anmelden. Dies ist z. B. bei einer Stiftung der Fall, bei der die Server normalerweise nachts abgeschaltet werden.
 
Dmitri Custurov:
Leider nicht immer. Wenn Sie längere Zeit keine Verbindung herstellen, meldet das Terminal "Account disable" und Sie müssen sich dann manuell anmelden. Dies ist z. B. bei einer Stiftung der Fall, bei der die Server normalerweise nachts abgeschaltet werden.
Und in diesem Fall (mit einem langen Mangel an Verbindung), wenn Sie den Befehl "Datei" -> "Connect to Trading Account" in das Fenster wird genau das gleiche Handelskonto sein?
 
Das ist genau dasselbe. Ich habe nur ein Konto eingerichtet.
 
Dmitri Custurov:
Hallo zusammen. Ich habe diese Frage schon vor einigen Seiten gestellt, aber ich versuche es noch einmal: Gibt es eine Möglichkeit, sich wieder in mein Konto einzuloggen, wenn die Verbindung zum MT5-Server unterbrochen wird? Die Suche in den Foren hat nichts ergeben.
Wenn ich das Terminal neu starte, startet es dann mit laufenden EAs (ich habe das Terminal nicht installiert, ich kann es nicht überprüfen)? Wenn ja, dann können Sie ein Shell-Skript schreiben, das den Neustart durchführt. Und ziehen Sie dieses Skript aus Ihrem EA.
 
Dmitri Custurov:
Leider nicht immer. Wenn Sie längere Zeit keine Verbindung herstellen, meldet das Terminal "Account disable" und Sie müssen sich dann manuell anmelden. Dies ist z. B. bei einem Fonds der Fall, bei dem die Server normalerweise nachts abgeschaltet werden.
Dies ist entweder ein Fehler oder eine spezielle Einstellung des Brokers. Bitte wenden Sie sich mit diesem Problem an den Service Desk. Das sollte nicht passieren.
 
Können die Entwickler etwas zu der versprochenen, aber nicht implementierten Möglichkeit sagen , einen Funktionswert per Referenz zurückzugeben? Haben sie es nicht geschafft, oder gibt es Schwierigkeiten damit?
 
Dmitri Custurov:
Leider nicht immer. Wenn Sie längere Zeit keine Verbindung herstellen, meldet das Terminal "Account disable" und Sie müssen sich dann manuell anmelden. Dies geschieht z. B. bei einer Stiftung, bei der die Server in der Regel nachts abgeschaltet werden.

Hier ist das Skript, das das Menü "Datei" aufruft - "Mit Handelskonto verbinden" - klicken Sie auf die Schaltfläche "OK" - damit das Terminal eine Verbindung mit dem zuletzt authentifizierten Handelskonto herstellt:

Verbindung mit einem Handelskonto

//+------------------------------------------------------------------+
//|                                                    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);
  }
//+------------------------------------------------------------------+

Wenn alles funktioniert, werde ich den Code bereinigen und ihn in KodoBase veröffentlichen.

Dateien:
ClickMenu.mq5  5 kb
 

MQL4. In der Beschreibung von StringToCharArray() heißt es: "Kopiert symbolisch eine von Unicode nach Ansi konvertierte Zeichenkette an eine bestimmte Stelle eines Arrays vom Typ uchar". Ich habe den Eindruck, dass ein Fehler in der Beschreibung vorliegt. Mit dieser Funktion können Sie einfach ein Zeichen in eine Zahl umwandeln, die dem Code in Abhängigkeit von der Zeichenkodierung entspricht (die Funktion hat 5 Parameter). D.h. es gibt hier keine Konvertierung "... von Unicode nach Ansi...". Korrigieren Sie mich, wenn ich falsch liege.

Wenn ich z. B. einen Code für ein €-Symbol für Ansi finden muss, dann schreibe ich anstelle des 5. Wenn als UTF7, dann CP_UTF7. Wenn für Unicode, verwende ich StringToShortArray() (siehe Skript).

#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]));
  }


 

Ein Fehler im Compiler.

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);  }

Wenn Sie jedoch die Funktion F2 entfernen, lässt sich das Programm normal kompilieren.

 

Compiler-Fehler.

class A {  };


void Func(A* const&)   {   }


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