2147483647 в буфере

 

День Добрый!

Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь.

Пользовательский индикатор, вызванный iCustom (не конкретно какой-то, на нескольких видел) при пустом (по идее) значении буфера, выдаёт значение не ноль, а 2147483647. Это по какой-то магии совпадает с максимальным количеством баров в истории. При этом окно данных в терминале чётко не пишет ничего, т.е., вроде, должен быть ноль. Ан нет! При вызове в сову, даёт значение 2147483647. 

Вот конкретно два случая:

Trend_Up   = 2147483647 Trend_Down = 110.4211

Это то, что пишет Print. И в другом месте, где картина по идее обратная:

Trend_Up   =  111.231  Trend_Down = 2147483647

Ну, я, разумеется, пишу, что >100 вместо ==0. Но как-то это не правильно. Не аккуратненько как-то это.

Подскажите, может кто-то знает как получить из нуля ноль ?

 
ArtemijПодскажите, может кто-то знает как получить из нуля ноль ?
Копайте в сторону EMPTY_VALUE
 
Artemij:

Подскажите, может кто-то знает как получить из нуля ноль ?

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.

максималка бывает проскакивает при вызове индикатора на нулевом баре когда индикатор возвращает EMPTY_VALUE

 

Значение double  2147483647.0 принято в качестве пустого значения  EMPTY_VALUE, т.е. значения, для которого отсутствует отображение буфера индикатора.  Значение, полученное от индикатора, иногда следует проверять на EMPTY_VALUE. Можно переназначить пустое значение индикатора в функции OnInit() с помощью функции SetIndexEmptyValue(). Часто в качестве него выбирают нуль. Вот скрипт поясняющий пустое значение.

void start()
{
  SetIndexEmptyValue()
  double y=EMPTY_VALUE+2.0;
  for(double x=y; x>y-5; x--)
  { 
    if(x==EMPTY_VALUE) Alert("x = EMPTY_VALUE");
    else Alert("x = ", x);
  }
}


 

я обычно в индикаторе если нет условий для сигнала возвращаю 0 

int init(){
   IndicatorBuffers(2); 
     
   SetIndexBuffer(0,Buy);
   SetIndexStyle (0,DRAW_ARROW);
   SetIndexArrow (0,233);
   SetIndexEmptyValue(0,0.0);

   SetIndexBuffer(1,Sell);
   SetIndexStyle (1,DRAW_ARROW);
   SetIndexArrow (1,234);
   SetIndexEmptyValue(1,0.0);      
return(0);}
               или тут
int start(){
   if(RSI>70) {Buy[i]=Close[i];} else Buy[i]=0.0;
   if(RSI<30) {Sell[i]=Close[i];} else Sell[i]=0.0;
return(0);}
 
FXwin:

я обычно в индикаторе если нет условий для сигнала возвращаю 0 


Странно, но первый вариант SetIndexEmptyValue(1,0.0); у меня не работает вообще, (т.е. как было два лимона вместо нуля, так и есть), а второй работает, но т.к. индикатор рисует не стрелки как у Вас, а линию, образуются провалы на картинке.


 
Artemij:

Странно, но первый вариант SetIndexEmptyValue(1,0.0); у меня не работает вообще, (т.е. как было два лимона вместо нуля, так и есть), а второй работает, но т.к. индикатор рисует не стрелки как у Вас, а линию, образуются провалы на картинке.


Ну пусть и будут... Просто в условии надо поставить сравнение не с нулём, а с пустым значением. И все проблемы будут решены.


Artemij:

День Добрый!

Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь.

Пользовательский индикатор, вызванный iCustom (не конкретно какой-то, на нескольких видел) при пустом (по идее) значении буфера, выдаёт значение не ноль, а 2147483647. Это по какой-то магии совпадает с максимальным количеством баров в истории. При этом окно данных в терминале чётко не пишет ничего, т.е., вроде, должен быть ноль. Ан нет! При вызове в сову, даёт значение 2147483647. 

Вот конкретно два случая:

Это то, что пишет Print. И в другом месте, где картина по идее обратная:

Ну, я, разумеется, пишу, что >100 вместо ==0. Но как-то это не правильно. Не аккуратненько как-то это.

Подскажите, может кто-то знает как получить из нуля ноль ?

Именно здесь надо писать не ==0 или >100 а ==EMPTY_VALUE

То-есть если пустое значение.

 
Alexey Viktorov:

Ну пусть и будут... Просто в условии надо поставить сравнение не с нулём, а с пустым значением. И все проблемы будут решены.

Именно здесь надо писать не ==0 или >100 а ==EMPTY_VALUE

То-есть если пустое значение.

Надо задать SetIndexEmptyValue(НомерБуфера, 0);

 
Artemij:

Странно, но первый вариант SetIndexEmptyValue(1,0.0); у меня не работает вообще, (т.е. как было два лимона вместо нуля, так и есть), а второй работает, но т.к. индикатор рисует не стрелки как у Вас, а линию, образуются провалы на картинке.


Ну тогда для получения сигнала в советнике надо сделать дополнительные буферы в индикаторе

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1  Blue
#property indicator_color2  Red
#property indicator_color3  Gray
#property indicator_color4  Gray
#property indicator_width1  1
#property indicator_width2  1

//параметры
//
//
//
double buffer1[];
double buffer2[];
double Buy[];
double Sell[];

int init(){
   IndicatorBuffers(4); 

   SetIndexBuffer(0,buffer1); SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1,buffer2); SetIndexStyle(1,DRAW_LINE); 
     
   SetIndexBuffer(2,Buy); SetIndexStyle(2,DRAW_NONE);
   SetIndexEmptyValue(2,0.0);

   SetIndexBuffer(3,Sell); SetIndexStyle(3,DRAW_NONE);
   SetIndexEmptyValue(3,0.0);      
return(0);}
               или тут
int start(){
   if(RSI>70) {buffer1=Open[i]-dist*Point;Buy[i]=Close[i];} else Buy[i]=0.0;
   if(RSI<30) {buffer2=Open[i]+dist*Point;Sell[i]=Close[i];} else Sell[i]=0.0;
return(0);}

в советнике использовать буферы 2 и 3

   double Line1 = iCustom(Symbol(),0,"IndicatorSignal",Parametr1,Parametr2,Parametr3, 2,0);
   double Line2 = iCustom(Symbol(),0,"IndicatorSignal",Parametr1,Parametr2,Parametr3, 3,0);

   int SignalBuy=-1;
   if(Line1!=0.0) SignalBuy=1;

   int SignalSell=-1;
   if(Line2!=0.0) SignalSell=1;
 
STARIJ:

Надо задать SetIndexEmptyValue(НомерБуфера, 0);

Зачем? Изначально проблема возникла при получении пустого значения в советник и непонимания как это обработать. А вы советуете править индикатор. Зачем???

 
Alexey Viktorov:

Зачем? Изначально проблема возникла при получении пустого значения в советник и непонимания как это обработать. А вы советуете править индикатор. Зачем???

Так сейчас проблема в отрисовке провалов? Это линии в 0 уходят. А если 0 = EMPTY - линии останутся наверху

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