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

 


alexluek:

Потеря связи не было, перерисовка на тиках, и чем больше ТФ тем реже.

А в методе расчета от начальной даты ло конечной (узнал что их 3) без

определения кол-ва баров, наверное такое и возникает (пересчитывает

все бары) но это пока размышления - будем проверять...

Может другой подход есть чтоб от этого изавиться...


Yedelkin:

Конечно, подход есть. Если if(prev_calculated==0), то проводим первоначальный расчёт для всех баров. Впоследствии, для каждого нового тика (если 0 < prev_calculated < rates_total) делаем расчёты типа for(int i=prev_calculated-1;i<rates_total;i++) только для последних появившихся баров.


Чегось все равно перерисовывает. Реализовалась так:


   int calculated1=BarsCalculated(StdDev1Handle);

...................

   if(CopyBuffer(StdDev1Handle,0,0,to_copy,ExtStdDev1Buffer)<to_copy)return(0);

......................

   int data1=CopyOpen(Symbol1,0,0,rates_total,Open1Buffer);

.....................

  for(int i=rates_total-2; i>=0; i--)
     {
      if(time[i]>=DateStart)

        {


То перерисовывает то нет, но все таки дело наверное в корректости работы кода

а не в терминале (но хотя бы не так выразительно теперь перерисовка...)

Тики есть или нет - все равно может перерисовать.

Такое впечатление что связности нет никакой (причинно-следственной связи)

Единственное что выноситься на ум так - слабый процессор или зависание

терминала (мт5). на МТ4 все работает без перерисовок.

 

alexluek:

...................

То перерисовывает то нет, но все таки дело в корректости работы кода

а не в терминале (но хотя бы не так выразительно теперь перерисовка...)

создайте заявку в сервис деск с проложением исходного кода, разберёмся.
 

Кто-нибудь работал со вторым вариантом функции ChartGetInteger:

2. Возвращает true или false в зависимости от успешности выполнения функции.
В случае успеха значение свойства помещается в приемную переменную, 
передаваемую по ссылке последним параметром.

bool  ChartGetInteger(
   long    chart_id,        // идентификатор графика
   int     prop_id,         // идентификатор свойства
   int     sub_window,      // номер подокна
   long&   long_var         // сюда примем значение свойства
   );

 ? Такое впечатление, что в приёмную переменную значение свойства не передаётся. По крайней мере, такое поведение замечено при использовании конструкции

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))
Функция возвращает true, но приёмная переменная windows содержит значение, полученное при инициализации этой переменной. При этом первый вариант функции выдаёт правильное значение. (И по мелочи: если приёмная переменная объявляется с типом long, то компилятор выдаёт предупреждение). 
 
Yedelkin:

Кто-нибудь работал со вторым вариантом функции ChartGetInteger:

 ? Такое впечатление, что в приёмную переменную значение свойства не передаётся. По крайней мере, такое поведение замечено при использовании конструкции

Функция возвращает true, но приёмная переменная windows содержит значение, полученное при инициализации этой переменной. При этом первый вариант функции выдаёт правильное значение. (И по мелочи: если приёмная переменная объявляется с типом long, то компилятор выдаёт предупреждение). 
Да, есть такое. Только я пытался запросить цвет фона. Хотел написать в сервисдеск, но забыл.
 
Lizar:
Да, есть такое. Только я пытался запросить цвет фона. Хотел написать в сервисдеск, но забыл.
Хорошо, я напишу.
 
Yedelkin:

Кто-нибудь работал со вторым вариантом функции ChartGetInteger:

 ? Такое впечатление, что в приёмную переменную значение свойства не передаётся. По крайней мере, такое поведение замечено при использовании конструкции

Функция возвращает true, но приёмная переменная windows содержит значение, полученное при инициализации этой переменной. При этом первый вариант функции выдаёт правильное значение. (И по мелочи: если приёмная переменная объявляется с типом long, то компилятор выдаёт предупреждение). 

Такое впечатление, что Вы используете не ту функцию. Это первый вариант функции (с тремя параметрами). Возвращает не true (как Вам кажется), а значение параметра

if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,windows))

Не вижу Вашего кода, но видимо правильно будет так:

long Chart=0,windows;
if(!ChartGetInteger(Chart,CHART_WINDOWS_TOTAL,0,windows))
  {
   //--- всё плохо
  }
 
uncleVic:

Такое впечатление, что Вы используете не ту функцию. Это первый вариант функции (с тремя параметрами). Возвращает не true (как Вам кажется), а значение параметра

Не вижу Вашего кода, но видимо правильно будет так:

Хм..., да, у меня был именно этот косяк - посмотрел свой старый код, где пытался использовать эту функцию.
 
uncleVic:

Такое впечатление, что Вы используете не ту функцию. Это первый вариант функции (с тремя параметрами). Возвращает не true (как Вам кажется), а значение параметра

ОК. Давайте разбираться.

1. Функция используется "та", поскольку в качестве своего примера Вы приводите функцию с тем же самым наименованием. Речь может идти только о том, какой именно вариант этой функции (первый или второй) используется.

2. Действительно, формально первый вариант функции имеет три параметра, а второй - четыре. Но при этом в описании параметра sub_window, который присутствует в обоих вариантах вызова,  чётко указано, что "Большинство свойств не требуют указания номера подокна". Возникает вопрос, требуется или не требуется указание номера окна для такого свойства, как CHART_WINDOWS_TOTAL (Общее количество окон графика, включая подокна индикаторов)?

3. Логично предположить, что для получения общего количества окон/подокон графика указание номера отдельно подокна не требуется. Этот вывод подкрепляется примером непосредственно из самого Справочника (раздел Свойства графиков):

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);

Аналогичный подход изложен и в разделе Операции с графиками / ChartWindowOnDropped.

Из этих примеров следует, что позиция авторов Справочника сводится к тому, что для получения общего количества окон/подокон графика указание номера отдельно подокна не требуется. Разумеется, в примерах использован первый вариант функции, но поскольку речь идёт об одном и том же свойстве (а именно: CHART_WINDOWS_TOTAL), то логично было бы предположить, что данный вывод распространяется и на второй вариант функции. Особенно если учесть, что Справочник не содержит каких-либо оговорок по поводу необходимости указания нулевого номера подокна для второго варианта функции.

4. Из приведённого Вами примера следует, что для второго варианта функции указывать третий параметр (sub_window) нужно всегда, даже если само свойство  не требует указания номера подокна. Т.е.  в отличие от первого варианта функции (который может использоваться как с двумя, так и с тремя параметрами), второй вариант функции всегда требует указания всех четырёх параметров. Правильно?

5. Если правильно, то мы выяснили две вещи. Во-первых, моя первоначальная версия возникновения проблемы оказалась ошибочной. Во-вторых, причина возникновения этой ошибочной версии кроется в неполноте информации, отражённой в Справочнике. Поэтому предлагаю внести в Справочник уточнение, согласно которому "Для второго варианта значение по умолчанию не предусмотрено, в связи с чем номер подокна необходимо указывать всегда. Для большинства свойств, которые не требуют указания номера подокна, требуется указывать 0 (главное окно графика)". Или что-то в этом роде.

За пример благодарю. Коротко и ясно. 

 
Yedelkin:
В первом варианте функции параметр int   sub_window=0  имеет умолчательное значение, поэтому его можно опустить, во втором такого умолчательного значения нет, значит его надо указывать.
  
 
Yedelkin:

ОК. Давайте разбираться.

1. Функция используется "та", поскольку в качестве своего примера Вы приводите функцию с тем же самым наименованием. Речь может идти только о том, какой именно вариант этой функции (первый или второй) используется.

2. Действительно, формально первый вариант функции имеет три параметра, а второй - четыре. Но при этом в описании параметра sub_window, который присутствует в обоих вариантах вызова,  чётко указано, что "Большинство свойств не требуют указания номера подокна". Возникает вопрос, требуется или не требуется указание номера окна для такого свойства, как CHART_WINDOWS_TOTAL (Общее количество окон графика, включая подокна индикаторов)?

3. Логично предположить, что для получения общего количества окон/подокон графика указание номера отдельно подокна не требуется. Этот вывод подкрепляется примером непосредственно из самого Справочника (раздел Свойства графиков):


1. Если учесть то что функция в действительности перегружается можно утверждать что не та (хотя как понимаете спорный вопрос. остановимся на первом и втором вариантах);

2. Так в этом все и дело. Если я правильно понимаю логику перегрузок функций в MQL5 первый вариант может быть использован с 2 или 3 параметрами, а второй только с 4.

Верней так, если функция получает два или три параметра MQL5 будет использовать первый вариант, при 4 всегда будет применяться второй.

Суть в том, что компилятор путается в вызовах если используем второй вариант с числом параметром не равным 4.

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

4.  Из вышесказанного следует, что для этого примера компилятор выберет первый вариант функции.

   int windows=ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   Print("CHART_WINDOWS_TOTAL = ",windows);
Такой вывод компилятор сделает на основании того что третий параметр в первом варианте может быть опущен, а во втором обязательно должен присутствовать!!!