Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Установил MetaTrader 5? Узнай о нем подробно!
Victor Demihov
618
Victor Demihov 2015.07.17 21:07 

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

'dt' - parameter conversion not allowed ZZBaseVariant.mq4       145     30

 Почему оно так пишет?

Вот OnTick(), в котором тестирую свой инклюдник:

void OnTick()
{
//   Print ("ChartFirst(): ", ChartFirst());
   // -----------------------------------------------------------------------------------------

   if (gdt_LastBarTime != Time[0])
   {
      datetime dt[100];
      double   d[100];
      
      OTotal = CPosInf.FindPositions (AmountPosByType);   // Получаем количество позиций( по типам )
      
      ZZ.MakeNoneEmptyArray (_Symbol, 0);
      
      for (int i=0; i<5; i++)
      {
         dt[i] = ZZ.GetZZExtremumTime(i);
         d[i] = ZZ.GetZZExtremumPrice(i);
         
         CDraw.DrawArrow (i, dt[i], d[i]);
         
//         Print ("ZZ.GetZZExtremumPrice(", i, ") = ", ZZ.GetZZExtremumPrice(i));
  //       Print ("ZZ.GetZZExtremumTime(", i, ") = ", ZZ.GetZZExtremumTime(i));
      }
      
      gdt_LastBarTime = Time[0];
   }
}

 По сути если раскомментить строку:

//       Print ("ZZ.GetZZExtremumTime(", i, ") = ", ZZ.GetZZExtremumTime(i));

 Видно, что формат и типа данного геттера возвращается верный:

2015.07.17 23:53:43.554 ZZBaseVariant AUDUSD,M1: ZZ.GetZZExtremumTime(3) = 2015.07.17 23:32:00
2015.07.17 23:53:43.554 ZZBaseVariant AUDUSD,M1: ZZ.GetZZExtremumTime(2) = 2015.07.17 23:38:00
2015.07.17 23:53:43.554 ZZBaseVariant AUDUSD,M1: ZZ.GetZZExtremumTime(1) = 2015.07.17 23:39:00
2015.07.17 23:53:43.554 ZZBaseVariant AUDUSD,M1: ZZ.GetZZExtremumTime(0) = 2015.07.17 23:51:00

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

Объявляется она верно:

datetime  GetZZExtremumTime (int fi_Index);

 Кстати, самое интересное, что ошибка компиляции возникает лишь тогда, когда вызывается функция CDraw.DrawArrow (i, dt[i], d[i]);

Вот её код:

 

 Иначе не ругается (если её закомментить).

Алексей Тарабанов
7220
Алексей Тарабанов 2015.07.17 21:20  
Передавайте массив, а не его элемент и жизнь наладится, имхенько. 
Victor Demihov
618
Victor Demihov 2015.07.18 07:10  
tara:
Передавайте массив, а не его элемент и жизнь наладится, имхенько. 

Я это понимаю. Но как тогда логику выстроить? Хочу чтоб рисовало один графический элемент при необходимости. Вот получается что имеем в функции вызова:

      for (int i=0; i<5; i++)
      {
         CDraw.DrawArrow (i, ZZ.GetZZExtremumTime(i), ZZ.GetZZExtremumPrice(i));
         
//         Print ("ZZ.GetZZExtremumPrice(", i, ") = ", ZZ.GetZZExtremumPrice(i));
  //       Print ("ZZ.GetZZExtremumTime(", i, ") = ", ZZ.GetZZExtremumTime(i));
      }

 В сама функция вот:

void DrawGrafics::DrawArrow (int fi_Number, datetime& fdt_Time[], double& fd_Price[])
{
   string objName = StringConcatenate ("Это стрелочка!");
   
   ObjectCreate (objName, OBJ_ARROW_UP, 0, fdt_Time[fi_Number], fd_Price[fi_Number]);
   
   // Перерисуем объект
   WindowRedraw();
}

 Это тестовый вариант. Конечно будет ещё доработок прилично для реала, но пока что хочу запустить то что необходимо, дабы не гоордить излишний код.

Кстати, я передаю именно элемент массива:

//=========================================================================================================================================
// 1.3 Получаем значение цены на заданном индексе экстремума
double ZZOperations::GetZZExtremumPrice(int fi_Index) {
   return (ZZExtremumPrice[fi_Index]);
}

//=========================================================================================================================================
// 1.4 Получаем значение времени на заданном индексе экстремума
datetime ZZOperations::GetZZExtremumTime (int fi_Index) {
   return (ZZExtremumTime[fi_Index]);
}
Рустам
3601
Рустам 2015.07.18 10:11  
void DrawGrafics::DrawArrow (int fi_Number, datetime& fdt_Time, double& fd_Price)
тока вот непонятно, если вы в метод передаете элемент массива, то зачем все это, ну или передавайте весь массив. а то как то по дебильному получается...
Victor Demihov
618
Victor Demihov 2015.07.18 16:38  
Полностью согласен. Переписал чутка иначе. Пока всё разделял по инклюдникам, налупил косяков. Теперь всё чётко. Вопрос снят.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий