Ошибки, баги, вопросы - страница 1499

[Удален]  
Vladimir Pastushak:
Есть где либо подтверждение ?

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

https://www.mql5.com/ru/market/rules 

Правила покупки торговых роботов, индикаторов, книг и журналов в MetaTrader Market
Правила покупки торговых роботов, индикаторов, книг и журналов в MetaTrader Market
  • www.mql5.com
Общие положения и правила пользования сервисом Market
[Удален]  
В этом посте автоматом уменьшенная по разрешению картинка аж в 6 раз больше по размеру (байт), чем оригинал. Зачем?
 
Alexey Kozitsyn:
Slawa, добрый день, прокомментируете по библиотеке (вопрос выше)?

Вот так исправим

long CChart::Open(const string symbol_name,const ENUM_TIMEFRAMES timeframe)
  {
   m_chart_id=ChartOpen(symbol_name,timeframe);
   if(m_chart_id==0)
      m_chart_id=-1;
   return(m_chart_id);
  }
[Удален]  
Slawa:

Вот так исправим

Да, спасибо, оптимальный вариант. Для библиотеки. А по поводу ошибки 4024?
 
Slawa:

Вот так исправим

Какой смысл это делать? Стандартную библиотеку нужно использовать не как хочется пользователю, а в строгом соответствии с идеологией ее структуры. Пользователь Alexey Kozitsyn ее использует не верно вот и получает кучу багов на выходе. Просто после создания объекта CCart нужно привязать график к объекту класса методом Attach. Этот метод перегруженный и может привязать как текущий график так и нужный. А Ваше изменение в метод Open убьет возможность работы с текущим графиком.

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

 
Alexey Kozitsyn:

Вопрос по стандартной библиотеке МТ4.

Файл Chart.mqh

Хочу открыть график. Использую метод Open(const string symbol_name,const ENUM_TIMEFRAMES timeframe).

1. Если использовать недоступный символ, то функция ChartOpen() вернет ошибку #4024 - внутренняя ошибка. Не спорю, ошибка может быть и внутренняя, но ведь есть код ошибки гораздо более точный - #4106 - неизвестный символ. Возможно, стоит изменить код возвращаемой ошибки? Т.к. 4024 ничего не говорит разработчику о том, где искать ошибку.

2. В случае неудачи ChartOpen() присваивает полю m_chart_id значение 0, т.е. получается, что мы начинаем работать с текущим графиком, а это не верно, т.к. у нас не получилось открыть нужный нам для работы график. Следовательно, если не вызвать метод Detach(), то текущий график после работы просто закроется. Также считаю это не верным подходом. Лучше бы функция ChartOpen() возвращала -1 в случае ошибки.

Перед тем как работать с графиком, его нужно привязать к объекту класса методом Attach !!! Если не хотите работать с текущим чартом ( 0 ) то реализуйте у себя эту проверку и запрет на использование в работе текущего графика.

И что значит поработать с графиком и не закрыв его методом Detach выйти? Неужели трудно написать одну строчку в деструкторе своих классов либо в OnDeinit ? Работу с объектами нужно строго контролировать, тогда и ошибок избежите.

[Удален]  
coderex:

Какой смысл это делать? Стандартную библиотеку нужно использовать не как хочется пользователю, а в строгом соответствии с идеологией ее структуры. Пользователь Alexey Kozitsyn ее использует не верно вот и получает кучу багов на выходе. Просто после создания объекта CCart нужно привязать график к объекту класса методом Attach. Этот метод перегруженный и может привязать как текущий график так и нужный. А Ваше изменение в метод Open убьет возможность работы с текущим графиком.

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

Я же выше ясно написал какой смысл это делать. Если произошла ошибка открытия графика (например, если указан некорректный символ) то, зачем-то, по аналогии с методом Attach(void), метод Open() привязывает к объекту идентификатор текущего графика. Зачем это навязывать? Если я захочу работать с текущим графиком, я, как Вы и сказали, вызову метод Attach(void) { m_chart_id=ChartID(); } и все. А тут получается явно ошибочная ситуация, в которой я почему-то начинаю работать не с тем, с чем нужно. Вообще, это проблема самой функции ChartOpen(), но раз ее не станут менять, то пусть хотя бы в библиотеке изменят.

Еще аргумент. Подумайте логически. Метод называется Open(). Он подразумевает, что что-то откроется новое! И мы с этим новым начнем работать. А тут выходит, что работаем мы со старым. Не вижу логики. А Вы, похоже, используете эту неточность в своих каких-то целях.

Этот метод перегруженный и может привязать как текущий график так и нужный. А Ваше изменение в метод Open убьет возможность работы с текущим графиком.

Что убьет? У Вас останется метод Attach(), он как и раньше будет делать то, что делал. Как Вы и сказали, сделайте проверку возвращаемого функцией Open() идентификатора и если он меньше 0, вызовите метод Attach(void). Все. Только не понятно, зачем городить такой огород, если сразу можно вызвать метод Attach(void) и привязать текущий график.

Возможно, я Вас не понимаю. Тогда приведите пример. 

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

Какое громкое заявление... Не думайте, что Вы умнее других, может оказаться, что это не так.
[Удален]  
coderex:

Перед тем как работать с графиком, его нужно привязать к объекту класса методом Attach !!! Если не хотите работать с текущим чартом ( 0 ) то реализуйте у себя эту проверку и запрет на использование в работе текущего графика.

И что значит поработать с графиком и не закрыв его методом Detach выйти? Неужели трудно написать одну строчку в деструкторе своих классов либо в OnDeinit ? Работу с объектами нужно строго контролировать, тогда и ошибок избежите.

Тоже самое могу посоветовать и Вам. Перед тем, как работать с графиком, его нужно привязать к объекту класса методом Attach(). Если Вы хотите работать с текущим графиком, используйте метод Attach( void ). Если Вы получили id графика ранее, используйте метод Attach( chart ). А, если же Вы хотите работать с новым графиком, вот тогда используйте метод Open(). И используйте этот метод только и исключительно для открытия нового графика и последующей работы с ним.

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

Вот Вы пишите интересно. Что-то не нравится, сделайте проверку там, добавьте туда и давайте будем жить, как жили раньше. Я могу вообще свою библиотеку написать, думаю, также как и Вы. А зачем, если за нас уже работу сделали? Давайте улучшать то, что есть, а не придумывать костыли. Хорошо, что разработчики быстро меня услышали и внесут нужные изменения. 

 

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

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

А вы создав объект класса, поработав с ним, просто бросаете объект на удаление, не отвязав чарт от объекта класса. А разработчики сейчас изменят метод Open, и назревает вопрос, а на кой тогда был создан перегруженный метод Attach?

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

[Удален]  
coderex:

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

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

А вы создав объект класса, поработав с ним, просто бросаете объект на удаление, не отвязав чарт от объекта класса. А разработчики сейчас изменят метод Open, и назревает вопрос, а на кой тогда был создан перегруженный метод Attach?

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

Давайте общаться на примерах. Ваши голословные обвинения начинают надоедать. И с чего Вы взяли, что Ваш, на мой взгляд, в корне ложный подход - правильный?

А вы создав объект класса, поработав с ним, просто бросаете объект на удаление, не отвязав чарт от объекта класса. А разработчики сейчас изменят метод Open, и назревает вопрос, а на кой тогда был создан перегруженный метод Attach? 

Про метод Detach() отдельный разговор. Сейчас мы обсуждаем то, что Open() может навязать работу с текущим графиком, причем неявно! Для этого есть метод Attach(). Кто и что убьет при корректировке метода Open() не понятно...