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

 
Aleksey Vyazmikin #:

Напишу сюда - билд 3320 - убил кучу времени на выявления аномалии, по порядку.

Делай раз

Получаем

То inf, то ноль - отчего так?

Делай два

Получаем

И делай три

получаем уже

Думаю, это сделано для развития шизофрении...

Спасибо за сообщение, исправлено.

Оптимизатор компилятора некорректно приводил константу inf к 32 битному целому

 
Здравствуйте. Используются объекты "График" для создания в одном графике общего экрана на 30 валютных пар. Для этого созданы синтетические недостающие инструменты. Выявилось, что по синтетическому инструменту не происходит автопрокрутка и показ новых свеч. Линия цены движется честно при этом. Загрузка ЦП не выше 20%. В данном случае формула инструмента: 1/ask(EURAUD). При изменении формулы инструмента на 1/ask("EURAUD") график актуализировался, но далее, думаю, опять будет стоять. После переоткрытия терминала актуализируется тоже. Перезагрузка сохраненного шаблона не спасает. "Обновить" также не помогает. С формулой  0-ask(EURAUD) ситуация та же. Переключение на другой аккаунт и обратно - не изменяет тоже ничего к лучшему.

Файлы:
err.jpg  38 kb
 
Ilyas #:

Спасибо за сообщение, исправлено.

Оптимизатор компилятора некорректно приводил константу inf к 32 битному целому

Спасибо.

 
fxsaber #:
Локализовал.

Отлично - хорошо, что благодаря нашим усилиям ошибку признали и испраили.

 

Мучаюсь с CGraphic — базовый класс для создания пользовательских графиков.

Или я не понимаю описание, тогда надо его сделать понятней, или всё как то криво работает.

Задача - добавлять на график линии\точки по необходимости, после определенного момента удалить график и строить новый график.

Для очистки данных я пробовал использовать 

graphicL.Destroy();//Удаляет с чарта график и уничтожает графический ресурс.

Это не помогает никак - при повторном вызове функции все точки на месте.

Я решил воспользоваться 

CurveRemoveByIndex

Удаляет кривую по заданному индексу.


Думаю, раз можно удалить по индексу, то надо узнать всего сколько там кривых

CurvesTotal

Возвращает количество кривых для данного графика.


Хорошо, в моем случае их было 10, как я и ожидал, простой перебор в цикле по 10 индексам для удаления давал половинчатый результат - ну думаю, наверное индексы не по порядку присвоились - перебрал до INT_MAX - но всё равно - осталось 5 после удаления. Подумав, решил проверить - не происходит ли переиндексация - бинго(!) - теперь начиная каждый раз с нуля удалил все якобы кривые.

Однако, на самом графике остаются кривые - даже после принудительного добавления пустых кривых и перерисовки графика.

Вопросы:

1. Как получать индексы кривых для удаления, что бы это делать быстрей?

2. Как визуально очистить график от кривых, что б рисовать новые?

#include <Graphics\Graphic.mqh>
#include <Graphics\Axis.mqh>
CGraphic graphicL;

void OnStart()
{
   double _X[1];
   double _Y[1];
   bool flag=false;
   for(int i=0; i<10; i++)
   {
      _X[0]=(double)i;
      _Y[0]=(double)((i+1)*5);
      if(i==10-1)flag=true;
      Graf_Test(_X,_Y,"Test_"+IntegerToString(i,2,'0'),flag);
      Sleep(2000);
   }
}

//+------------------------------------------------------------------+
//|Построение графика - удаление/сохранение по ключу                                              |
//+------------------------------------------------------------------+
void Graf_Test(double &X[],double &Y[],string Type="",bool Dell_Save=false)
{

   string NameGraf="Test_"+Type+"_";
   long chart=ChartID();
   if(ObjectFind(chart,NameGraf)<0)
   {
      graphicL.Create(chart,NameGraf,0,0,0,800,400);//Создает графический ресурс, привязанный к объекту чарта
   }
   graphicL.Attach(chart,NameGraf);//Получить/создать  графический ресурс и привязать его к экземпляру класса CGraphic
   CCurve *A=graphicL.CurveAdd(X,Y,ColorToARGB(Green,255),CURVE_POINTS,Type);//Создает и добавляет кривую на график
   graphicL.CurvePlotAll();//Отрисовывает все ранее созданные кривые
   graphicL.Update();//Отображает на экране сделанные изменения

   if (Dell_Save==true)//Удалим все линии или очистим график
   {
      int Line_Total=graphicL.CurvesTotal();
      Print("До=",Line_Total);
      int i=0;//Индекс кривой
      while(graphicL.CurvesTotal()>0 && !IsStopped())
      {
         if(graphicL.CurveRemoveByIndex(i))i=0;
         else
         {
            if(i<INT_MAX)i++;
            else break;
         }
      }
      Print("После=",graphicL.CurvesTotal());
      
      graphicL.CurvePlotAll();//Отрисовывает все ранее созданные кривые
      graphicL.Update();//Отображает на экране сделанные изменения
      graphicL.Destroy();//Удаляет с чарта график и уничтожает графический ресурс.

   }
}
 
Aleksey Vyazmikin #:



Хорошо, в моем случае их было 10, как я и ожидал, простой перебор в цикле по 10 индексам для удаления давал половинчатый результат - ну думаю, наверное индексы не по порядку присвоились - перебрал до INT_MAX - но всё равно - осталось 5 после удаления. Подумав, решил проверить - не происходит ли переиндексация - бинго(!) - теперь начиная каждый раз с нуля удалил все якобы кривые.

Если Вы удаляет объекты по индексу, то цикл надо делать от максимального индекса к нулю.
 
Sergey Gridnev #:
Если Вы удаляет объекты по индексу, то цикл надо делать от максимального индекса к нулю.

Знать бы ещё индекс...

Кстати, посмотрел - всегда индекс ноль у меня получился после удаления прошлого...
 
Скорее всего тут нужно создавать указатель на CGraphic а потом его удалять
 
Aleksei Beliakov #:
Скорее всего тут нужно создавать указатель на CGraphic а потом его удалять

Можете кодом пример показать - пока не понял как.

 

В общем проблема оказалась в том, что код генерировал новое имя объекта

 string NameGraf="Test_"+Type+"_";

и удалялась только один последний объект (точка), как я понял.