Errori, bug, domande - pagina 1620

 
Purtroppo, non sempre. Se non ti connetti per molto tempo, il terminale dà "Account disable" e poi devi accedere manualmente. Questo accade ad esempio in una fondazione dove i server sono solitamente spenti di notte.
 
Dmitri Custurov:
Purtroppo, non sempre. Se non ti connetti per molto tempo, il terminale dà "Account disable" e poi devi accedere manualmente. Questo accade ad esempio in una fondazione dove i server sono solitamente spenti di notte.
E in questo caso (con una lunga mancanza di connessione), se si esegue il comando "File" -> "Connect to trading account" nella finestra sarà esattamente lo stesso conto di trading?
 
Esattamente lo stesso. Ho creato un solo account.
 
Dmitri Custurov:
Ciao a tutti. Ho fatto questa domanda diverse pagine fa, ma ci riprovo. C'è un modo per ri-accedere al mio conto quando la connessione al server MT5 è interrotta? La ricerca sui forum non ha dato nulla.
Se riavvio il terminale, parte con gli EA in esecuzione (non ho il terminale installato, non posso controllare)? Se sì, allora puoi scrivere uno script di shell che farà il riavvio. E tirate questo script dal vostro EA.
 
Dmitri Custurov:
Purtroppo, non sempre. Se non ti connetti per molto tempo, il terminale dà "Account disable" e poi devi accedere manualmente. Questo accade ad esempio in un fondo dove i server sono solitamente spenti di notte.
Questo è un bug o una configurazione specifica del broker. Si prega di contattare il Service Desk per questo problema. Non dovrebbe accadere.
 
Gli sviluppatori possono commentare la promessa, ma non implementata, capacità di restituire il valore di una funzione per riferimento? Non sono riusciti a farlo, o c'è qualche difficoltà?
 
Dmitri Custurov:
Purtroppo non sempre. Se non ci si connette per molto tempo, il terminale dà "Account disable" e poi si deve accedere manualmente. Questo accade ad esempio in una fondazione dove i server sono solitamente spenti di notte.

Ecco lo script che porta al menu "File" - "Connect to trading account" - cliccate sul pulsante "OK" - così il terminale si collegherà all'ultimo conto di trading che è stato autenticato:

Connettersi a un conto di trading

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

Se tutto funziona, ripulirò il codice e lo posterò in KodoBase.

File:
ClickMenu.mq5  5 kb
 

MQL4. La descrizione di StringToCharArray() dice "Copia simbolicamente una stringa convertita da unicode ad ansi in una posizione specificata di un array di tipo uchar". Ho l'impressione che ci sia un errore nella descrizione. Con questa funzione, potete semplicemente convertire un carattere in un numero corrispondente al codice che dipende dalla codifica del carattere (la funzione ha 5 parametri). Cioè non c'è nessuna conversione "... da unicode a ansi..." qui. Correggetemi se mi sbaglio.

Se ho bisogno di trovare il codice, per esempio, per il simbolo € per Ansi, allora al posto del 5° parametro scriverò CP_ACP. Se come UTF7, allora CP_UTF7. Se per Unicode, uso StringToShortArray() (vedi script).

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


 

Un bug nel compilatore.

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

Se si rimuove la funzione F2, tuttavia, si compila normalmente.

 

Errore del compilatore.

class A {  };


void Func(A* const&)   {   }


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