Ошибки, баги, вопросы - страница 2654

 

Кто-нибудь может просветить по такому вопросу:

имеем dll написанную на C# ,но скомпилированную:

- для МТ5 обычный проект C# - Net Framework dll - 64 бит

- для МТ4 обычный проект C# - Net Framework dll - 32 бит, но обернутый в managed  C вызовы

исходники dll на 100% идентичные , естественно за исключением обертки для МТ4 ,

ОС Win10-64

ну и сам то вопрос, почему МТ4 совершает вызовы функций ровно в 4 раза быстрее , цифры примерно такие 100 000 вызовов dll на МТ4 7,5 сек , на МТ5 30 сек

 
Igor Makanu:

Кто-нибудь может просветить по такому вопросу:

имеем dll написанную на C# ,но скомпилированную:

- для МТ5 обычный проект C# - Net Framework dll - 64 бит

- для МТ4 обычный проект C# - Net Framework dll - 32 бит, но обернутый в managed  C вызовы

исходники dll на 100% идентичные , естественно за исключением обертки для МТ4 ,

ОС Win10-64

ну и сам то вопрос, почему МТ4 совершает вызовы функций ровно в 4 раза быстрее , цифры примерно такие 100 000 вызовов dll на МТ4 7,5 сек , на МТ5 30 сек

ИМХО. C-runtime в одном случае и виртуальная машина в другом.

 
пропустил нововведение на форуме, там где имя фамилия, дата и рядом с кнопкой переводы, цифры - 1 2 3 , есть не у всех, вчера вроде и у меня не было, почему не увсех, и на чем определяются страницы?
 

В эксперте реализован графический интерфейс. Также реализованы пользовательские события (например, события по изменению графического интерфейса). Произвожу отладку на реальных данных (F5). Как только ставлю точку останова на пользовательское событие - отладчик останавливается, но последующее нажатие на F5 (продолжение отладки) не приводит к изменению в самом графическом интерфейсе. Вопрос: так и должно быть, или это баг отладчика?

Если убрать точку останова (отладка продолжается) - изменения в графическом интерфейсе происходят нормально.

МТ5, билд 2340.

 
Vladimir Simakov:

ИМХО. C-runtime в одном случае и виртуальная машина в другом.

там в обоих dll крутится виртуальный .Net

нашел отличия в кодах, в 32-х разрядной сам базовый класс в отдельный поток я сам же выбросил, ибо он ука такая по другому не работает

сделал ту же манипуляцию для МТ5 , ну как бы результата соизмеримые стали ( по три теста ):

МТ5:  цикл 100000 , время 8.482981 сек , цикл 100000 , время 8.638789 сек , цикл 100000 , время 8.390046 сек

МТ4:        цикл 100000 , время 7.128857 сек , цикл 100000 , время 7.176361 сек , цикл 100000 , время 7.205439 сек


ладно, будем считать, что это некий хук от Майкрософт
 

Приветствую ! Всех мужчин ,с праздником !!!!
Никак не пойму , что за странный баг с зигзагообразным отображением эквити в тестере. Открытие брокер фондовая секция , демо . При изменении настройки символа "Способ расчетов" с  " Ехchange Stoks" на "Forex" , эквити отображается нормально. Такое же наблюдалось несколько лет назад , хотел попробовать подключить MT5 на фонду, протестировал , испугался и плюнул на все. Сейчас попробовал снова и тоже самое. Как то странно???

 
Почему нет возможности реализовать функцию с "универсальным" аргументом, что бы можно было передать любую переменную в независимости от ее "происхождения": lvalue, rvalue, literal или временную переменную?
Проблема решаема для методов "типизированных" классов-контейнеров, однако ни как не решаема для обычных функций.

Основное противоречие в том, что для передачи структур необходимо использовать передачу по ссылке, а для литералов и временных переменных - передачу по значению.
В результате для обычных lvalue типов получаем ошибку компиляции, так как для вызова подходят обе перегруженные функции.
В качестве частичного решения и только для "примитивных" типов можно соорудить 12 overloaded function:
#define CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
Но если в функция должна принимать два "универсальных" аргумента, то для реализации потребуется всего 144 overloaded function, тогда как в случаи трех таких аргументов - это целых 1728 overloaded function.


Предложение:
Предоставьте наконец-то возможность пользователям передавать литералы и временные переменные в виде const ref аргументов функций.
Пусть это будет отдельная директива # - не важно...
 

Дефекты в работе кеша шаблонной функции/класса:
(не исправлено MT5(build 2340)) **          Undefined Behavior, создаешь сложный несколько раз обернутый объект с внутренним типом "С", а там оказывается совсем другой тип данных, может "B", может "int", что хочешь...
(не исправлено MT5(build 2340)) *           Compile Error, баг при передаче в качестве const ref template аргумента указателя на функцию.
(не исправлено MT5(build 2340)) *           Compile Error, объект B<int> можно создать после объекта класса B<void*>, но если сделать это перед, то возникает ошибка компиляции.


Дефекты в работе шаблонной функции/класса:
(не исправлено MT5(build 2340)) **         Compile Error, баг внутри шаблонной функции, переданный указатель в рамках операции явного приведения типа ведет себя как класс в остальных случаях - как указатель.
(не исправлено MT5(build 2340)) **         Compile Error, баг с генерацией кода шаблонного класса при использовании internal class.
(не исправлено MT5(build 2340)) **         Compile Error, баг при попытке доступа к internal class для шаблонного параметра шаблонной функции.
(не исправлено MT5(build 2340)) *          Compile Error, баг при генерации шаблонного метода/класса, процесс "автозаменны" шаблонного параметра выходит за пределы скоупа в основной код программы.
(не исправлено MT5(build 2340)) *          Compile Error, баг с отсутствием автоматической генерации кода шаблонного класса, когда шаблонный класс выступает в качестве return value для шаблонного метода.
(не исправлено MT5(build 2340)) *          Compile Error, баг при определении internal class - отсутствует возможность явно сослаться на глобальное пространство имен при указании базового класса.


Дефекты в рамках несоответствие приоритетов вызовов перегруженных функций в MQL в сравнении с С++:
(не исправлено MT5(build 2340)) ***       Compile Error, когда есть наследование классов A <= B <= C <= D и реализованы две overloading функции, например одна c параметра А*, а вторая с B*, то передача в такую функцию объекта C* или D* в MQL вызывает ошибку компиляции "ambiguous call to overloaded function".
(не исправлено MT5(build 2340)) **        Runtime, Несоответствие приоритетов для вызовов перегруженных шаблонных функций.



Предложения:
ссылка - о предоставлении возможности передавать литералы и временные переменные в виде const ref аргументов функции.
ссылка - при перемещении файлов проекта во вкладке "Project", для перемещаемых файлов, которые открыты и находятся во вкладках ME, автоматически обновлять их путь расположения.
ссылка - о необходимости введения в MQL typedef declaration функциональности.
ссылка - о предоставлении возможности принудительной генерации дефолтных конструкторов копирования и операторов присвоения.


 

Прошу помощи, совсем не в теме.

В OnChartEvent по нажатию клавиши `C` гашу/восстанавливаю график цены.

И все бы хорошо, но если выбрана не английская раскладка клавиатуры - не работает.


Как сделать определение нажатия клавиши `C` независимым от выбранной раскладки?

 
fxsaber:

Прошу помощи, совсем не в теме.

В OnChartEvent по нажатию клавиши `C` гашу/восстанавливаю график цены.

И все бы хорошо, но если выбрана не английская раскладка клавиатуры - не работает.


Как сделать определение нажатия клавиши `C` независимым от выбранной раскладки?

Нужно проверять lparam

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

Для ru и для en раскладки (и для строчных и для прописных) lparam будет 67:

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'
Причина обращения: