Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 96

 
Ihor Herasko:

Да, описания действительно нет. Думаю, добавят, когда увидят этот вопрос. С ордером связано просто: когда происходит чтение истории счета, то кроме ордеров разного типа (buy stop, buy limit и т. д.) можно наткнуться на балансовую операцию. Такой подход позволяет правильно рассчитывать торговую прибыль, отсеивая пополнения/снятия.

спасибо...

 
Renat Fatkhullin:

Мы серьезно оптимизировали поднятие и синхронизацию баз данных в MetaTrader 5 build 1968 (бета уже доступна).

В 5 раз быстрее базы поднимаются при холодном запуске и в 1.5 раза быстрее при горячем.

Причем в горячем режиме подъем баз стал быстрее, чем в четверке.

Да, спасибо! Реально заметил и замерил значительное увеличение быстродействия в сложных ресурсных индикаторах. 
Но правда заметил странные нестабильные подвисания. Локализовать их пока не удалось. И работа дебага как-то изменилась. Иногда приходится ждать когда начнет работать сама программа. Возможно это как-то связано с подкачкой истории.

 

win7 64, mt5 1968 после этого билда все открепленные графики поломались:

все индикаторы отображаются с минутной задержкой или не отображаются вообще,

объект chart не отрисовывается

обработчики событий нажатий кнопок не работают

всё висит, думает, задержка более минуты...


Как откатить на предыдущий билд?

 
Обратил внимание, что в библиотеке Generic имеется метод IComparable::Compare, однако в оригинальной библиотеке .Net этот метод называется CompareTo.
 

Компилятор выдаёт очень скудную информацию об ошибках в шаблонных классах. Не указываются значения типов, с которыми раскрывается данный шаблон.  Это очень сильно затрудняет поиск ошибки в коде.  Вот пример:

void F(int) {  }

template<typename T>
class A
{
 public:
  void f(T a)  { F(a); }  // 'a' - parameter conversion not allowed
};

//………… Где то в другом месте программы:
class B {  };

void SomeFunction()
{
  A<B*> a;
}

Не имея информации о том, какими типами инициирован шаблон, сложно понять, из какой части программы он мог быть вызван.  Прошу расширить описание ошибок, добавив туда описание типов шаблона.

А по хорошему, нужно также указывать ссылку на то место, откуда был инициирован шаблон.

Например в VS всё очень легко и удобно, можно увидеть не только место вызова текущего шаблона, но и весь предыдущий маршрут перехода по шаблонам (при его наличии). От начальной точки иницирования типами и до места возникновения ошибки. А в MQL всё очень тяжело с этим.

 
threat:

win7 64, mt5 1968 после этого билда все открепленные графики поломались:

все индикаторы отображаются с минутной задержкой или не отображаются вообще,

объект chart не отрисовывается

обработчики событий нажатий кнопок не работают

всё висит, думает, задержка более минуты...


Как откатить на предыдущий билд?

У меня тоже странные ощущения от 1968.

Вот тут есть архив старых билдов.

 

Предлагаю ввести в MQL возможность использования r-value аргумента функции, подобно тому как это существует в C++:

template<typename T>
void f(T&&Value) {  }

Это необходимо в шаблонах для возможности перегрузить варианты с l-value и r-value, и тем самым создавать универсальные решения для любых типов данных:

template<typename T> class A {   void f(T&Value) {  }   void f(T&&Value) {  } };

template<typename T> void F(T&Value) {  } template<typename T> void F(T&&Value) {  }

Хотя тут можно обойтись и простой передачей по значению.

В MQL же передавать по значению классы и структуры нельзя, и это делает невозможным создание гибких универсальных контейнеров.  Приходится городить отдельно вариант для структур/классов, и отдельно - для простых типов и указателей, могущих передаваться как угодно:

template<typename T>
class A_simple
{
  void f(T Value) {  }
};

template<typename T>
class A_struct
{
  void f(T&Value) {  }
};

Поэтому требуется либо возможность передавать все типы по значению, либо возможность задания аргумента rvalue.  В идеале - и то, и другое.

 
Alexey Navoykov:

Предлагаю ввести в MQL возможность использования r-value аргумента функции, подобно тому как это существует в C++:

Это необходимо в шаблонах для возможности перегрузить варианты с l-value и r-value, и тем самым создавать универсальные решения для любых типов данных:

Хотя тут можно было бы обойтись и простой передачей по значению.

В MQL же передавать по значению классы и структуры нельзя, и это делает невозможным создание гибких универсальных контейнеров.  Приходится городить отдельно вариант для структур/классов, и отдельно - для простых типов и указателей, которые могут передаваться как угодно:

Поэтому требуется либо возможность передавать любые типы по значению, либо возможность задания аргумента rvalue.  В идеале - и то, и другое.

В MQL по значению ссылочные типы передавать можно:

class CClass
{
public:
   int ID;
};

void foo(CClass& c)
{
   printf((string)c.ID);
}

void OnStart()
{
   CClass* c = new CClass();
   c.ID = 34;
   foo(c);
}

Однако Вы правы в том, что разделение на ссылочные и значимые типы делает написание универсального generic-контейнера весьма сложным. Т.к. оператор delete применим исключительно к ссылочным типам, а generic не знает ссылочные тип он хранит или значимый, поэтому и использовать его он не может.

 
// Зависание Терминала на десятки секунд при переключении на другой торговый сервер
int OnCalculate( const int, const int, const int, const double &[] )
{
  for (int i = 0; i < 10; i++)
    ChartRedraw();
  
  return(0);
}

Можно просто нажать на "Обновить", чтобы увидеть, что чарт с индикатором завис.


ЗЫ Лог работы индикатора на одном пустом чарте.

2019.01.09 17:14:06.682 indicator is too slow, 30420 ms. rewrite the indicator, please
2019.01.09 17:21:01.051 indicator is too slow, 30561 ms. rewrite the indicator, please
2019.01.09 17:27:36.834 indicator is too slow, 30467 ms. rewrite the indicator, please
2019.01.09 17:34:12.278 indicator is too slow, 30467 ms. rewrite the indicator, please
2019.01.09 17:40:48.481 indicator is too slow, 30514 ms. rewrite the indicator, please
2019.01.09 17:47:23.671 indicator is too slow, 30343 ms. rewrite the indicator, please
2019.01.09 17:53:58.584 indicator is too slow, 30436 ms. rewrite the indicator, please

На Терминале никаких действий не совершалось.

 
Vasiliy Sokolov:

В MQL по значению ссылочные типы передавать можно:

Так у вас же по ссылке передаётся. Указатель просто преобразовывается в ссылку и всё.

Вот если бы было

void foo(CClass c)
{
}

тогда другое дело.

Vasiliy Sokolov:

Т.к. оператор delete применим исключительно к ссылочным типам, а generic не знает ссылочные тип он хранит или значимый, поэтому и использовать его он не может.

delete применим к указателям, поэтому с этим проблем вообще нет. Оборачиваем его в отдельную шаблонную функцию, принимающую указатель, а для остальных типов вызывается шаблон-пустышка:

template<typename T>
void Delete(T*ptr) { delete ptr; }
template<typename T>
void Delete(T&obj) { }
Причина обращения: