Hatalar, hatalar, sorular - sayfa 1620

 
Ne yazık ki her zaman değil. Uzun süre bağlantı yoksa, terminal "Hesap devre dışı" verir ve bundan sonra manuel olarak oturum açmanız gerekir. Bu, örneğin sunucuların genellikle geceleri kapatıldığı bir fonda olur.
 
Dmitri Custurov :
Ne yazık ki her zaman değil. Uzun süre bağlantı yoksa, terminal "Hesap devre dışı" verir ve bundan sonra manuel olarak oturum açmanız gerekir. Bu, örneğin sunucuların genellikle geceleri kapatıldığı bir fonda olur.
Ve bu durumda (uzun bir bağlantı kesilmesi durumunda), "Dosya" -> "Bir ticaret hesabına bağlan" komutunu uygularsanız, pencere TAM aynı ticaret hesabına sahip mi olacak?
 
Tam olarak aynı. Sadece bir hesap oluşturdum.
 
Dmitri Custurov :
Herkese merhaba. Soruyu birkaç sayfa önce sormuştum ama tekrar deneyeceğim. MT5'teki sunucuyla bağlantı koptuğunda bir hesaba programlı olarak yeniden giriş yapmak mümkün müdür? Forumlarda arama yapıldığında hiçbir şey çıkmadı.
Ve terminali yeniden başlatırsanız, çalışan danışmanlarla mı başlar (kurulu bir terminalim yok, kontrol edemiyorum)? Evetse, yeniden başlatmayı gerçekleştirecek bir kabuk betiği yazabilirsiniz. Ve bu betiği danışmanınızdan alın.
 
Dmitri Custurov :
Ne yazık ki her zaman değil. Uzun süre bağlantı yoksa, terminal "Hesap devre dışı" verir ve bundan sonra manuel olarak oturum açmanız gerekir. Bu, örneğin sunucuların genellikle geceleri kapatıldığı bir fonda olur.
Bu, bir hata veya belirli bir aracı ayarıdır. Bu sorunla ilgili olarak servis masasına başvurun . Bu olmamalı.
 
Geliştiricilerin vaat edilen, ancak uygulanmayan, referans olarak bir işlev değeri döndürme olasılığı hakkındaki yorumlarını duymak hala mümkün mü? Elinize geçmedi mi veya herhangi bir zorluk yaşadınız mı?
 
Dmitri Custurov :
Ne yazık ki her zaman değil. Uzun süre bağlantı yoksa, terminal "Hesap devre dışı" verir ve bundan sonra manuel olarak oturum açmanız gerekir. Bu, örneğin sunucuların genellikle geceleri kapatıldığı bir fonda olur.

İşte "Dosya" menüsünü çağıran bir komut dosyası - "Ticaret hesabına bağlan" öğesi - "Tamam" düğmesine tıklar - bu şekilde terminal, yetkilendirilmiş son işlem hesabına bağlanacaktır:

Bir ticaret hesabına bağlanın

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

Her şey işe yararsa, kodu temizleyip KodoBase'e koyacağım.

Dosyalar:
ClickMenu.mq5  5 kb
 

MQL4. StringToCharArray() öğesinin açıklaması "Uchar dizisindeki belirtilen konuma unicode'dan ansi'ye dönüştürülmüş bir dize karakter karakter kopyalar" diyor. Açıklamada bir hata var gibi görünüyor. Bu fonksiyonla, karakter kodlamasına bağlı olarak (fonksiyondaki parametre 5) bir karakteri koda karşılık gelen bir sayıya dönüştürebilirsiniz. Onlar. "... unicode'dan ansi'ye ..." dönüşümü yok. Yanlışsam düzelt.

Örneğin, Ansi için € sembolü için bir kod bulmam gerekirse, 5. parametrenin yerine CP_ACP yazacağım. UTF7 ise, CP_UTF7. Unicode için ise StringToShortArray() kullanıyorum (komut dosyasına bakın).

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


 

Derleyicide hata.

 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 işlevini kaldırırsanız, normal şekilde derlenir.

 

Derleyici hatası.

 class A {  };


void Func(A* const &)   {   }


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