iCustom() на MQL5

 
Всем привет!
До вечера у меня не будет доступа на форум MQL5, поэтому пока спрошу здесь.

Индикатор чудесно копирует в свой буфер буфер ZZ(в аттаче)
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters

//--- indicator buffers
double         ZigzagBuffer[];
//--- хэндл пользовательского индикатора
int Zigzag_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ZigzagBuffer,INDICATOR_DATA);
   ResetLastError();

   Zigzag_handle=iCustom(NULL,0,"ZigZag",20,5,3);
   Print("Zigzag_handle =",Zigzag_handle,"  error =",GetLastError());
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int copy=CopyBuffer(Zigzag_handle,0,0,rates_total,ZigzagBuffer);
   Print("copy =",copy,"    rates_total =",rates_total);
   //--- если попытка неудачная - сообщим об этом
   if(copy<=0)
      Print("Неудачная попытка получить значения индикатора");

   return(rates_total);
  }
//+------------------------------------------------------------------+
Тоже самое в скрипте сделать, т.е. скопировать буфер, не удается.
double ZigzagBuffer[];
int    Zigzag_handle;

void OnStart()
{
  Zigzag_handle=iCustom(NULL,0,"ZigZag",20,5,3);

  ArraySetAsSeries(ZigzagBuffer,true);

  int copy=CopyBuffer(Zigzag_handle,0,0,1,ZigzagBuffer);
  Print("copy =",copy);
  //--- если попытка неудачная - сообщим об этом
  if(copy<=0)
  {
    Print("Неудачная попытка получить значения индикатора");
    return;
  }

  for(int i=0;i<100;i++)
  {
    if(ZigzagBuffer[i]>0.0)
    {
      Comment(ZigzagBuffer[i]);
    }
  }
}
В чем проблема?
Файлы:
zigzag.mq5  9 kb
 
Чтобы узнать успел индикатор рассчитаться или нет, используйте функцию BarsCalculated. В индикаторах при создании хендла индикатора внутри функции OnInit и последующим обращением к нему из функции OnCalculate(), данные как правило всегда готовы. В скриптах как правило наоборот, данные не успевают рассчитаться.

PS. Вопросы по MQL5 лучше задавать на профильном форуме.
 
Rosh >>:
Чтобы узнать успел индикатор рассчитаться или нет, используйте функцию BarsCalculated. В индикаторах при создании хендла индикатора внутри функции OnInit и последующим обращением к нему из функции OnCalculate(), данные как правило всегда готовы. В скриптах как правило наоборот, данные не успевают рассчитаться.

PS. Вопросы по MQL5 лучше задавать на профильном форуме.

BarsCalculated возвращает -1, хотя индикатор на графике "висит" уже несколько часов. Наверное уже давно индикатор рассчитан, и проблема в чем то другом.

ЗЫ понимаю неуместность вопроса на этом форуме, но до профильного форума мне до вечера не добраться, не хочется терять время. Удалю ветку после получения ответа.

 
Спасибо. Разобрался. Нужно многократно делать попытки
CopyBuffer()
и проверять BarsCalculated в цикле.

ЗЫ Не могу удалить тему. Не нахожу кнопку "удалить", вроде как раньше была, если мне не изменяет память.
 
joo >>:

ЗЫ Не могу удалить тему. Не нахожу кнопку "удалить", вроде как раньше была, если мне не изменяет память.
Нельзя удалить тему, если в ней уже есть ответы других пользователей. Ничего страшного, пусть остается, чтобы не пропадало знание.
 
joo >>:
Спасибо. Разобрался. Нужно многократно делать попытки и проверять BarsCalculated в цикле.

Не совсем так. Не нужно многократно предпринимать попытки копировать с помощью CopyBuffer(), а нужно проверять перед копированием количество расчитанных значений в индикаторе функцией BarsCalculated, но можно это делать в цикле, как показано в примере к этой функции.