Помогите начинающему разобраться. Написал такой индикатор, но он ничего не рисует. Не пойму почему? Вот код:
Потому что ваш Flag всегда имеет и будет иметь значение false. Поставьте отладочную печать и все увидите.
Выражения, указанные ниже, всегда неверны
if (Ask >= UpL + Aver_Bars) //если цена превысила количество расчетных баров и образовалась новая вершина if (Bid <= DownL - Aver_Bars) //если цена превысила количество расчетных баров
Потому что ваш Flag всегда имеет и будет иметь значение false. Поставьте отладочную печать и все увидите.
Выражения, указанные ниже, всегда неверны
Спасибо! Буду разбираться.
Я порылся в поиске и понял, что отладочная печать это прописывание таких функций как Print после изложенных условий с целью выведения контрольной надписи при его срабатывании. Я вставил эту функцию в код и увидел, что даже изначальная операция присваивания в ф-ции init() не производится. А самое главное, почему подчеркнутые вами выражения неверны? По алгоритму в ф-ции init() я присвоил значения текущих цен продажи и покупки переменным UpL и DownL. А в start() они должны меняться только после прохождения пиков?
Вот код с отладочной печатью:
//---Ф-ЦИЯ init()---------------------------------------------------- int init() { SetIndexStyle(0,DRAW_SECTION); // стиль линии: отрезки между непустыми значениями SetIndexBuffer(0,ExtMapBuffer1); // привязываем массив к номеру буфера SetIndexEmptyValue(0,0.0); // указываем при каком значении не надо ничего рисовать //--- UpL = Ask; // Пик вверх изначально равен цене покупки Print ("UpL = Ask"); DownL = Bid; // Пик вниз изначально равен цене продажи Print ("DownL = Bid"); return(0); } //---end init-------------------------------------------------------- //---Ф-ЦИЯ start()--------------------------------------------------- int start() { //---оптимизация по непосчитанным барам-------------------------- ArraySetAsSeries(ExtMapBuffer1,false); //устанавливаем направление индексирования в обратном порядке int counted_bars=IndicatorCounted(), // присваиваем переменной количество посчитанных баров limit; // вводим переменную для ограничения пересчета бара if(counted_bars>0) // если посчитанных баров больше 0 counted_bars--; // считаем их на единицу меньше, чтобы избежать проскочившие подсчет бары limit=Bars-counted_bars; // итого, для расчета нам понадобится разница между общим количеством и посчитанными барами //---end оптимизации по непосчитанным барам---------------------- //---вводим переменные для расчета зигзага----------------------- int i; // Индекс бара //--- рынок идет вверх------------------------------------------- if (Ask > UpL) // рынок идет вверх Print ("if (Ask > UpL)"); { if (Ask >= UpL + Aver_Bars) //если цена превысила количество расчетных баров и образовалась новая вершина { Print ("Цена UPL превысила количество расчетных баров"); UpL = Aver_Bars + UpL; // то верхний пик получает новое значение Direct = 1; // направление получает значение вверх Flag = true; // а флаг поднимается в значение истина DownL = Bid; // Пик вниз подтягиваем за пиком вверх } else // в противном случае { Print ("else, if (Ask >= UpL + Aver_Bars)"); Direct = 0; // направление остается никаким Flag = false; // а флаг не поднимается } } //--------------------------------------------------------------- //---рынок идет вниз--------------------------------------------- if (Bid < DownL) // рынок идет вниз Print ("if (Bid < DownL)"); { if (Bid <= DownL - Aver_Bars) //если цена превысила количество расчетных баров { Print ("Цена DOWN превысила количество расчетных баров"); DownL = DownL - Aver_Bars; // то верхний пик получает новое значение Direct = -1; // направление получает значение вверх Flag = true; // а флаг поднимается в значение истина UpL = Ask; // Пик вверх тянем за пиком вниз } else // в противном случае { Print ("else, if (Bid <= DownL - Aver_Bars)"); Direct = 0; // направление остается никаким Flag = false; // а флаг не поднимается } }
В вашей отладочной печати очень мало информации. Она информирует только о том, какой фрагмент исполняется.
Например:
Print ("Цена UPL превысила количество расчетных баров");
Сюда вы точно не попадете. Перед оператором if можно вставить следующую отладочную печать:
Print("Ask = ", Ask, " UpL + Aver_Bars = ", UpL + Aver_Bars);
Тогда у вас будет информация о значениях, и, можно будет разбираться, почему они не такие, как ожидалось.
, можно будет разбираться, почему они не такие, как ожидалось.
Да потому, что цена (Bid, Ask, UpL, DownL) суммируется (имею ввиду алгебраическое суммирование) с количеством баров (Aver_Bars).
Да потому, что цена (Bid, Ask, UpL, DownL) суммируется (имею ввиду алгебраическое суммирование) с количеством баров (Aver_Bars).
На самом деле это мой косяк - забыл исправить комментарий. На данном этапе Aver_Bars - отрезок цены, при котором получается новая вершина. Спасибо, что напомнили.
Да, с переменной Aver_Bars накосячил. Теперь изменил ее значение на 0.050. Но почему-то в init()
int init() { ..... //--- UpL = Ask; // Пик вверх изначально равен цене покупки DownL = Bid; // Пик вниз изначально равен цене продажи return(0); } //---end init--------------------------------------------------------
переменным присваивается нуль. Ведь ф-ция init() запускается при присоединении к окну финансового инструмента 1 раз. И по моей задумке переменным UpL и DownL должно присвоиться единоразово значение Ask и Bid. Не понимаю, откуда взялся нуль?
Да, с переменной Aver_Bars накосячил. Теперь изменил ее значение на 0.050. Но почему-то в init()
переменным присваивается нуль. Ведь ф-ция init() запускается при присоединении к окну финансового инструмента 1 раз. И по моей задумке переменным UpL и DownL должно присвоиться единоразово значение Ask и Bid. Не понимаю, откуда взялся нуль?
В init() индикаторов могут происходить самые неожиданные вещи. Поэкспериментируйте - загоните получение цены в цикл с конечным количеством итераций (чтобы не подвис).
Сейчас попробую
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите начинающему разобраться. Написал такой индикатор, но он ничего не рисует. Не пойму почему? Вот код: