Скачать MetaTrader 5

Почему не рисует индикатор?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск в документации доступен через MetaTrader 5. Ищи и изучай!
Anton
53
Anton 2013.03.18 19:42 
#property indicator_chart_window     // индикатор в отдельном окне
#property indicator_buffers 1     // будет использовать только один буфер для построения линии
#property indicator_color1 Red     // цвет линии индикатора будет красный

extern int Aver_Bars = 5;     // Количество баров для расчёта

//--- buffers
double ExtMapBuffer1[];     // этот массив будет настроен как буфер данных 

//---вводим глобальные переменные для расчета зигзага----------------
int Direct = 0;     // Направление: 0 - никакое; 1 - вверх; -1 - вниз

double DownL;     // Пик вниз
double UpL;     // Пик вверх

bool Flag=false;     // флаг лежит

//---------------------------------------------------------------
//---Ф-ЦИЯ init()----------------------------------------------------
int init()
  {
   SetIndexStyle(0,DRAW_SECTION);     // стиль линии: отрезки между непустыми значениями
   SetIndexBuffer(0,ExtMapBuffer1);     // привязываем массив к номеру буфера
   SetIndexEmptyValue(0,0.0);     // указываем при каком значении не надо ничего рисовать
   //---
   UpL  =  Ask;     // Пик вверх изначально равен цене покупки
   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)     // рынок идет вверх
      {
      if (Ask  >=  UpL  +  Aver_Bars)     //если цена превысила количество расчетных баров и образовалась новая вершина
         {
         UpL  =  Aver_Bars  +  UpL;     // то верхний пик получает новое значение
         Direct  =  1;     // направление получает значение вверх
         Flag  =  true;     // а флаг поднимается в значение истина
         }
      else     // в противном случае
         {
         Direct  =  0;     // направление остается никаким
         Flag  =  false;     // а флаг не поднимается        
         }
      }
    //---------------------------------------------------------------
    //---рынок идет вниз---------------------------------------------
    if (Bid  <=  DownL)     // рынок идет вниз
      {
      if (Bid  <=  DownL  -  Aver_Bars)     //если цена превысила количество расчетных баров
         {
         DownL  =  DownL  -  Aver_Bars;     // то верхний пик получает новое значение
         Direct  =  -1;     // направление получает значение вверх
         Flag  =  true;     // а флаг поднимается в значение истина
         }
      else     // в противном случае
         {
         Direct  =  0;     // направление остается никаким
         Flag  =  false;     // а флаг не поднимается        
         }
      }
    //---------------------------------------------------------------
    //---заполняем буфер---------------------------------------------
    for(i=0;i<limit;i++)     // перебираем сначала все бары, а потом только новые
      {
      
      if(Direct  ==  1  &&  Flag  ==  true)     // если направление вверх и флаг совпадают
         ExtMapBuffer1[i]  =  UpL;     // буфер строится на вершинах вверх
      else
         ExtMapBuffer1[i]=0.0;     // в противном случае не надо ничего рисовать
      if (Direct  ==  -1  &&  Flag  ==  true)     //если наоборот
         ExtMapBuffer1[i]  =  DownL;     // буфер строится на вершинах вниз  
      else
         ExtMapBuffer1[i]=0.0;
      }
    
    //---------------------------------------------------------------
   return(0);
  }
//---end start()-----------------------------------------------------


//---Ф-ЦИЯ deinit()--------------------------------------------------
int deinit()
  {
//----
   
//----
   return(0);
  }
//---end deinit()----------------------------------------------------

Помогите начинающему разобраться. Написал такой индикатор, но он ничего не рисует. Не пойму почему? Вот код:

Mislaid
622
Mislaid 2013.03.18 20:41  
GaNDarM:

Помогите начинающему разобраться. Написал такой индикатор, но он ничего не рисует. Не пойму почему? Вот код:

 

Потому что ваш Flag всегда имеет и будет иметь значение false. Поставьте отладочную печать и все увидите.

