Это тем кто спрашивал "Как это не торговый язык?"
А вот так.
А если так
void OnTick() { long arrVolume[1]; CopyTickVolume(_Symbol, PERIOD_D1, 1, 1, arrVolume); Alert(arrVolume[0]); }
А если так
Не важно.
Аналогичная работа с iCustom.
P.S. И размер буфера не надо объявлять.
Не важно.
Аналогичная работа с 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 код на массовых вещах.
Еще раз повторю суть: на первое место выходит эффективность и производительность. Иначе не совладать с пережевыванием больших объемов данных.
Не важно.
Аналогичная работа с iCustom.
P.S. И размер буфера не надо объявлять.
Конечно не важно, ведь твоя задача не научиться, а обвинить разработчиков.
Очень важно.
Не аналогично по скорости и расходам.
Ваш исходный пример в 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? Кому надо будет скорость тот выберет скорость, кому практичность тот практичность.
И ещё одна непрактичность.
В терминале не видно неоткомпилированых файлов.
И ещё одна непрактичность.
В терминале не видно неоткомпилированых файлов.
Спасибо.
1) А разве при копировании в свой буффер мы не лезем внутрь?
Один раз, а не 10000 раз.
Похоже, вы не совсем понимаете, что происходит внутри системы и какие ресурсы тратятся при запросах в область рыночного окружения.
2) Да мой пример прост. Но именно это делает его(mql4) практичным. Вчера ещё увидел что индикаторные буфера надо ставить с помощью ArraySetAsSeries. Это ужас.
Нисколько не делает практичным. Делает медленным и ограниченным на самом деле.
Зачем вам вызывать ArraySetAsSeries? Используйте прямой метод доступа без переопределения направления.
3) Почему нельзя создать хендл(volumes=iVolumes(Symbol(),PERIOD_D1,VOLUME_TICK);) и потом просто обращатся как volumes[1]? При таком обращении автоматом будет скопирован один елемент.
Ответы выше.
Спуск вниз за одиночными значениями в хранилища данных, попутно ожидая синхронизации - это очень дорого и медленно. В десятки и сотни раз быстрее сходить один раз за 100-1000 элементов и потом самым быстрым образом доступаться к ним в локальном буфере.
4) Почему нельзя добавить доступ к тайм сериям(хотябы) такой как в mql4? Кому надо будет скорость тот выберет скорость, кому практичность тот практичность.
Не надо потворствовать плохим практикам, а нужно указывать более правильный путь.
При наличии плохого пути большинство будут использовать именно его. И к практичности это не имеет никакого отношения.
Чтобы достигнуть гармонии, лучше понять и принять следующие принципы:
- это high performance задачи, а не ленивые эксперименты
- MQL5 прошел 4 генерации (MQL, MQL2, MQL4) и его функционал осознанно сделан таким для решения современных задач
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вступления не будет. Там одни ..............
Сегодня сел и решил попробовать узнать объём прошлой свечи с высшего ТФ текущего символа.
Я не буду долго расказывать что я ощутил, но просто сравните сами.
MQL4
MQL5