Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MQL5 Cloud Network это сеть распределенных вычислений. Оцени сам!
Pavel Veselov
6469
Pavel Veselov 2015.12.25 21:51 

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

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

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

Dmitry Fedoseev
42923
Dmitry Fedoseev 2015.12.25 21:52  
Тогда публикуйте в CodeBase
Pavel Veselov
6469
Pavel Veselov 2015.12.25 22:14  
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);}                      //
               //                       _____________________                    //
               //                          конец функции                         //
               ////////////////////////////////////////////////////////////////////
//▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Dmitry Fedoseev
42923
Dmitry Fedoseev 2015.12.25 22:22  
В журнале во вкладке "Эксперты" смотрите сообщение, выход за пределы массива.
Ihor Herasko
9065
Ihor Herasko 2015.12.25 22:22  
Pavel Veselov:

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

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

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

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

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

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 не пустой... 

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

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

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

   if(Counted_bars==0){
      i-=SMAperiod;
   }
Pavel Veselov
6469
Pavel Veselov 2015.12.25 22:38  
Dmitry Fedoseev:

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

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

Boris
3900
Boris 2015.12.25 22:39  
Pavel Veselov:

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

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

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

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

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

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

убрал sma_start+
 

Dmitry Fedoseev
42923
Dmitry Fedoseev 2015.12.25 22:51  
Boris:

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

убрал sma_start+
 

Борис, а вы случайно не хирург по профессии?
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий