Скачать MetaTrader 5

'parameter conversion not allowed

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Victor Demihov
618
Victor Demihov  

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

'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]);

Вот её код:

 

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

Алексей Тарабанов
7328
Алексей Тарабанов  
Передавайте массив, а не его элемент и жизнь наладится, имхенько. 
Victor Demihov
618
Victor Demihov  
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]);
}
Рустам
3597
Рустам  
void DrawGrafics::DrawArrow (int fi_Number, datetime& fdt_Time, double& fd_Price)
тока вот непонятно, если вы в метод передаете элемент массива, то зачем все это, ну или передавайте весь массив. а то как то по дебильному получается...
Victor Demihov
618
Victor Demihov  
Полностью согласен. Переписал чутка иначе. Пока всё разделял по инклюдникам, налупил косяков. Теперь всё чётко. Вопрос снят.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий