Линии Фибоначчи. Не видят график? Ошибка терминала?

 

Это часть кода моего индикатора.  Тут предварительный расчёт минимумов одного из ТФ. Допустим, текущий ТФ у нас М30. В начале мы ищем номер бара минимального значения цены. Поиск идёт среди последних 75 баров. Это главное.

Потом уже идёт расчёт координат для построения линий Фибо. Ошибка возникает именно при нахождении минимума за последние 75 баров.


int start()
  {
//+--------------------------------------------------------------------------------------------+
N_MAX=iHighest(NULL,Текущий_Таймфрейм,MODE_HIGH,75,0);
N_MIN=iLowest(NULL,Текущий_Таймфрейм,MODE_LOW,75,0);
MAX=iHigh(NULL,Текущий_Таймфрейм,N_MAX);
MIN=iLow(NULL,Текущий_Таймфрейм,N_MIN);
//+--------------------------------------------------------------------------------------------+  

   
if (MIN<=iLow(NULL,Текущий_Таймфрейм,iLowest(NULL,Текущий_Таймфрейм,MODE_LOW,30,N_MIN)))  
   {
   if (iOpen(NULL,Текущий_Таймфрейм,N_MIN)>iClose(NULL,Текущий_Таймфрейм,N_MIN) && iClose(NULL,Текущий_Таймфрейм,N_MIN-1)>iOpen(NULL,Текущий_Таймфрейм,N_MIN))
      {
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN-1);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN-1);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);
      }  
   if (iOpen(NULL,Текущий_Таймфрейм,N_MIN)>iClose(NULL,Текущий_Таймфрейм,N_MIN) && iClose(NULL,Текущий_Таймфрейм,N_MIN-1)<=iOpen(NULL,Текущий_Таймфрейм,N_MIN) && iClose(NULL,Текущий_Таймфрейм,N_MIN-2)>iOpen(NULL,Текущий_Таймфрейм,N_MIN))
      {
      if (iOpen(NULL,Текущий_Таймфрейм,N_MIN-1)<iClose(NULL,Текущий_Таймфрейм,N_MIN-1))  
      {    
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN-1);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN-2);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);
      }
      else
      {
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN-2);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN-2);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);
      }      
      } 
   if (iOpen(NULL,Текущий_Таймфрейм,N_MIN)<iClose(NULL,Текущий_Таймфрейм,N_MIN) && iClose(NULL,Текущий_Таймфрейм,N_MIN+1)>iOpen(NULL,Текущий_Таймфрейм,N_MIN-1))
      {
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN-1);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);
      } 
   if (iOpen(NULL,Текущий_Таймфрейм,N_MIN)<iClose(NULL,Текущий_Таймфрейм,N_MIN) && iClose(NULL,Текущий_Таймфрейм,N_MIN)>iOpen(NULL,Текущий_Таймфрейм,N_MIN+1))
      {
      if (iOpen(NULL,Текущий_Таймфрейм,N_MIN+1)<iClose(NULL,Текущий_Таймфрейм,N_MIN+1))
         {
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN+1);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);         
         }
      else
         { 
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);
         }
      }
   if (iOpen(NULL,Текущий_Таймфрейм,N_MIN)<iClose(NULL,Текущий_Таймфрейм,N_MIN) && iClose(NULL,Текущий_Таймфрейм,N_MIN)<iOpen(NULL,Текущий_Таймфрейм,N_MIN+1) && iClose(NULL,Текущий_Таймфрейм,N_MIN-1)>iOpen(NULL,Текущий_Таймфрейм,N_MIN+1))
      {
      Price1=iOpen(NULL,Текущий_Таймфрейм,N_MIN);
      Price2=iClose(NULL,Текущий_Таймфрейм,N_MIN-1);
      t1=iTime(NULL,Текущий_Таймфрейм,N_MIN+5);
      t2=iTime(NULL,Текущий_Таймфрейм,N_MIN);      
      }                           
   }

//+--------------------------------------------------------------------------------------------+

if (Price1!=0 && Price2!=0)
   {
ObjectCreate("object",OBJ_FIBO,0,t2,Price2,t1,Price1);
ObjectSet("object",OBJPROP_RAY,0);
if (Текущий_Таймфрейм==5) ObjectSet("object",OBJPROP_TIMEFRAMES,OBJ_PERIOD_M5);
if (Текущий_Таймфрейм==15) ObjectSet("object",OBJPROP_TIMEFRAMES,OBJ_PERIOD_M15);
if (Текущий_Таймфрейм==30) ObjectSet("object",OBJPROP_TIMEFRAMES,OBJ_PERIOD_M30);
if (Текущий_Таймфрейм==60) ObjectSet("object",OBJPROP_TIMEFRAMES,OBJ_PERIOD_H1);
ObjectSet("object",OBJPROP_FIBOLEVELS,7);
ObjectSet("object",OBJPROP_FIRSTLEVEL,0.0);
ObjectSet("object",OBJPROP_FIRSTLEVEL+1,1.0);
ObjectSet("object",OBJPROP_FIRSTLEVEL+2,1.61);
ObjectSet("object",OBJPROP_FIRSTLEVEL+3,2.61);
ObjectSet("object",OBJPROP_FIRSTLEVEL+4,3.61);
ObjectSet("object",OBJPROP_FIRSTLEVEL+5,4.23);
ObjectSet("object",OBJPROP_FIRSTLEVEL+6,4.61);
ObjectSetFiboDescription("object",0,"Максимум");
ObjectSetFiboDescription("object",1,"Уровень 100");
ObjectSetFiboDescription("object",2,"Уровень 161");
ObjectSetFiboDescription("object",3,"Уровень 261");
ObjectSetFiboDescription("object",4,"Уровень 361");
ObjectSetFiboDescription("object",5,"Уровень 423");
ObjectSetFiboDescription("object",6,"Уровень 461");
   }


Вот пример.

Присоединяю индикатор на график и получаю линии ФИБО, которые нарисовались аш в районе начала июля. На М30 это явно намного больше 75 баров назад они нарисовались. Экстремум найден не на последних 75 баров и соответственно линии ФИБО нарисовались не там, где надо.

Так как индикатор анализирует разные ТФ, то я его НЕ присоединял именно на М30. Ошибка становится видна когда открываешь именно М30 и видишь, что линий ФИБО нету, они вообще далеко в истории рисуются. 

И только после того как я открываю М30 и удаляю ранее нарисованные объекты. Только после этого  линии строятся правильно. То есть рисуются на истории 75 баров, не более. Вот так они должны были изначально нарисоваться.

 

Что это значит? Почему индикатор не видит того, что происходит на других ТФ? Он начинает видеть другие ТФ только тогда, когда откроешь окно данного ТФ. Что-то непонятно. Эта проблемма возникла именно с линиями ФИбО. До этого я не замечал того, что индикаторы не могут читать другие ТФ. У меня даже мультивалютник работает вообще на одном окне и работает на разных ТФ и на разных инструментах. Включаю терминал. открываю любое окно и присоединяю туда свой мультивавалютник и он нормально работает. Анализирует все инструменты и ТФ, заключает сделки, даже если графические окна этих интсрументов вообще не открыты. Странно. Проблемма возникла именно с линиями ФИБО.

Что это?

 
с линиями фибо всё нормально и проверено. Ищите ошибки в коде. выводите коментом или принтом промежуточные значения.
 

А как Вы обрабатываете ошибку 4066? Или этот "текущий таймфрейм" уже открыт на каком-либо графике?

 
sergeev >>:
с линиями фибо всё нормально и проверено. Ищите ошибки в коде. выводите коментом или принтом промежуточные значения. 

  Это я всегда делаю, когда возникают ошибки. Это ничего не даёт. Индикатор рассчитывает не последние 75 баров, а видимо те 75 баров, которые видит. А видит он не последние бары. Присоединяю вот индикатор к текущему графику, допустим на М15. Внутри кода же должен быть расчёт другого ТФ, допустим М30. И результаты поиска минимумов вообще находятся в начале июля. Линии Фибо строятся на свечах начала июля, т е далеко не на последних 75 баров.

  Это видно когда открываешь М30. но потом,если удалить все объекты, то новый расчёт делается уже правильно. Расчёт делается праввильно - значит в коде ошибки нету, а ошибка в чтении ТФ. Не понимаю почему индикатор не читает другие ТФ. Эта ошибка на всех парах, где не был заранее открыт соответствующий ТФ. 

 
stringo >>:

А как Вы обрабатываете ошибку 4066? Или этот "текущий таймфрейм" уже открыт на каком-либо графике?

  Нету такой ошибки и не видел. В Журнале всё чисто. 

 
FOReignEXchange >>:

  Нету такой ошибки и не видел. В Журнале всё чисто. 

а в журнале она и не появится. Надо принудительно вывод делать GetLastError

 

Похоже тут линии Фибо ни при чём. 

Видимо, Всё сводится вот к этому

N_MAX=iHighest(NULL,Текущий_Таймфрейм,MODE_HIGH,75,0);
N_MIN=iLowest(NULL,Текущий_Таймфрейм,MODE_LOW,75,0);
MAX=iHigh(NULL,Текущий_Таймфрейм,N_MAX);
MIN=iLow(NULL,Текущий_Таймфрейм,N_MIN)


Почему экстремумы находятся не на последних 75 барах,а далеко в истории? Простой вопрос.

 

Да, задали тебе задачку. Я от нее отказался

 
Vinin >>:

Да, задали тебе задачку. Я от нее отказался

  Задачка как задачка. Код намного упрощается. Оказывается на пиках всего 2 варианта постановки линий Фибо. А я тут рассчитывал аш 7 вариантов.

Ничего сложного. Только вот проблемма с чтением истории возникает. Разберусь как-нить.

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