формирование массива бинарных данных

 
Нужно сформировать массив состоящий только из чисел 0 либо 1 (вкл/выкл). Компелятор ошибок не выдаёт, но все значения равны только 0. При этом, элемент задающий условие в функции IF отображается на графике своё значение.
//Формирование идентификаторов рыночного сигнала по часам              
       if(RSI_MACD[cnt]>0)
          {h1id_sell[cnt]=-1;}
       else {h1id_sell[cnt]=0;}
       Print("h1id_sell=", h1id_sell[1]); 
 
       if(RSI_MACD[cnt]<0)
          {h1id_buy[cnt]=1;}
       else {h1id_buy[cnt]=0;}
       Print("h1id_buy=", h1id_buy[1]);
      
 
Наверно размер массива не определен
 

Конкретизирую задачу.

Ниже приведён тестовый индикатор на котором я отрабатываю создание / отображение массива бинарных данных и динамическое отображение информации в обьекте OBJ_LABEL на основе этого массива.

Компилятор ошибок не выдаёт, но массивы не формируются, и OBJ_LABEL не отображается даже на этапе инициализации

//+------------------------------------------------------------------+
//| Clous Open Divergence                                            |
 
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Gray
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 Black
         //---- input parameters
extern int CODPeriod=5;
extern int iMAw0period=3;
extern int smoothing_0=3;
extern int smoothing_1=3;
         //--- переменые коэфициентов сглаживания
double k_0, k_1;
         //--- буфферы
double COD[], max[], min[], sm_0[100000], sm_1[100000];
int id_market[], id_buy[], id_sell[];
         //--- функция инициализации
int init()
  {
   string short_name;
         //---задаем аттрибуты отображения индикатора
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,COD);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,id_buy);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,id_sell);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,id_market);       
         //---- задаем название индикатора
   short_name="COD_ObjectCreate("+CODPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);  
 
         //Создаём идентификатор текущего состояния рынка
   ObjectCreate("id_market", OBJ_LABEL, WindowFind(short_name),0,0); //создаём надпись в окне индикатора
   ObjectSet("id_market", OBJPROP_CORNER, 1);                       //Привязываем к правому верхниму углу
   ObjectSet("id_market", OBJPROP_XDISTANCE, 5);                   //координата Х
   ObjectSet("id_market", OBJPROP_YDISTANCE, 10);                 //Координата Y   
 
         //--- подсчитываем индексы K для экспоненциального сглаживания
   k_0 = 2.0 / (smoothing_0 + 1);
   k_1 = 2.0 / (smoothing_1 + 1);
         //--- обнуляем начальные значения массива сглаженых данных
   sm_0[Bars]=0;
   sm_1[Bars]=0;
         //--- обнуляем основной массив
   ArrayInitialize(COD, 0.0);
   ArrayInitialize(id_buy, 0.0);
   ArrayInitialize(id_sell, 0.0);   
   ArrayInitialize(id_market, 0.0);   
 
   return(0);
  }
         //--- основная функция
int start()
  {
         //--- определяем сколько баров надопросчитать (уже просчитаные бары не считаем)
   int    counted_bars=IndicatorCounted();
   int    limit=Bars-counted_bars-1, pos;
   pos=limit;
   if(counted_bars>0) pos++;        // предпоследний бар пересчитываем
         //--- задаем переменные в которые ложим значения мувингов и само значение индикатора
   double CODnotsmoothing, iMAclous, iMAopen;
         //--- основной цикл
   while(pos>=0)
      {
         //--- в переменные ложим значения индикаторов
      iMAclous = iMA(0,0,CODPeriod,1,MODE_SMA,PRICE_CLOSE,pos);
      iMAopen = iMA(0,0,CODPeriod,1,MODE_SMA,PRICE_OPEN,pos);
         //--- просчитываем значение индикатора
      CODnotsmoothing=iMAclous - iMAopen;
      sm_0[pos]=sm_0[pos+1] + k_0*(CODnotsmoothing - sm_0[pos+1]);
      sm_1[pos]=sm_1[pos+1] + k_1*(sm_0[pos] - sm_1[pos+1]);
         //--- кладём сглаженое значение в основной буффер для отображения индикатора COD
      COD[pos]=sm_1[pos]/Point;
 
         //Создаём массив идентификаторов
   if(COD[pos]>0)
      id_buy[pos]=1;
    else id_buy[pos]=0;
 
   if(COD[pos]<0)
      id_sell[pos]=-1;
    else id_sell[pos]=0;
    
   id_market[pos]= id_buy[pos]+id_sell[pos]; 
 
         //Записываем данные в текстовую метку
   if(id_market[0]!=id_market[1])
      {
       if(id_market[0]==1)
          {ObjectSetText("id_market","BUY",20,"Arial",Blue);}   
          if(id_market[0]==-1)
             {ObjectSetText("id_market","SELL",20,"Arial",Red);}
             else{ObjectSetText("id_market","square",20,"Arial",Black);}
      }      
     pos--;
     }
   return(0);
  }