Выражения, указанные ниже, всегда неверны

      if (Ask  >=  UpL  +  Aver_Bars)     //если цена превысила количество расчетных баров и образовалась новая вершина
      if (Bid  <=  DownL  -  Aver_Bars)     //если цена превысила количество расчетных баров
Anton
53
Anton 2013.03.19 05:21  
Mislaid:

Потому что ваш Flag всегда имеет и будет иметь значение false. Поставьте отладочную печать и все увидите.

Выражения, указанные ниже, всегда неверны

 


Спасибо! Буду разбираться.
Anton
53
Anton 2013.03.19 06:11  

Я порылся в поиске и понял, что отладочная печать это прописывание таких функций как 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;     // а флаг не поднимается        
         }
      }




Mislaid
622
Mislaid 2013.03.19 07:36  

В вашей отладочной печати очень мало информации. Она информирует только о том, какой фрагмент исполняется.

Например:

         Print ("Цена UPL превысила количество расчетных баров");

Сюда вы точно не попадете. Перед оператором if можно вставить следующую отладочную печать:

Print("Ask = ", Ask, " UpL +  Aver_Bars = ", UpL +  Aver_Bars);

Тогда у вас будет информация о значениях, и, можно будет разбираться, почему они не такие, как ожидалось. 

Vladyslav Goshkov
2068
Vladyslav Goshkov 2013.03.19 07:49  
Mislaid:

, можно будет разбираться, почему они не такие, как ожидалось. 

 


Да потому, что цена (Bid, Ask, UpL, DownL) суммируется (имею ввиду алгебраическое суммирование) с количеством баров (Aver_Bars). 
Anton
53
Anton 2013.03.19 08:26  
VladislavVG:

Да потому, что цена (Bid, Ask, UpL, DownL) суммируется (имею ввиду алгебраическое суммирование) с количеством баров (Aver_Bars). 


На самом деле это мой косяк - забыл исправить комментарий.  На данном этапе Aver_Bars - отрезок цены, при котором получается новая вершина. Спасибо, что напомнили.

Anton
53
Anton 2013.03.19 08:37  
Подскажите, а почему когда я использовал для отладочной печати ф-ции MessageBox и Print ни в журнале, ни в окне инструмента никаких сообщений не выводилось. А когда я их заменил на Alert, сообщения стали появляться?
Anton
53
Anton 2013.03.19 09:04  

Да, с переменной Aver_Bars накосячил. Теперь изменил ее значение на 0.050. Но почему-то в init()

 
int init()
  {
   .....
   //---
   UpL  =  Ask;     // Пик вверх изначально равен цене покупки
   DownL  =  Bid;     // Пик вниз изначально равен цене продажи
   
   return(0);
  }
//---end init--------------------------------------------------------

 переменным присваивается нуль. Ведь ф-ция init() запускается при присоединении к окну финансового инструмента 1 раз. И по моей задумке переменным UpL и DownL  должно присвоиться единоразово значение Ask и Bid. Не понимаю, откуда взялся нуль?

TarasBY
1739
TarasBY 2013.03.19 09:14  
GaNDarM:

Да, с переменной Aver_Bars накосячил. Теперь изменил ее значение на 0.050. Но почему-то в init()

 

 переменным присваивается нуль. Ведь ф-ция init() запускается при присоединении к окну финансового инструмента 1 раз. И по моей задумке переменным UpL и DownL  должно присвоиться единоразово значение Ask и Bid. Не понимаю, откуда взялся нуль?

В init() индикаторов могут происходить самые неожиданные вещи. Поэкспериментируйте - загоните получение цены в цикл с конечным количеством итераций (чтобы не подвис).
Anton
53
Anton 2013.03.19 10:09  
TarasBY:
В init() индикаторов могут происходить самые неожиданные вещи. Поэкспериментируйте - загоните получение цены в цикл с конечным количеством итераций (чтобы не подвис).

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