Индикатор -> Советник (iCustom) -> 2147483647

 

Начну с извинений, так как знаю, что тема неоднократно повторялась на форуме. Однако ответа в предыдущих темах я не нашел.

Написал индикатор. Эксперт, использующий этот индикатор. Он работает, в том числе корректно отображается и по кнопке "Открыть график" из окна тестирования эксперта.

По "Ctrl + D" значения индикатора корректные, то есть -1, 0, 1. Однако на любом временном интервале эксперт выводит только единственное значение: 2147483647 (EMPTY_VALUE).

Пожалуйста, помогите, укажите на ошибку или объясните проблему и её решение.

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

=== Индикатор ===

#property indicator_separate_window
#property indicator_buffers 1
...

extern int FastWMAPeriod = 75;
extern int SlowWMAPeriod = 85;
extern int EMAPeriod = 5;
extern int FastMACD=15;
extern int SlowMACD=26;
extern int ShiftMACD=1;
...

double buffer[];
...

int init()
{
   SetIndexStyle(0, DRAW_LINE);
   SetIndexDrawBegin(0, SlowWMAPeriod);
   SetIndexBuffer(0, buffer);
   return(0);
}

int deinit() { return(0); }

int start() //Все переменные, используемые в start объявлены и инициализированы в глобальном пуле.
{
   ExtCountedBars = IndicatorCounted();
   Limit = Bars - ExtCountedBars - SlowWMAPeriod - 1; 
   if(Bars <= StartPoint) return(0);
   if (ExtCountedBars < 0) return(-1); // Check for possible errors
   if (ExtCountedBars > 0) ExtCountedBars--; // Last counted bar will be recounted

   for (int i = Limit; i >= 1; i--)
   {
      ...
      buffer[i] = 0;
      if (reg == -2) { reg = 0; buffer[i] = -1.0; }
      if (reg == 2) { reg = 0; buffer[i] = 1.0; }
   }
   return(0);
}


=== Эксперт ===

extern int FastWMAPeriod = 75;
extern int SlowWMAPeriod = 85;
extern int EMAPeriod = 5;
extern int FastMACD = 15;
extern int SlowMACD = 26;
extern int ShiftMACD = 1;
...

int cbars = 0;
double signal = 0.0;

int init()
{
   iCustom(Symbol(), Period(), "Puria", FastWMAPeriod, SlowWMAPeriod, EMAPeriod, FastMACD, SlowMACD, ShiftMACD, 0, 0);
   cbars = Bars;
   return(0);
}

int deinit() { return(0); }

int start()
{
   if (cbars == Bars) return(0);
   cbars = Bars;
   
   signal = iCustom(Symbol(), Period(), "Puria", FastWMAPeriod, SlowWMAPeriod, EMAPeriod, FastMACD, SlowMACD, ShiftMACD, 0, 0);
   if (signal != EMPTY_VALUE && signal != 0) Print(signal);
   ...
   return(0);
}
 
DreamerOne:

Начну с извинений, так как знаю, что тема неоднократно повторялась на форуме. Однако ответа в предыдущих темах я не нашел.

Написал индикатор. Эксперт, использующий этот индикатор. Он работает, в том числе корректно отображается и по кнопке "Открыть график" из окна тестирования эксперта.

По "Ctrl + D" значения индикатора корректные, то есть -1, 0, 1. Однако на любом временном интервале эксперт выводит только единственное значение: 2147483647 (EMPTY_VALUE).

Пожалуйста, помогите, укажите на ошибку или объясните проблему и её решение.

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


=== Индикатор ===

#property indicator_separate_window
#property indicator_buffers 1
...

extern int FastWMAPeriod = 75;
extern int SlowWMAPeriod = 85;
extern int EMAPeriod = 5;
extern int FastMACD=15;
extern int SlowMACD=26;
extern int ShiftMACD=1;
...

double buffer[];
...

int init()
{
   SetIndexStyle(0, DRAW_LINE);
   SetIndexDrawBegin(0, SlowWMAPeriod);
   SetIndexBuffer(0, buffer);
   return(0);
}

int deinit() { return(0); }

int start() //Все переменные, используемые в start объявлены и инициализированы в глобальном пуле.
{
   ExtCountedBars = IndicatorCounted();
   Limit = Bars - ExtCountedBars; 
   if(Limit>1) {
      // Полный перерасчет
      Limit=Bars-SlowWMAPeriod - 1
   }

   for (int i = Limit; i >= 0; i--)
   {
      ...
      buffer[i] = 0;
      if (reg == -2) { reg = 0; buffer[i] = -1.0; }
      if (reg == 2) { reg = 0; buffer[i] = 1.0; }
   }
   return(0);
}
Не надо стараться в будущее заглядывать. Там пока еще значения не определены
 
СПАСИБО!!! Всё заработало! :D
Причина обращения: