Подскажите, может кто-то знает как получить из нуля ноль ?
Целый тип 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);}
я обычно в индикаторе если нет условий для сигнала возвращаю 0
Странно, но первый вариант SetIndexEmptyValue(1,0.0); у меня не работает вообще, (т.е. как было два лимона вместо нуля, так и есть), а второй работает, но т.к. индикатор рисует не стрелки как у Вас, а линию, образуются провалы на картинке.
Странно, но первый вариант SetIndexEmptyValue(1,0.0); у меня не работает вообще, (т.е. как было два лимона вместо нуля, так и есть), а второй работает, но т.к. индикатор рисует не стрелки как у Вас, а линию, образуются провалы на картинке.
Ну пусть и будут... Просто в условии надо поставить сравнение не с нулём, а с пустым значением. И все проблемы будут решены.
День Добрый!
Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь.
Пользовательский индикатор, вызванный iCustom (не конкретно какой-то, на нескольких видел) при пустом (по идее) значении буфера, выдаёт значение не ноль, а 2147483647. Это по какой-то магии совпадает с максимальным количеством баров в истории. При этом окно данных в терминале чётко не пишет ничего, т.е., вроде, должен быть ноль. Ан нет! При вызове в сову, даёт значение 2147483647.
Вот конкретно два случая:
Это то, что пишет Print. И в другом месте, где картина по идее обратная:
Ну, я, разумеется, пишу, что >100 вместо ==0. Но как-то это не правильно. Не аккуратненько как-то это.
Подскажите, может кто-то знает как получить из нуля ноль ?
Именно здесь надо писать не ==0 или >100 а ==EMPTY_VALUE
То-есть если пустое значение.
Ну пусть и будут... Просто в условии надо поставить сравнение не с нулём, а с пустым значением. И все проблемы будут решены.
Именно здесь надо писать не ==0 или >100 а ==EMPTY_VALUE
То-есть если пустое значение.
Надо задать SetIndexEmptyValue(НомерБуфера, 0);
Странно, но первый вариант 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;
Надо задать SetIndexEmptyValue(НомерБуфера, 0);
Зачем? Изначально проблема возникла при получении пустого значения в советник и непонимания как это обработать. А вы советуете править индикатор. Зачем???
Зачем? Изначально проблема возникла при получении пустого значения в советник и непонимания как это обработать. А вы советуете править индикатор. Зачем???
Так сейчас проблема в отрисовке провалов? Это линии в 0 уходят. А если 0 = EMPTY - линии останутся наверху
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
День Добрый!
Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь.
Пользовательский индикатор, вызванный iCustom (не конкретно какой-то, на нескольких видел) при пустом (по идее) значении буфера, выдаёт значение не ноль, а 2147483647. Это по какой-то магии совпадает с максимальным количеством баров в истории. При этом окно данных в терминале чётко не пишет ничего, т.е., вроде, должен быть ноль. Ан нет! При вызове в сову, даёт значение 2147483647.
Вот конкретно два случая:
Это то, что пишет Print. И в другом месте, где картина по идее обратная:
Ну, я, разумеется, пишу, что >100 вместо ==0. Но как-то это не правильно. Не аккуратненько как-то это.
Подскажите, может кто-то знает как получить из нуля ноль ?