Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д. - страница 4

 
Renat Fatkhullin:

Сразу по коду и работе:

  1. CopyXXX функции в индикаторах не ждут полной синхронной закачки данных, а отдают что доступно. Иначе индикаторы бы напрочь все затормозили

  2. По всей видимости есть проблема с последующей работой, если с первого раза не синхронизировались все данные.
    Надо переделывать на щадящий режим "буду аккуратно дожидаться успешной докачки". Например, OnCalculate не вызывается.

  3. Плохо, что глобальная инициализация с максимальной нагрузкой вынесена в OnInit, где индикатор очень долго считает и ждет.
    При этом блокируется апдейт чартов этого символа и многим другим участникам приходится ждать и не получать свежих данных. Индикатор не должен надолго забирать себе ресурсы. Лучше долгую инициализацию равномерно растянуть на пошаговую/посимвольную инициализацию в OnCalculate, досчитывая по кусочкам.

  4. У меня этот индикатор выкачал по сети где-то 800 мбайт исторических данных для синхронизации

  5. В индикаторе заявлено 512 линий отрисовки, под которые самым явным образом выделяется память. Это чрезвычайно затратно. Используются 100 линий всего.

  6. Код плохо читаемый

1. да, и поэтому приходится вызывать их несколько раз с паузой, либо перезапускать вручную индикатор несколько раз, но и это не всегда помогает, и индикатор через некоторое время перестаёт рассчитываться

2. вполне допускаю, что текущий вариант не оптимален, я пробовал различные варианты, включая рекомендуемую функцию в документации (раздел "организация доступа к данным"), в последнем варианте немного упростил, и наверное также неоптимально вызывать функции iBarShift много раз, но с другой стороны если от них отказаться, то нужно делать специальную функцию подготовки синхронизированных данных, которую мне пока не удаётся написать, получается очень громоздко, а стандартной функции нет, да и если уж в языке предоставлена штатная возможность запрашивать время по индексу и индекс бара по времени, то логично было бы этой возможностью воспользоваться

3. в OnInit только определение портфельных комбинаций и назначение буферов, запросов в OnInit нет, опционально пробовал открывать графики всех инструментов М1 в фоне чтобы предотвратить пропадание кэша и вроде бы это помогает, на максимальной нагрузке конечно это всё ужасно, 28 графиков... первый запрос к данным идёт уже в OnCalculаte где я вызываю CopyClose в цикле с паузой (функция RequestData) предварительно чтобы данные прокэшировались и серии по всем инструментам собрались, а потом уже идёт обращение (SetupIntervals, CalculateEquity и остальные) и я рассчитывал таким образом, что все данные будут готовы и все вызовы iBarShift и iClose и др полезные функции будут возвращать прокэшированные данные, но это почему-то не всегда срабатывает

4. это наверное тиковые данные 800 мб?... но я не представляю как иначе сформировать пучок портфелей из 28 инструментов?, ведь они так или иначе должны быть запрошены, в мт4 с этим особой проблемы не было (вероятно потому что в мт4 все таймфреймы раздельно существуют)

5. дело в том что индикатор предполагает что могут быть задействовано много портфельных комбинаций, сейчас есть преднастроенная комбинация с 420 линиями + служебные линии (всякие машки, каналы, прочее), теоретически пользователь может запросить и все 512 линий, заранее нельзя ограничить число буфферов с помощью #property indicators_buffers, т.к. неизвестно сколько запросит пользователь, в мт4 на максимальной нагрузке подтормаживает но работает

6. при необходимости прокомментирую


P.S. я подумал, возможно Вы скачали не ту версию, потому как в первый раз я ошибся и выложил другую версию, потом исправил вложение.

P.P.S. пользуясь случаем хочу уточнить по функциональности синтетических графиков, будет ли как-то развиваться этот функционал? например хотелось бы делать не только формульные индексы, но и моделировать позиции покупки/продажи группы инструментов, сейчас это сделать затруднительно так как приходится писать громоздкую формулу для учёта стоимости пункта и размера контракта, и на истории стоимость пункта не меняется...

 

Renat Fatkhullin:

Индикатор не должен надолго забирать себе ресурсы. Лучше долгую инициализацию равномерно растянуть на пошаговую/посимвольную инициализацию в OnCalculate, досчитывая по кусочкам.

Это понятно, чтобы не тормозить другие программы в терминале, но вот тут возникает какое противоречие: при расчёте модели портфеля индикатору потребуются сразу все ряды данных, так как equity портфеля по ним считается, то есть без готовых данных как бы и не получится ничего посчитать, и для портфеля нужны все компоненты сразу, а если портфелей несколько и если между портфелями идёт сравнение или их суммирование, то сразу по нескольким портфелям, и тогда особо не растянуть, ведь это не скользящее окно которое можно по частям считать, здесь сначала идёт расчёт модели, а потом её отрисовка на истории (а потом с каждым тиком обновление последнего бара) - и тогда встаёт вопрос - а как вообще правильно писать такие индикаторы в мт5? - потому я и поднял вопрос про универсальную стандартную функцию которая бы Правильным Образом готовила массив синхронизированных данных для расчёта.

 
Vladimir Karputov:

Загружен

Сейчас 18.10 Всё работает.


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

Он вполне реален и проявляется не только у меня.

 
transcendreamer:

Это понятно, чтобы не тормозить другие программы в терминале, но вот тут возникает какое противоречие: при расчёте модели портфеля индикатору потребуются сразу все ряды данных, так как equity портфеля по ним считается, то есть без готовых данных как бы и не получится ничего посчитать, и для портфеля нужны все компоненты сразу, а если портфелей несколько и если между портфелями идёт сравнение или их суммирование, то сразу по нескольким портфелям, и тогда особо не растянуть, ведь это не скользящее окно которое можно по частям считать, здесь сначала идёт расчёт модели, а потом её отрисовка на истории (а потом с каждым тиком обновление последнего бара) - и тогда встаёт вопрос - а как вообще правильно писать такие индикаторы в мт5? - потому я и поднял вопрос про универсальную стандартную функцию которая бы Правильным Образом готовила массив синхронизированных данных для расчёта.

Вот это и есть ключевой недочёт. У меня та-же проблема.

В мт4 расчёт и отображение работает мгновенно, а вот в мт5 с индикаторами полная беда, хотя все графики с которых нужно получать цены, постоянно открыты. Получается, можно писать только простейшие индикаторы, наподобие однобуферных МАшек(

 

Точно есть баг на:

1) Server 2012 (build 9200) on Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memory: 3033 / 3839 Mb, Disk: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU Virtual  version (cpu64-rhel6), Memory: 1340 / 2047 Mb, Disk: 15 / 28 Gb, GMT+2


 
Stanislav Dray:

Точно есть баг на:

1) Server 2012 (build 9200) on Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memory: 3033 / 3839 Mb, Disk: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU Virtual  version (cpu64-rhel6), Memory: 1340 / 2047 Mb, Disk: 15 / 28 Gb, GMT+2

Ну у меня вот:

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400  @ 3.10GHz, Memory: 469 / 8182 Mb, Disk: 96 / 148 Gb, GMT+2

 
transcendreamer:

Это понятно, чтобы не тормозить другие программы в терминале, но вот тут возникает какое противоречие: при расчёте модели портфеля индикатору потребуются сразу все ряды данных, так как equity портфеля по ним считается, то есть без готовых данных как бы и не получится ничего посчитать, и для портфеля нужны все компоненты сразу, а если портфелей несколько и если между портфелями идёт сравнение или их суммирование, то сразу по нескольким портфелям, и тогда особо не растянуть, ведь это не скользящее окно которое можно по частям считать, здесь сначала идёт расчёт модели, а потом её отрисовка на истории (а потом с каждым тиком обновление последнего бара) - и тогда встаёт вопрос - а как вообще правильно писать такие индикаторы в мт5? - потому я и поднял вопрос про универсальную стандартную функцию которая бы Правильным Образом готовила массив синхронизированных данных для расчёта.

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

В OnInit вы должны простимулировать загрузку истории нужных инструментов одиночными вызовами CopyXXX, а вот дожидаться надо полной инициализации в OnCalculate.

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

 
Renat Fatkhullin:

Код поставил на отработку. Пока все нормально.

Файл без тела, кстати.

За 2 часа все нормально, таймер тикает в комментах с нужной датой.
 
Vitaly Muzichenko:

Вот это и есть ключевой недочёт. У меня та-же проблема.

В мт4 расчёт и отображение работает мгновенно, а вот в мт5 с индикаторами полная беда, хотя все графики с которых нужно получать цены, постоянно открыты. Получается, можно писать только простейшие индикаторы, наподобие однобуферных МАшек(

Лично я не вижу удобного и универсального способа, понимаю, что всё так устроено в угоду скорости работы терминала и программ в нём, обращаюсь к разработчикам: сделайте пожалуйста возможность программного запроса к терминалу, что бы терминал самостоятельно поддерживал в актуальном состоянии указанные символы указанных ТФ, и тиковую историю соответствующих символов.

 
Vitaly Muzichenko:

Вот это и есть ключевой недочёт. У меня та-же проблема.

В мт4 расчёт и отображение работает мгновенно, а вот в мт5 с индикаторами полная беда, хотя все графики с которых нужно получать цены, постоянно открыты. Получается, можно писать только простейшие индикаторы, наподобие однобуферных МАшек(

Надо смотреть код.

Вот в коде выше явно букет логических и ресурсных проблем.

Причина обращения: