Тестируем CGraphic - вопросы и предложения - страница 10

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2019.02.17 06:56

Ещё раз решил повторить эксперимент, вот код

      //--- отключим показ ценового графика
      ChartSetInteger(0,CHART_SHOW,false);
      long chart=ChartID();

      CGraphic graphic;
         Print("0 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
      if(ObjectFind(chart,name)<0)
        {
         Print("1 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
         graphic.Create(chart,name,0,0,0,pix_X,pix_Y);//Создает графический ресурс, привязанный к объекту чарта 
         Print("2 Тут ошибка ",GetLastError()," ",cLng::CodeDescription(GetLastError()));
         ResetLastError();
        }

Вот результат

2019.02.17 08:55:19.845 Test_4G_CB (Si Splice,H1)       0 Тут ошибка 0 Операция выполнена успешно
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       1 Тут ошибка 4202 Графический объект не найден
2019.02.17 08:55:19.860 Test_4G_CB (Si Splice,H1)       2 Тут ошибка 4202 Графический объект не найден
Есть идеи о причине возникновения ошибки?
Мне сообщили, что ошибка в библиотеке - будет ли она исправлена?
 
Aleksey Vyazmikin:
Мне сообщили, что ошибка в библиотеке - будет ли она исправлена?

Телепаты в отпуске. А для обычных людей нужно:

  1. минимальный код (из которого выброшен весь ненужный мусор) который воспроизводит проблему.
  2. внятное описание - что именно не так (что хотели получить, что получили в итоге и почему думает что это ошибка)
  3. характеристики операционной системы, билд терминала, название торгового сервера

 
Aleksey Vyazmikin:
Мне сообщили, что ошибка в библиотеке - будет ли она исправлена?

Где вам сообщили, что там ошибка? Я вам сказал - ищите в библиотеке момент, где она может записаться в переменную _LastError. При этом не обязательно, что код с ошибкой отработал. Ведь там может быть поиск объекта (и если его нету, то в переменную будет вписан код ошибки) и его создание. Вот если объект не будет создан, то это да - ошибка, но он создаётся и всё отрабатывает. Но после проверки код ошибки (объект до его создания отсутствовал) будет записан в переменную, которую вы потом и считываете у себя в коде.

 
Vladimir Karputov:

Телепаты в отпуске. А для обычных людей нужно:

  1. минимальный код (из которого выброшен весь ненужный мусор) который воспроизводит проблему.
  2. внятное описание - что именно не так (что хотели получить, что получили в итоге и почему думает что это ошибка)
  3. характеристики операционной системы, билд терминала, название торгового сервера

1. Код

//+------------------------------------------------------------------+
//|                                              CB_Model_Analiz.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string name="Name";
   long chart=ChartID();

   CGraphic graphic;
   Print("0 Тут ошибка ",GetLastError());
   ResetLastError();
   if(ObjectFind(chart,name)<0)
     {
      Print("1 Тут ошибка ",GetLastError());
      ResetLastError();
      graphic.Create(chart,name,0,0,0,100,100);//Создает графический ресурс, привязанный к объекту чарта 
      Print("2 Тут ошибка ",GetLastError());
      ResetLastError();
     }
   graphic.Destroy();
  }
//+------------------------------------------------------------------+

2. Не ожидается получения сообщений об ошибке в логе

2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  1 Тут ошибка 4202
2019.02.17 10:37:46.326 CB_Model_Analiz (Si Splice,H1)  2 Тут ошибка 4202

3. Windows 7 Home 32 бита, билд 1940, к серверу не подключен при тестировании - брокер Открытие. 

 
Artyom Trishkin:

Где вам сообщили, что там ошибка? Я вам сказал - ищите в библиотеке момент, где она может записаться в переменную _LastError. При этом не обязательно, что код с ошибкой отработал. Ведь там может быть поиск объекта (и если его нету, то в переменную будет вписан код ошибки) и его создание. Вот если объект не будет создан, то это да - ошибка, но он создаётся и всё отрабатывает. Но после проверки код ошибки (объект до его создания отсутствовал) будет записан в переменную, которую вы потом и считываете у себя в коде.

Библиотека либо должна выдавать ошибку при фактической ошибке, либо корректно обрабатывать ситуацию и не выдавать ошибку там, где её нет. Если использование мной библиотеки не описано в классе при проверке на ошибки, то надо это прописать. Во всяком случая пользователю неразумно править библиотеки производителя продукта.

 
Aleksey Vyazmikin:

Библиотека либо должна выдавать ошибку при фактической ошибке, либо корректно обрабатывать ситуацию и не выдавать ошибку там, где её нет. Если использование мной библиотеки не описано в классе при проверке на ошибки, то надо это прописать. Во всяком случая пользователю неразумно править библиотеки производителя продукта.

Там нет ошибки, читайте ещё раз:

Где вам сообщили, что там ошибка? Я вам сказал - ищите в библиотеке момент, где она может записаться в переменную _LastError. При этом не обязательно, что код с ошибкой отработал. Ведь там может быть поиск объектаесли его нету, то в переменную будет вписан код ошибки) и его создание. Вот если объект не будет создан, то это да - ошибка, но он создаётся и всё отрабатывает. Но после проверки код ошибки (объект до его создания отсутствовал) будет записан в переменную, которую вы потом и считываете у себя в коде.

Поэтому - это только ваш интерес узнать почему вы считываете ошибку после штатного выполнения кода. Вы скорее всего не понимаете, что содержание в переменной _LastError кода, отличного от нуля, вовсе не означает обязательное наличие ошибки в коде CGraphic, и не только в нём. В данном случае возможно это простой результат поиска существования объекта, который выполнялся внутри CGraphic в СБ. Был запрос объекта по имени, вернулся результат -1 и в _LastError вписался код 4202. Далее объект был создан, всё отработало и был возврат в вызывающую программу. А в ней вы сразу считываете код ошибки и получаете его. Но ошибки никакой нету - вы видите результат запросов внутри СБ.

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

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

 
Artyom Trishkin:

Там нет ошибки, читайте ещё раз:

Поэтому - это только ваш интерес узнать почему вы считываете ошибку после штатного выполнения кода. Вы скорее всего не понимаете, что содержание в переменной _LastError кода, отличного от нуля, вовсе не означает обязательное наличие ошибки в коде CGraphic, и не только в нём. В данном случае возможно это простой результат поиска существования объекта, который выполнялся внутри CGraphic в СБ. Был запрос объекта по имени, вернулся результат -1 и в _LastError вписался код 4202. Далее объект был создан, всё отработало и был возврат в вызывающую программу. А в ней вы сразу считываете код ошибки и получаете его. Но ошибки никакой нету - вы видите результат запросов внутри СБ.

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

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

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

Нет, у меня нет компетенции искать ошибку в сложном коде, а потом получать ответ о том, что так и было задумано.

Скажите пожалуйста, это сообщение ошибка пользователя или нет?

2019.02.17 11:08:42.901 Test_4G_CB (Si Splice,H1)       invalid pointer access in 'Test_4G_CB.mq5' (909,7)

Указывает на этот код - D.PointsFill(false);

      CCurve *D=graphicT.CurveAdd(X_04,Y_04,ColorToARGB(DarkOrange,256),CURVE_POINTS,Interval_04);//Создает и добавляет кривую на график
      D.PointsFill(false);//Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
      D.PointsType(POINT_VERTICAL_DASH);//Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
 
Aleksey Vyazmikin:

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

Нет, у меня нет компетенции искать ошибку в сложном коде, а потом получать ответ о том, что так и было задумано.

Скажите пожалуйста, это сообщение ошибка пользователя или нет?

Указывает на этот код - D.PointsFill(false);

Вообще не понял смысла фразы.

Мне кажется, что я уже всё вам подробно расписал.

Не знаю. Мало информации.

 
Artyom Trishkin:

Вообще не понял смысла фразы.

Мне кажется, что я уже всё вам подробно расписал.

Не знаю. Мало информации.

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

Вот и у меня нет информации, как на эту ошибку реагировать...

 
Aleksey Vyazmikin:

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

Вот и у меня нет информации, как на эту ошибку реагировать...

Нужно чётко осознавать, что ошибкой является не наличие в _LastError кода, отличного от нуля, а возврат функцией результата, указывающего на ошибочное исполнение этой функции. А в _LastError вписывается код, который вам точно укажет на ту ошибку, возникновение которой привело к ошибочному исполнению функции. Поэтому очень сомнительно закладываться в своей логике на описание кода ошибки, хранящейся в сервисной переменной, вместо прямого использования кода возврата функции. Если функция вернула -1 или false или 0 (для каждой функции описан в справке её код ошибочного выполнения), так вот - только анализ результата, возвращаемого функцией должен вами отрабатываться, а не код в _LastError, который не указывает на наличие ошибки, а используется для указания на причину возврата функцией некоего результата.

Функция поиска объекта возвращает значение меньше нуля в случае, если объекта с заданным именем не существует. Ошибка ли это? Нет. Это штатный ответ функции, на основании которого вы и принимаете решение о создании объекта с заданным именем. При этом код, содержащийся в _LastError прямо говорит о том, что "Объекта с запрошенным именем не существует" - можно его создавать.

В общем, устал я вам объяснять. Кто хочет - тот поймёт.