#property strict ошибок не выдает, но пропадают линии индикатора

 

Всем привет.
Появилось желание публиковать свои индюки в маркет, там обязательно использование #property strict

При внесении его в код и компиляции - ошибок и предупреждений нет, но в терминале индикатор пустой, нет ни одной линии. В окне данных значений тоже нет.
Предположительно в чем может быть загвоздка?
Возможно подобное уже обсуждалось, но мне ответа не удалось найти.

з.ы. Код достаточно большой что бы  выкладывать для поиска причины. Да и алгоритм не хотелось бы выдавать на всеобщее обозрение.

 
Тогда публикуйте в CodeBase
 
Dmitry Fedoseev:
Тогда публикуйте в CodeBase

Ок. Попробовал со стриктом простой индюк, его можно и опубликовать.
Но даже в нем не могу найти решение проблемы, вроде по всем новшествам компилятора прошелся - никакого эффекта.

//▼ СВОЙСТВА ИНДИКАТОРА ════════════════════════════════════════════════════════════
#property strict
#property version "1.0"
#property copyright   "Copyright 2015, Animatics.ru, Veselov Pavel"
#property link        "http://www.animatics.ru"
#property description " "
#property description "[EN] Added: smoothing, light input and output, modes of finding points and auxiliary options."
#property description " "
#property description "[RU] Добавлено: сглаживание, индикатор входа/выхода, режимы определения точек разворота и вспомогательные опции."
#property indicator_separate_window          //► в отдельном окне
#property indicator_buffers 4                //► количество буферов
#property indicator_color1 clrSteelBlue      //► цвета линий
#property indicator_color2 clrTeal
#property indicator_color3 clrOrangeRed
#property indicator_color4 clrLime
//▼ задаем уровни ══════════════════════════════════════════════════════════════════
#property  indicator_levelcolor clrDimGray      //► Цвет уровней
#property indicator_level1 100.0                //► Установка уровней
#property indicator_level2 -100.0               //► Установка уровней
//▼ задаем новый тип данных для режимов точек разворота ════════════════════════════
enum PointMode {NONE=0,SIMPLE=1,CROSS=2,FAST_LVL=3,SLOW_LVL=4,PIVOT_CCI=5,PIVOT_SMA=6};
//▼ входные параметры ══════════════════════════════════════════════════════════════
input int CCIperiod=14;//Period CCI
input PointMode P_mode=2;//POINT_MODE
extern int SMAperiod=6;//Period SMA
input bool ShowAlert=true;//Alert on/off
input bool HideCCI=false;//on/off CCI line
//▼ глобальные переменные ══════════════════════════════════════════════════════════
double Buf_0[],Buf_1[],Buf_2[],Buf_3[];         //► массивы под буферы индикатора
string short_name="CCI+";                       //► короткое имя индикатора
double ts;                                      //► переменная для пользовательских функции
int i,Counted_bars;                             //► Индекс бара, количество просчитанных баров 
//▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
//▼ инициализация ══════════════════════════════════════════════════════════════════
   int init(){
//▼ проверка введенных параметров ══════════════════════════════════════════════════
if (SMAperiod<=2){SMAperiod=2;Alert("SMA value is too low!\n\nSet SMA=2.");}                                      //► ограничиваем минимальный параметр сглаживания и оповещение
if (HideCCI==true)Alert("Attention! CCI line is OFF!\n\n In the NONE and SIMPLE mode line CCI is not visible!");  //► оповещение об отключенной линии CCI
//▼ назначение буферов ═════════════════════════════════════════════════════════════
      IndicatorBuffers(4);                                                 //► Количество буферов
      SetIndexBuffer(0,Buf_0);                                             //► Назначение массива буферу
      if (HideCCI==false)SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,1);        //► если включено CCI то задаем стиль линии
      if (HideCCI==true)SetIndexStyle (0,DRAW_NONE);                       //► если отключено - не рисуем
      SetIndexBuffer(1,Buf_1);                                             
      SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);                             
      SetIndexBuffer(2,Buf_2);                        
      SetIndexStyle (2,DRAW_ARROW);        
      SetIndexArrow (2,242);
      SetIndexBuffer(3,Buf_3);             
      SetIndexStyle (3,DRAW_ARROW);        
      SetIndexArrow (3,241);
      IndicatorDigits(8);
//▼ надписи в окне индикатора ════════════════════════════════════════════════════
   IndicatorShortName(short_name);
   SetIndexLabel(0,"CCI("+IntegerToString(CCIperiod)+")");                      //► метка линии 0
   SetIndexLabel(1,"CCI("+IntegerToString(CCIperiod)+")+SMA("+IntegerToString(SMAperiod)+")");   //► метка линии 1
   SetIndexLabel(2,"SELL");                                    //► метка линии 2
   SetIndexLabel(3,"BUY");                                     //► метка линии 3
//▼
      return(0);}                                              //► Выход из спец. ф-ии init()
//▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
int start(){
//▼ начало цикла ══════════════════════════════════════════════════════════════════
   Counted_bars=IndicatorCounted();       //► Количество просчитанных баров 
   i=Bars-Counted_bars-1;                 //► Индекс первого непросчитанного    
   while(i>=0){                           //► Цикл по непосчитанным барам
//▼ получаем значение CCI ═════════════════════════════════════════════════════════
Buf_0[i]=iCCI(NULL,0,CCIperiod,PRICE_TYPICAL,i); //► 
//▼ Режимы определения точек ══════════════════════════════════════════════════════
if (P_mode==1){ //► SIMPLE, пересечение CCI уровней
   if (Buf_0[i]<100 && Buf_0[i+1]>=100)Buf_2[i]=117;
   if (Buf_0[i]>-100 && Buf_0[i+1]<=-100)Buf_3[i]=-117;
   }
if (P_mode==2){ //► CROSS, пересечение CCI и SMA в зоне
   Buf_1[i]=sma(Buf_0,SMAperiod,i);
   if (Buf_0[i]<Buf_1[i] && Buf_0[i+1]>=Buf_1[i+1] && Buf_0[i+1]>100)Buf_2[i]=117;
   if (Buf_0[i]>Buf_1[i] && Buf_0[i+1]<=Buf_1[i+1] && Buf_0[i+1]<(-100))Buf_3[i]=-117;
   }
if (P_mode==3){ //► FAST_LVL, пересечение CCI уровней при SMA в зоне и направлено на пересечение уровня
   Buf_1[i]=sma(Buf_0,SMAperiod,i);
   if (Buf_0[i]<100 && Buf_0[i+1]>=100 && Buf_1[i]>100 && Buf_1[i]<=Buf_1[i+1])Buf_2[i]=117;
   if (Buf_0[i]>-100 && Buf_0[i+1]<=-100 && Buf_1[i]<-100 && Buf_1[i]>=Buf_1[i+1])Buf_3[i]=-117;
   }
if (P_mode==4){ //► SLOW_LVL, пересечение SMA уровней
   Buf_1[i]=sma(Buf_0,SMAperiod,i);
   if (Buf_1[i]<100 && Buf_1[i+1]>=100)Buf_2[i]=117;
   if (Buf_1[i]>-100 && Buf_1[i+1]<=-100)Buf_3[i]=-117;
   }
if (P_mode==5){ //► PIVOT_CCI, точки разворота CCI при SMA в зоне
   Buf_1[i]=sma(Buf_0,SMAperiod,i);
   if (Buf_0[i]<Buf_0[i+1] && Buf_0[i+1]>=Buf_0[i+2] && Buf_1[i]>=100)Buf_2[i]=117;
   if (Buf_0[i]>Buf_0[i+1] && Buf_0[i+1]<=Buf_0[i+2] && Buf_1[i]<=-100)Buf_3[i]=-117;
   }
if (P_mode==6){ //► PIVOT_SMA, точки разворота SMA в зоне
   Buf_1[i]=sma(Buf_0,SMAperiod,i);
   if (Buf_1[i]<Buf_1[i+1] && Buf_1[i+1]>=Buf_1[i+2] && Buf_1[i]>=100)Buf_2[i]=117;
   if (Buf_1[i]>Buf_1[i+1] && Buf_1[i+1]<=Buf_1[i+2] && Buf_1[i]<=-100)Buf_3[i]=-117;
   }
if (ShowAlert && Buf_2[i]==117 && i<5)Alert("Possible <<SELL>>"); //► визуальный/звуковой сигнал о появлении точки
if (ShowAlert && Buf_3[i]==-117 && i<5)Alert("Possible <<BUY>>");
//════════════════════════════════════════════════════════════════════════════════════
   i--;                                                           //► Расчёт индекса следующего бара
   }
//---
return(0);                                                        //► Выход из спец. ф-ии start()
}
//▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
//▌                              ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
               ////////////////////////////////////////////////////////////////////
               //                   Функция сглаживания SMA                      //
               //               -------------------------------                  //
                  
                  double sma(double &sma_array[], int sma_period, int sma_start) // <- сглаживаемый массив, период сглаживания, первый элемент.
                  {                                                //
                  for(int j=sma_start;j<sma_start+sma_period;j++){               //
                  ts=ts+sma_array[j];}                                           //
                  ts=ts/sma_period; return(ts);}                                 //
               //                       _____________________                    //
               //                          конец функции                         //
               ////////////////////////////////////////////////////////////////////
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
               ////////////////////////////////////////////////////////////////////
               //                   Функция сглаживания EMA (до 5)               //
               //               -------------------------------                  //
                  
                  double ema(double &ema_array[], int ema_period, int ema_start) // <- сглаживаемый массив, период сглаживания, первый элемент.
                  {
                  ts=ema_array[ema_start];                                       //
                  for(int j=ema_start;j<ema_start+ema_period;j++){               //
                  ts=ts+MathPow(2,j-ema_start)*ema_array[j+1];}                  //
                  ts=ts/MathPow(2,ema_period); return(ts);}                      //
               //                       _____________________                    //
               //                          конец функции                         //
               ////////////////////////////////////////////////////////////////////
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
 
В журнале во вкладке "Эксперты" смотрите сообщение, выход за пределы массива.
 
Pavel Veselov:

Всем привет.
Появилось желание публиковать свои индюки в маркет, там обязательно использование #property strict

При внесении его в код и компиляции - ошибок и предупреждений нет, но в терминале индикатор пустой, нет ни одной линии. В окне данных значений тоже нет.
Предположительно в чем может быть загвоздка?
Возможно подобное уже обсуждалось, но мне ответа не удалось найти.

з.ы. Код достаточно большой что бы  выкладывать для поиска причины. Да и алгоритм не хотелось бы выдавать на всеобщее обозрение.

При строгой проверке индикатор попросту вылетает по фатальной ошибке - делении на ноль или выход за пределы массива. Смотрите ошибки в логах. К примеру, в показанном Вами коде ошибка в 117-ой строке.
 

Методом исключения пришел к тому что визуализация пропадает уже при появлении кода:

Buf_1[i]=sma(Buf_0,SMAperiod,i);

 Используется ф-я:

double sma(double &sma_array[], int sma_period, int sma_start)
{
  for(int j=sma_start;j<sma_start+sma_period;j++)
  {
    ts=ts+sma_array[j];
  }
  ts=ts/sma_period; return(ts);
}

 Buf_1 - double, SMAperiod - int, i - int, return не пустой... 

пока не могу разобраться((( 

 
При компиляции без стрикт допустимо выходить за пределы массива, так и писали раньше совершенно об этом не беспокоясь. Со стрикт, все должно быть продумано, чтобы ни где не попасть мимо массива. Это может потребовать серьезной переработки алгоритма, а не так, что бы раз два, подправил. 
 

В start перед while добавьте:

   if(Counted_bars==0){
      i-=SMAperiod;
   }
 
Dmitry Fedoseev:

В start перед while добавьте:

Не успеваю за вами)) Но уже огромное СПАСИБО! Вышел на нужный путь.
В журнале действительно выход за пределы массива, и условие что на 0 делить нельзя не описано в функции...
Буду копать. Похоже что свои функции все и поганят. 

 
Pavel Veselov:

Методом исключения пришел к тому что визуализация пропадает уже при появлении кода:

 Используется ф-я:

 Buf_1 - double, SMAperiod - int, i - int, return не пустой... 

пока не могу разобраться((( 

Извините, может, это ошибка: 

  for(int j=sma_start;j<sma_period;j++) //sma_start+

убрал sma_start+
 

 
Boris:

Извините, может, это ошибка: 

убрал sma_start+
 

Борис, а вы случайно не хирург по профессии?
Причина обращения: