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

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

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

Когда вы просите "гарантированно дайте", вероятнее всего это запрос "ничего не хочу знать, хочу продолжать писать как хочу, не хочу думать о производительности и блокировках, просто дайте"?


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

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

Это сразу отрезвляет.

Давайте оставим только один тик(новый бар) для нового типа обработки данных индикатором в предполагаемой версии, кому нравится многократный пересчет нулевого бара и грааль в нулевом баре - пускай сидят на существующей версии. В OnInit добавить новую функцию iOnCalculate - хэндл на одну из функций ТФ/Символ OnCalculate в индикаторе, как iCustom, только получается чуть ближе, индикаторные буферы по OnCalculate привязывать к хэндлу iOnCalculate. В функции индикатора типа OnCalculate посылать только тик новый бар. Для терминала ничего не измениться, вся основная логика работы OnCalculate будет прежней, добавиться основное тело индикатора например OnMain.(Сейчас все тоже самое делается индикатором(и) прицепленным ресурсом к основному индикатору и вызываемые из него на новом баре).  

 
transcendreamer:


Не всегда нужна супер скорость, удобство работы также очень важно, сейчас написание мультивалютных индикаторов представляет собой "закат солнца вручную", даже в мт4 было проще потому что там всегда можно было получить через i-функции, пусть медленно, но получить, а в мт5 данные то есть то нет, и нужно ещё самому городить специальный код.

Давайте без теорий.

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

 
Renat Fatkhullin:

Давайте без теорий.

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


Пример во вложении, это ещё не законченный код, местами недописано, но запустить можно, также прикладываю шаблон для удобства,

предвидя обругивания я сразу скажу, я не программист, код наверняка не оптимальный, я вообще гуманитарий экономист, очень страдаю в мт5, в мт4 страдал меньше,

очень хочется простую и надёжную функцию которая бы делала сборку синхронизированного массива как описано выше https://www.mql5.com/ru/forum/289897/page2#comment_9363454

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


EDIT: исправил вложения

Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
  • 2018.11.14
  • www.mql5.com
Общее обсуждение: Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д.
Файлы:
 
Renat Fatkhullin:

Сделайте как я посоветовал, пожалуйста.

Иначе нужны полные материалы для 100% воспроизведения.

Странные у вас отношения к баг-рапортам. Мне как бы деньги не платят, чтоб я что-то доказывал. Я как мог расписал ситуацию.

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

А до этого они целый год не были тормознутые ?

Вот пример кода который завис спустя 25 минут после запуска на М30:

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

А вот результат:

1

 
transcendreamer:


Пример во вложении, это ещё не законченный код, местами недописано, но запустить можно, также прикладываю шаблон для удобства,

предвидя обругивания я сразу скажу, я не программист, код наверняка не оптимальный, я вообще гуманитарий экономист, очень страдаю в мт5, в мт4 страдал меньше,

очень хочется простую и надёжную функцию которая бы делала сборку синхронизированного массива как описано выше https://www.mql5.com/ru/forum/289897/page2#comment_9363454

которая бы однозначно выдавала нужные данные,

я не жалуюсь и не прошу написать за меня мой индикатор, я просто хочу (не только я кстати) удобную стандартную функцию.


EDIT: исправил вложения

Спасибо, сейчас будем проверять.
 
Stanislav Dray:

Странные у вас отношения к баг-рапортам. Мне как бы деньги не платят, чтоб я что-то доказывал. Я как мог расписал ситуацию.

Написанное ранее в этой теме никаким образом на баг репорт не тянет.

Все шло по схеме жалоб без каких-либо технических деталей. И только после моих запросов начали появляться детали.

 
Stanislav Dray:

Странные у вас отношения к баг-рапортам. Мне как бы деньги не платят, чтоб я что-то доказывал. Я как мог расписал ситуацию.

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

А до этого они целый год не были тормознутые ?

Вот пример кода который завис спустя 25 минут после запуска на М30:

А вот результат:


Загружен

2018.11.14 17:33:32.570 Experts expert Feezzzz (USDCHF,M30) loaded successfully

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


 
transcendreamer:


Пример во вложении, это ещё не законченный код, местами недописано, но запустить можно, также прикладываю шаблон для удобства,

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

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

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

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

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

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

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


 
Stanislav Dray:

Странные у вас отношения к баг-рапортам. Мне как бы деньги не платят, чтоб я что-то доказывал. Я как мог расписал ситуацию.

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

А до этого они целый год не были тормознутые ?

Вот пример кода который завис спустя 25 минут после запуска на М30:

А вот результат:

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

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