.

 

Такой новаторский метод, и откуда уверенность что он должен работать?!

Достачно заменить массивы для буферов на double.

 
Integer писал (а):

Такой новаторский метод, и откуда уверенность что он должен работать?!

Достачно заменить массивы для буферов на double.

Уверенности нету, Есть только вероятность, а если серьёзно то предоставленный код несёт исключительно демонстрационную функцию.
СПАСИБО за совет бинарные массивы сформировались и отобразились, только непонятно почему так принципиально важно объявить из значения как double.
Остался только один вопрос почему OBJ_LABEL не отображается.

 
Остался только один вопрос почему OBJ_LABEL не отображается.
Наверное потому, что для создания объекта необходимо использовать ObjectCreate(),
а функции ObjectSet сообщают свойства уже имеющемуся объекту.
 
Когда подключаешь индикатор первый раз, окна еще нет с таким именем и лейбла не создается, затем, если открыть овно свойств и нажать ок, появляется. Лучше создание лейблы сделать в функции старт.
 
Наверное потому, что для создания объекта необходимо использовать ObjectCreate(),
а функции ObjectSet сообщают свойства уже имеющемуся объекту.

Пожалуйста поясните, в коде уже имеется функция ObjectCreate().
//Создаём идентификатор текущего состояния рынка
   ObjectCreate("id_market", OBJ_LABEL, WindowFind(short_name),0,0); //создаём надпись в окне индикатора
   ObjectSet("id_market", OBJPROP_CORNER, 1);                       //Привязываем к правому верхниму углу
   ObjectSet("id_market", OBJPROP_XDISTANCE, 5);                   //координата Х
   ObjectSet("id_market", OBJPROP_YDISTANCE, 10);                 //Координата Y
 
nigilist:
Наверное потому, что для создания объекта необходимо использовать ObjectCreate(),
а функции ObjectSet сообщают свойства уже имеющемуся объекту.

Пожалуйста поясните, в коде уже имеется функция ObjectCreate().
//Создаём идентификатор текущего состояния рынка
   ObjectCreate("id_market", OBJ_LABEL, WindowFind(short_name),0,0); //создаём надпись в окне индикатора
   ObjectSet("id_market", OBJPROP_CORNER, 1);                       //Привязываем к правому верхниму углу
   ObjectSet("id_market", OBJPROP_XDISTANCE, 5);                   //координата Х
   ObjectSet("id_market", OBJPROP_YDISTANCE, 10);                 //Координата Y



Да, действительно, прошу прощения. Я просто посмотрел в нижнюю часть кода, там нет.

Думаю, что это как-то связано с коротким именем.
1. Я бы не использовал в названии скобки.
2. Попробуйте в ф-ию WindowFind() поставить имя индикатора в том виде, как назван файл индикатора (без расширения, только имя).
 
Integer писал (а):
Когда подключаешь индикатор первый раз, окна еще нет с таким именем и лейбла не создается, затем, если открыть овно свойств и нажать ок, появляется. Лучше создание лейблы сделать в функции старт.
 

Большое спасибо всем кто принимает участие в разработке этой темы, когда подведу итог своим изысканиям по этой теме обязательно отпишусь, а сейчас следующий вопрос.
Почему нижеприведённый код

       if(RSI_MACD[cnt]>0)// && RSImax[cnt]>=20 && iMA_h1[cnt]>=0)
          h1id_sell[cnt]=-1;
       else h1id_sell[cnt]=0;
       Print("h1id_sell=", h1id_sell[0]); 
 
       if(RSI_MACD[cnt]<0)// && RSImax[cnt]<=20 && iMA_h1[cnt]<=0)
          h1id_buy[cnt]=1;
       else h1id_buy[cnt]=0; 
       Print("h1id_buy=",h1id_buy[0]);

Выдаёт в журнал следующую информацию



Причина обращения: