Как найти проблему в индикаторе?

 

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

Проблема в том, что советник не открывает сделки по сигналам индикатора.

Советник проверен на других индикаторах - все работает корректно. 

Индикатор стоит визуализацию (гистограмму) правильно.

Получается проблема именно в связке советника с этим индикатором.

Подскажите в чем может быть проблема или как ее определить? 

 

В советнике индикатор прописан так:

   double StochImpuls11=iCustom(NULL,0,"_my\\StochImpuls4",StochOverbought,StochOversold,StochKperiod,StochDperiod,StochSlowing,ModeAverage,0,1);

 

Открытие по сигналу:

if(StochImpuls11==1)
 {
открывает ордер
 }

 

Код идникатора:

 

#property indicator_separate_window    // Индик. рисуется в отдельном окне
#property indicator_buffers 2       // Количество буферов
#property indicator_color1 Lime     // Цвет 1 линии
#property indicator_color2 Red      // Цвет 2 линии

 
double Buf_0[],Buf_1[];             // Объявление массивов (под буферы индикатора)

extern double StochOverbought=75;
extern double StochOversold=25;
extern int StochKperiod=14;          // период линии K Стохастика
extern int StochDperiod=3;          // период линии D Стохастика
extern int StochSlowing=3;          // замедление Стохастика
extern ENUM_MA_METHOD ModeAverage=MODE_LWMA;  // Сглаживание Стохастика

//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_HISTOGRAM,STYLE_SOLID,2);// Стиль линии
   SetIndexBuffer(1,Buf_1);         // Назначение массива буферу
   SetIndexStyle (1,DRAW_HISTOGRAM,STYLE_SOLID,1);// Стиль линии    
   return(INIT_SUCCEEDED);                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
void start()                         // Специальная функция start()
  {
   int i,                           // Индекс бара
       Counted_bars;                // Количество просчитанных баров 
          
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=100-Counted_bars-1;           // Индекс первого непосчитанного (ограничение 100 баров)
   while(i>=0)                      // Цикл по непосчитанным барам
     {

      int UpSignal;
      int DownSignal;
      int UpMove;
      int DownMove;
      
     double st0=iStochastic(NULL,0,StochKperiod,StochDperiod,StochSlowing,ModeAverage,1,MODE_MAIN,i); // Значение Stochastic на текущем баре
     double st1=iStochastic(NULL,0,StochKperiod,StochDperiod,StochSlowing,ModeAverage,1,MODE_MAIN,i+1); // Значение Stochastic на предыдущем баре  

      
//--------------------------------------------------------------------      

  double DoneUpSignal; 
  DoneUpSignal=0;
  int    x1, sh1;//// номера баров 
  x1=0;  
  sh1=0;
 
  while (DoneUpSignal<1)
    {

     double w1st0=iStochastic(NULL,0,StochKperiod,StochDperiod,StochSlowing,ModeAverage,1,MODE_MAIN,i+sh1); // Значение Stochastic на текущем баре
     double w1st1=iStochastic(NULL,0,StochKperiod,StochDperiod,StochSlowing,ModeAverage,1,MODE_MAIN,i+sh1+1); // Значение Stochastic на предыдущем баре  

     if (w1st0>StochOversold && w1st1<=StochOversold) 
      {
      DoneUpSignal=1; x1=sh1;
      }
      
      
     sh1++;
    }
    UpSignal=x1;


  double  DoneDownSignal;
  DoneDownSignal=0;
  int    x2, sh2;//// номера баров 
  x2=0;  
  sh2=0; 
      
  while (DoneDownSignal<1)
    {

     double w2st0=iStochastic(NULL,0,StochKperiod,StochDperiod,StochSlowing,ModeAverage,1,MODE_MAIN,i+sh2); // Значение Stochastic на текущем баре
     double w2st1=iStochastic(NULL,0,StochKperiod,StochDperiod,StochSlowing,ModeAverage,1,MODE_MAIN,i+sh2+1); // Значение Stochastic на предыдущем баре  

     if (w2st0<StochOverbought && w2st1>=StochOverbought) 
      {
      DoneDownSignal=1; x2=sh2;
      }
     sh2++;
    }
    DownSignal=x2;        

    
      if(st0>StochOversold && st1<=StochOversold)
       { 
        UpMove=1;
       } 
       else
       {
         if(st0<StochOverbought && st1>=StochOverbought)
         { 
         DownMove=2;
         }
         else
                  {    
                  if(st0>StochOversold && UpSignal<DownSignal)
                  {
                  UpMove=1;
                  }
                  else
                  {   
                  if(st0<StochOverbought && UpSignal>DownSignal) 
                  {
                  DownMove=2;
                  }
       } 
       }  
       }   
       
         
//-------------------------------------------------------------------- 
      Buf_0[i]=UpMove;             // Значение 0 буфера на i-ом баре
      Buf_1[i]=DownMove;              // Значение 1 буфера на i-ом баре
      i--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }


Подскажите почему не происходит открытия сделок? что не так с индикатором?
	          
 
В советнике через Print или через Comment выведите значение StochImpuls11, посмотрите что там. Упростите индикатор на время, закомментируйте основное и в буфер устанавливайте какой-нибудь значение, чтобы видеть в советнике если вообще связь с индикатором. 
 

Integer:
В советнике через Print или через Comment выведите значение StochImpuls11, посмотрите что там. Упростите индикатор на время, закомментируйте основное и в буфер устанавливайте какой-нибудь значение, чтобы видеть в советнике если вообще связь с индикатором.  

В советнике через Print выдает значение StochImpuls11=2147483647, при чем на каждом баре одно и тоже значение. При этом индикатор отображается корректно. В чем может быть проблема?
 

В советнике изменил условие на открытие...

Открытие по сигналу:

if(StochImpuls11>1)
 {
открывает ордер
 }
Сделки советник начал открывать. Таким образом. получается, что индикатор передает в советник совершенно другие значения, нежели те по которым индикатор строит гистограмму. Как такое может быть?
 
varyar84:

В советнике изменил условие на открытие...

Открытие по сигналу:

Сделки советник начал открывать.Таким образом. получается, что индикатор передает в советник совершенно другие значения, нежели те по которым индикатор строит гистограмму.Как такое может быть?

а так:

if(StochImpuls11>1 && StochImpuls11 != EMPTY_VALUE)
 {
открывает ордер
 }
 
TarasBY:

а так:

Не открывает.

 
varyar84:
В советнике через Print выдает значение StochImpuls11=2147483647, при чем на каждом баре одно и тоже значение.При этом индикатор отображается корректно.В чем может быть проблема?
Это число означает пустой буфер EMPTY_VALUE, то есть индикаторный буфер пуст, возможно не к тому буферу обращаетесь раз на графике он работает.
 
PozitiF:
Это число означает пустой буфер EMPTY_VALUE, то есть индикаторный буфер пуст, возможно не к тому буферу обращаетесь раз на графике он работает.

 

В советнике идет обращение к буферу 0, вот код:

 double StochImpuls11=iCustom(NULL,0,"_my\\StochImpuls4",StochOverbought,StochOversold,StochKperiod,StochDperiod,StochSlowing,ModeAverage,0,1);

 

 В индикаторе Buf_0 строит зеленые столбцы - http://prntscr.com/8ilynh 

 

Видимо проблема в чем то другом. 

 
varyar84:

 

В советнике идет обращение к буферу 0, вот код:

 

 В индикаторе Buf_0 строит зеленые столбцы - http://prntscr.com/8ilynh 

 

Видимо проблема в чем то другом. 

 

Проверьте чему равна i при первом запуске и последующих

//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Количество просчитанных баров 
   i=100-Counted_bars-1;           // Индекс первого непосчитанного (ограничение 100 баров)
 
varyar84:
В советнике через Print выдает значение StochImpuls11=2147483647, при чем на каждом баре одно и тоже значение.При этом индикатор отображается корректно.В чем может быть проблема?
2147483647 - это EMPTY_VALUE, это нормально. По идее, изредка оно должно заменяться на 1. Попробуйте из индикатора постоянно передавать какое-то другое значения, чтобы точно убедиться, что вызов индикатора из советника сделан верно.
Причина обращения: