Про язык программирования MQL5

 

Вступления не будет. Там одни ..............

 

Сегодня сел и решил попробовать узнать объём прошлой свечи с высшего ТФ текущего символа.

Я не буду долго расказывать что я ощутил, но просто сравните сами.

 

MQL4

Alert(iVolume(Symbol(),PERIOD_D1,1)); 

 

MQL5

int volumes;

   double H_V[];

//// 

 void OnInit()

  {

   volumes=iVolumes(Symbol(),PERIOD_D1,VOLUME_TICK);

} 

////

 CopyBuffer(volumes,0,0,2,H_V);

 ArraySetAsSeries(H_V,true);

 Alert(H_V[1]);
 

Это тем кто спрашивал "Как это не торговый язык?"

А вот так. 

 

А если так

void OnTick()
  {
   long arrVolume[1];
    CopyTickVolume(_Symbol, PERIOD_D1, 1, 1, arrVolume);
   Alert(arrVolume[0]);
  }
 
AlexeyVik:

А если так

Не важно. 

Аналогичная работа с iCustom. 

 

P.S. И размер буфера не надо объявлять. 

 
eevviill:

Не важно. 

Очень важно.


Аналогичная работа с iCustom.

Не аналогично по скорости и расходам.


Ваш исходный пример в MQL4 слишком прост и показывает доступ к одному элементу. Причем к этому одному элементу идет глубокий спуск внутрь рыночного окружения.

В нынешних условиях (особенно в MT5), когда нужно обрабатывать огромные массивы данных (им счет уже идет на миллионы и десятки миллионов элементов, например - глубокие тики в МТ5), лазать за каждым элементом вглубь системы очень дорого и медленно. Именно поэтому в MQL5 идеология перестроена на более эффективные методы, ориентированные на массовую обработку.

В десятки раз более эффективно с помощью CopyXXXX функций изредка/однократно перекладывать куски данных в свой локальный массив, чтобы потом иметь максимально быстрый и прямой(без синхронизаторов и глубокой проходки внутрь системы) доступ при работе с этим массивом. В результате обработка данных может быть в десятки и сотни раз быстрее старых методов из MQL4.

Грубый пример:

MQL4

   double average=0;
   
   for(int i=0;i<10000;i++)
      average+=Close[i];
   
   average/=10000;


MQL5

   double bclose[10000];
   double average=0;

   if(CopyClose(NULL,0,0,10000,bclose)==10000)
     {
      for(int i=0;i<10000;i++)
         average+=bclose[i];
      average/=10000;
     }


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

В MQL4 тоже есть такие CopyXXXX функции, что позволяет ускорить и MQL4 код на массовых вещах.


Еще раз повторю суть: на первое место выходит эффективность и производительность. Иначе не совладать с пережевыванием больших объемов данных.

 
eevviill:

Не важно. 

Аналогичная работа с iCustom. 

 

P.S. И размер буфера не надо объявлять. 


Конечно не важно, ведь твоя задача не научиться, а обвинить разработчиков.
 
Renat:
Очень важно.


Не аналогично по скорости и расходам.


Ваш исходный пример в MQL4 слишком прост и показывает доступ к одному элементу. Причем к этому одному элементу идет глубокий спуск внутрь рыночного окружения.

В нынешних условиях (особенно в MT5), когда нужно обрабатывать огромные массивы данных (им счет уже идет на миллионы и десятки миллионов элементов, например - глубокие тики в МТ5), лазать за каждым элементом вглубь системы очень дорого и медленно. Именно поэтому в MQL5 идеология перестроена на более эффективные методы, ориентированные на массовую обработку.

В десятки раз более эффективно с помощью CopyXXXX функций изредка/однократно перекладывать куски данных в свой локальный массив, чтобы потом иметь максимально быстрый и прямой(без синхронизаторов и глубокой проходки внутрь системы) доступ при работе с этим массивом. В результате обработка данных может быть в десятки и сотни раз быстрее старых методов из MQL4.

Грубый пример:


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

В MQL4 тоже есть такие CopyXXXX функции, что позволяет ускорить и MQL4 код на массовых вещах.


Еще раз повторю суть: на первое место выходит эффективность и производительность. Иначе не совладать с пережевыванием больших объемов данных.

Спасибо.

1) А разве при копировании в свой буффер мы не лезем внутрь?

2) Да мой пример прост. Но именно это делает его(mql4) практичным. Вчера ещё увидел что индикаторные буфера надо ставить с помощью ArraySetAsSeries. Это ужас.

3) Почему нельзя  создать хендл(volumes=iVolumes(Symbol(),PERIOD_D1,VOLUME_TICK);) и потом просто обращатся как volumes[1]? При таком обращении автоматом будет скопирован один елемент.

4) Почему нельзя добавить доступ к тайм сериям(хотябы) такой как в mql4? Кому надо будет скорость тот выберет скорость, кому практичность тот практичность. 

 

И ещё одна непрактичность.

В терминале не видно неоткомпилированых файлов. 

 
eevviill:

И ещё одна непрактичность.

В терминале не видно неоткомпилированых файлов. 

В терминале исходники и не должны быть видны. Работа с исходниками ведётся в MetaEditor'e.
 
eevviill:

И ещё одна непрактичность.

В терминале не видно неоткомпилированых файлов. 

Renat

Вы можете прокоментировать?

Это же практично. Как в мт4.

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

 
eevviill:

Спасибо.

1) А разве при копировании в свой буффер мы не лезем внутрь?

Один раз, а не 10000 раз.

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


2) Да мой пример прост. Но именно это делает его(mql4) практичным. Вчера ещё увидел что индикаторные буфера надо ставить с помощью ArraySetAsSeries. Это ужас.

Нисколько не делает практичным. Делает медленным и ограниченным на самом деле.

Зачем вам вызывать ArraySetAsSeries? Используйте прямой метод доступа без переопределения направления.


3) Почему нельзя  создать хендл(volumes=iVolumes(Symbol(),PERIOD_D1,VOLUME_TICK);) и потом просто обращатся как volumes[1]? При таком обращении автоматом будет скопирован один елемент.

Ответы выше.

Спуск вниз за одиночными значениями в хранилища данных, попутно ожидая синхронизации - это очень дорого и медленно. В десятки и сотни раз быстрее сходить один раз за 100-1000 элементов и потом самым быстрым образом доступаться к ним в локальном буфере.


4) Почему нельзя добавить доступ к тайм сериям(хотябы) такой как в mql4? Кому надо будет скорость тот выберет скорость, кому практичность тот практичность. 

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

При наличии плохого пути большинство будут использовать именно его. И к практичности это не имеет никакого отношения.


Чтобы достигнуть гармонии, лучше понять и принять следующие принципы:

  1. это high performance задачи, а не ленивые эксперименты
  2. MQL5 прошел 4 генерации (MQL, MQL2, MQL4) и его функционал осознанно сделан таким для решения современных задач