Прошу помощь зала.

 

Попросили перевести индикатор с МТ4 на МТ5. 

В индикаторе важный элемент - стрелка. Создаю стрелку. А она выводится с нулевым временем. 

Не понимаю, что делаю неправильно. В МТ4 тоже самое работает.

Результат работы:

Стрелка должна выводиться в районе вертикальной линии.

Может, кто подскажет, что я делаю не так. Заранее благодарю.

Код:

if(ObjectFind(0,namePoint)!=0)
   {
   ObjectCreate(0,namePoint, OBJ_ARROW, 0,0,0);
//----     
   ObjectSetInteger(0,namePoint,OBJPROP_TIME,iTime(Symbol(),Period(),20));
   ObjectSetDouble(0,namePoint,OBJPROP_PRICE,iLow(Symbol(),Period(),20));
   ObjectSetInteger(0,namePoint,OBJPROP_ARROWCODE,241);
   ObjectSetInteger(0,namePoint,OBJPROP_COLOR,Blue);
   ObjectSetInteger(0,namePoint,OBJPROP_WIDTH,3); 
   ObjectSetInteger(0,namePoint,OBJPROP_SELECTED,true);
   }
//----    
   Price1=ObjectGetDouble(0,namePoint,OBJPROP_PRICE,1);
   Date1=ObjectGetInteger(0,namePoint,OBJPROP_TIME,1);

Print(__LINE__,"  Date1=",TimeToString(Date1)," Price1=",Price1,"  Period()=",Period()," time=",iTime(Symbol(),Period(),20),"  low=",iLow(Symbol(),Period(),20));
 
Eugeni Neumoin:

Попросили перевести индикатор с МТ4 на МТ5. 

В индикаторе важный элемент - стрелка. Создаю стрелку. А она выводится с нулевым временем. 

Не понимаю, что делаю неправильно. В МТ4 тоже самое работает.

Результат работы:

Стрелка должна выводиться в районе вертикальной линии.

Может, кто подскажет, что я делаю не так. Заранее благодарю.

Код:

если объект namePoint уже есть (например с прежнего неверного запуска) то ничего и не поменяется, как был 0 так и останется

 
Maxim Kuznetsov #:

если объект namePoint уже есть (например с прежнего неверного запуска) то ничего и не поменяется, как был 0 так и останется

Удаляю индикатор и объект . Запускаю по новой. Результат тот же.

 
Eugeni Neumoin:

Попросили перевести индикатор с МТ4 на МТ5. 

В индикаторе важный элемент - стрелка. Создаю стрелку. А она выводится с нулевым временем. 

Не понимаю, что делаю неправильно. В МТ4 тоже самое работает.

Результат работы:

Стрелка должна выводиться в районе вертикальной линии.

Может, кто подскажет, что я делаю не так. Заранее благодарю.

Код:

Код рабочий, стрелка отображается. Скорее всего, проблема в неправильной проверке. Вместо

   if(ObjectFind(0,namePoint)!=0)

более надежный вариант

   if(ObjectFind(0,namePoint)<0)

Ведь объект может быть и в первом, и во втором окне (если вдруг таковые имеются).

 
Ihor Herasko #:

Код рабочий, стрелка отображается. Скорее всего, проблема в неправильной проверке. Вместо

более надежный вариант

Ведь объект может быть и в первом, и втором окнах (если вдруг таковые имеются).

НЕ помогает

 

поскольку у Вас индикатор, попробуйте прорисовывать стрелки буфером, например так:

   //---

   SetIndexBuffer(2, SELL);

   SetIndexStyle(2, DRAW_ARROW,0,1,clrLightCoral);

   SetIndexArrow(2,226);

   SetIndexLabel(2,"SELL");

   //---

   SetIndexBuffer(3, BUY);

   SetIndexStyle(3, DRAW_ARROW,0,1,clrDodgerBlue);

   SetIndexArrow(3,225);

   SetIndexLabel(3,"BUY");


а в Вашем случае, я бы написал эту строчку так:

ObjectSetInteger(0,namePoint,OBJPROP_COLOR,clrBlue);

плюсом, Вы перерисовываете существующую стрелку, а если ее еще нет вообще, то она и не появится

поэтому можно попробовать так:

if(ObjectFind(0,namePoint)>=0)
 
Eugeni Neumoin:

Попросили перевести индикатор с МТ4 на МТ5. 

В индикаторе важный элемент - стрелка. Создаю стрелку. А она выводится с нулевым временем. 

Не понимаю, что делаю неправильно. В МТ4 тоже самое работает.

Результат работы:

Стрелка должна выводиться в районе вертикальной линии.

Может, кто подскажет, что я делаю не так. Заранее благодарю.

Код:

Вы не проверяете что возвращают iTime() и iLow(). А они могут вернуть не то, что ожидаете...
 
Renat Akhtyamov #:

поскольку у Вас индикатор, попробуйте прорисовывать стрелки буфером, например так:


а в Вашем я бы написал эту строчку так:

плюсом, Вы перерисовываете существующую стрелку, а если ее еще нет вообще, то она и не появится

поэтому лучше так:

Индикатор без буферов. Картинки надо выводить. Скрипт не подходит. Стрелку нельзя в буфер загонять. С ее помощью картинки перемещаются по графику.

Стрелка не перерисовывается. Проверка проводится для... если стрелка была нечаянно удалено, то она восстанавливается. Это 

if(ObjectFind(0,namePoint)>=0)

не правильно. Если объект есть, зачем его создавать.

 
Artyom Trishkin #:
Вы не проверяете что возвращают iTime() и iLow(). А они могут вернуть не то, что ожидаете...

Поэтому я и не люблю МТ5. Переделывал под него свой индикатор. Сталкивался с подобными подводными камнями... несколько лет назад прекратил общение с МТ5.  

---------------

Если распечатывается в строке на картинке под графиком цена и время равные нулю, то в свойствах объекта видно - время==0, а вот цена не нулевая.

 
Eugeni Neumoin #:

Индикатор без буферов. Картинки надо выводить. Скрипт не подходит. Стрелку нельзя в буфер загонять. С ее помощью картинки перемещаются по графику.

Стрелка не перерисовывается. Проверка проводится для... если стрелка была нечаянно удалено, то она восстанавливается. Это 

не правильно. Если объект есть, зачем его создавать.

вот еще момент, в целом стрелка:

      ObjectCreate(name,OBJ_ARROW,0,Time[i],Open[i],0,0,0,0);

      ObjectSet(name,OBJPROP_ARROWCODE,225);

      ObjectSet(name,OBJPROP_COLOR,DeepSkyBlue);



 
Eugeni Neumoin #:

Поэтому я и не люблю МТ5. Переделывал под него свой индикатор. Сталкивался с подобными подводными камнями... несколько лет назад прекратил общение с МТ5. 

Так ведь в МТ4 проверки также нужны. Это не МТ5-прихоть.

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