Помогите разобраться с копированием индикаторного буфера - страница 2

 
Taras Slobodyanik:

может потому что вы всегда, с первого раза, копируете 0 (или -1) баров?

Не, не поэтому.

Но таки да, BarsCalculated() надо проверять. Как-то так, точнее:

      int count=0;
      if(prev_calculated<1)
         {
         count=rates_total;
         int calculated=BarsCalculated(CustomHandle);
         if(calculated<1)
            {
            ChartSetSymbolPeriod(0,_Symbol,PERIOD_CURRENT);
            return(0);
            }
         if(count>calculated) count=calculated;
         }
      else count=rates_total-prev_calculated+1;
      
      int Copy=CopyBuffer(CustomHandle,0,int(0),count,DataBuffer); // НА ЭТОМ МЕСТЕ ВСЕГДА ОШИБКА
      if (Copy==-1)
         {
         //Print("CopyBuffer() failed!");
         ChartSetSymbolPeriod(0,_Symbol,PERIOD_CURRENT);
         return(0);
         }
 
Aleksey Lebedev:

Не, не поэтому.

Но таки да, BarsCalculated() надо проверять. Как-то так, точнее:

а что происходит если prev_calculated==0  ? (или если calculated==0)
происходит попытка копировать число баров большее чем rates_total

и зачем постоянно инициализировать график ChartSetSymbolPeriod ?
индикаторы/советники - не перегружаются при этом? (думаю в некоторых случаях может подвиснуть всё)

 
Taras Slobodyanik:

а что происходит если prev_calculated==0  ? (или если calculated==0)
происходит попытка копировать число баров большее чем rates_total

и зачем постоянно инициализировать график ChartSetSymbolPeriod ?
индикаторы/советники - не перегружаются при этом? (думаю в некоторых случаях может подвиснуть всё)

копируется не более rates_total.

Чтоб цикл ожидания данных в индикаторе реализовать. Такой вариант рекомендовали разработчики.
 
Aleksey Lebedev:

копируется не более rates_total.

самый первый раз  prev_calculated=0  и далее расчет:

count=rates_total-0+1; 

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

 

также и внутри условия:

         count=rates_total;
         int calculated=BarsCalculated(CustomHandle);
         if(calculated<1)
            {
            ChartSetSymbolPeriod(0,_Symbol,PERIOD_CURRENT);
            return(0);
            }
         if(count>calculated) count=calculated;

count=rates_total;
calculated=0;

if(count>calculated)
count=0;

снова неправильное значение - копируется Ноль баров

то есть как ни крути - первый раз всегда ошибка)

 
Aleksey Lebedev:

Чтоб цикл ожидания данных в индикаторе реализовать. Такой вариант рекомендовали разработчики.

я так понимаю это про "ChartSetSymbolPeriod" ?
где это можно почитать?

 
Taras Slobodyanik:

то есть как ни крути - первый раз всегда ошибка)

else, return - для чего-то же написаны)

я так понимаю это про "ChartSetSymbolPeriod" ?
где это можно почитать?

В документации.

рекомендовали таки в сервисдеске

 
Aleksey Lebedev:

else, return - для чего-то же написаны)

да, заработался, решил что сравнение с нолем, а не с единицей. %)
..тогда всё правильно)


Aleksey Lebedev:

В документации.

рекомендовали таки в сервисдеске

спасибо, поэкспериментирую.

 
Спасибо!
Благодаря крутым советам уважаемых участников, сделал более-менее сносный шаблон индикатора на двух буферах, который может строиться по данным любого символа в окне произвольного символа, с помощью вызова самого себя через функцию iCustom() и наполнения индикаторных буферов функцией CopyBuffer().
Причина обращения: