iCustom Не получается получить значения индикатора помогите….

 
Ребята вот мой индюк:
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_minimum -10 
#property indicator_maximum 10
#property indicator_color3 Blue
#property indicator_color4 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern double DrawlinesAt=0;
 
 
//---- indicator buffers
double ExtMapBuffer0[];
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  double Draw;
   IndicatorBuffers(4);
//---- drawing settings
   
  SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(2,DRAW_HISTOGRAM,0,1);
 SetIndexStyle(3,DRAW_HISTOGRAM,0,1);
 
 
    SetIndexDrawBegin(2,1);
  SetIndexDrawBegin(3,1);
 
 
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer0);
   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexBuffer(2,ExtMapBuffer2);
   SetIndexBuffer(3,ExtMapBuffer3);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
 
   
   ArraySetAsSeries(ExtMapBuffer0,true);
   ArraySetAsSeries(ExtMapBuffer1,true);
   
//---- indicator short name
   IndicatorShortName("ZIGOSK("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
SetIndexLabel(0,"%");
     SetIndexLabel(1,NULL);
        SetIndexLabel(2,NULL);
          SetIndexLabel(3,NULL);
          
          
         
 
          
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
 
int deinit()
{
ObjectDelete("Line2");
ObjectDelete("Line3");
return(0);
}
int start()
  {
   int    shift, back,lasthighpos,lastlowpos,shift_bar,i;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow,sravnenie=0.0,ZIGOSK,Draw;
 
 Draw=DrawlinesAt*(-1);
ObjectCreate("Line2",OBJ_HLINE,1,0,DrawlinesAt); 
ObjectCreate("Line3",OBJ_HLINE,1,0,Draw); 
ObjectSet("Line2",6, Silver);
  ObjectSet("Line3",6, Silver);
ObjectSet("Line3",7,STYLE_DOT );
ObjectSet("Line2",7,STYLE_DOT );
 
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer0[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer0[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer0[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer1[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer1[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer1[shift]=val;
     }
 
   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;
 
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer0[shift];
      curhigh=ExtMapBuffer1[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer1[lasthighpos]=0;
            else ExtMapBuffer1[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer0[lastlowpos]=0;
            else ExtMapBuffer0[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer0[shift]=0.0;
      else
        {
         res=ExtMapBuffer1[shift];
         if(res!=0.0) ExtMapBuffer0[shift]=res;
        }
     }
     
     
     //             Модуль Осцилятора 
     
     /*
   for(shift=Bars-1; shift>=0; shift--)
   {
   ExtMapBuffer2[shift]=-1;
      ExtMapBuffer3[shift]=3;
   }
   
   */
   
      for(shift=Bars-1; shift>=0; shift--)
     {
      ExtMapBuffer2[shift]=0;
      ExtMapBuffer3[shift]=0;
      
      
      if(sravnenie!=0.0)
        {
 
         if(sravnenie<ExtMapBuffer0[shift]) // Растущий тренд
            {
                    
               for( i=shift_bar;i>shift; i--)    
                  {
               
                if(i==shift_bar)
                {
                ZIGOSK=(((Close[i]-sravnenie)*100)/sravnenie);
                
                 ExtMapBuffer2[i]=ZIGOSK;
                 ExtMapBuffer0[i]=ZIGOSK;
                }
               
                  if(i!=shift_bar)
                  {
                  
              
                  ZIGOSK=(((Close[i]-sravnenie)*100)/sravnenie);
                  if(Close[i]>=Close[i+1]) 
                  {
                  ExtMapBuffer2[i]=ZIGOSK;
                  ExtMapBuffer0[i]=ZIGOSK;
                  }
                  else 
                  {
                  ExtMapBuffer3[i]=ZIGOSK;
                  ExtMapBuffer0[i]=ZIGOSK;
                  }
                  }
               
                 
                  } 
            }
            
            
            if(sravnenie>ExtMapBuffer0[shift]) // Падающий тренд
            {
            if(ExtMapBuffer0[shift]!=0)
            {
            
               for( i=shift_bar;i>shift; i--)    
                  {
                   if(i==shift_bar)
                {
                ZIGOSK=(((Close[i]-sravnenie)*100)/sravnenie);
                
                 ExtMapBuffer3[i]=ZIGOSK;
                 ExtMapBuffer0[i]=ZIGOSK;
                }
                
                 if(i!=shift_bar)
                  {
                  
              
                  ZIGOSK=(((Close[i]-sravnenie)*100)/sravnenie);
                  if(Close[i]>=Close[i+1]) 
                  {
                  ExtMapBuffer2[i]=ZIGOSK;
                  ExtMapBuffer0[i]=ZIGOSK;
                  }
                  else 
                  {
                  ExtMapBuffer3[i]=ZIGOSK;
                  ExtMapBuffer0[i]=ZIGOSK;
                  }
                  }
                
                
                  }
            }
            }
 
         } // закрывает сравнение не = 0
                  
      if(ExtMapBuffer0[shift]>0) 
      {
      
      sravnenie=ExtMapBuffer0[shift];
     shift_bar=shift;
     if(ExtMapBuffer3[shift+1]!=0) ExtMapBuffer0[shift]=ExtMapBuffer3[shift+1];
     else ExtMapBuffer0[shift]=ExtMapBuffer2[shift+1];
     
      }
  //  for(int k=IndicatorCounted();k>=0; k--)     
  // {
  // ExtMapBuffer0[shift]=1;
  // }  
  
     
     }
     //             Модуль Осцилятора  
   return(0);
  }

Пишу скрипт для вызова:

  Print ("Kuku!!!",iCustom( NULL, 0, "ZIGOSK2",12,5,3,0, 0, 3 ));


а он меня посылает мол не могу открыть файл ZIGOSK.ex4..... в чем может быть проблема помогите что-то я торможу....

 
ZIGOSK? или ZIGOSK2? В любом случае в папке с индикаторами должен лежать откомпилированный индикатор. Сверьте имена.
 
После беглых исправлений вот, что получилось:



Если есть замечания, скажите.

Обратиться к нему можно так:

Print ("Kuku!!!", iCustom(NULL, 0, "ZIGOSK2", 12, 5, 3, 0, 0, 3));
Файлы:
zigosk2.mq4  10 kb
 
Кстати, хочу спросить, iCustom возвращает какие-либо коды ошибок в случае неверного вызова индикатора, например, неверного числа параметров или их значений? Я пробовал анализировать его значения, он всегда что-то возвращает, даже если ему передавать в качестве переменного массива параметров откровенную галиматью.

Какой есть контроль правильности его вызова?
 
chv:
Кстати, хочу спросить, iCustom возвращает какие-либо коды ошибок в случае неверного вызова индикатора, например, неверного числа параметров или их значений? Я пробовал анализировать его значения, он всегда что-то возвращает, даже если ему передавать в качестве переменного массива параметров откровенную галиматью.

Какой есть контроль правильности его вызова?
iCustom ERR_STRING_PARAMETER_EXPECTED (4062), ERR_INVALID_FUNCTION_PARAMETER_VALUE (4051)
(https://docs.mql4.com/ru/runtime/errors)
Причина обращения: