Скачать MetaTrader 5

Как программно получить логи наименьшими усилиями?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй торговый сигнал. Получи доступ к миллионам трейдеров!
Andrey Khatimlianskii
56157
Andrey Khatimlianskii 2015.06.03 14:43 

Коллеги, подскажите, как прочитать из советника логи с закладки Эксперты или Журнал?

Не хочется извлекать текст из SysListView, хочется более элегантного решения.

Может, есть команда "сброс логов на диск" и ее можно отправить терминалу?

У кого какие мысли есть? 

Rustamzhan Salidzhanov
7683
Rustamzhan Salidzhanov 2015.06.03 15:09  
Andrey Khatimlianskii:

Коллеги, подскажите, как прочитать из советника логи с закладки Эксперты или Журнал?

Не хочется извлекать текст из SysListView, хочется более элегантного решения.

Может, есть команда "сброс логов на диск" и ее можно отправить терминалу?

У кого какие мысли есть? 

   правый клик в окне терминала, и выбор команды "смотреть" приводит к сбросу логов в файл
Ihor Herasko
9033
Ihor Herasko 2015.06.03 15:11  

Если логи будет читать сторонняя программа, то способ принудительного сброса лога - закрытие терминала ))) Потом сразу же открываем терминал.

Если программа основана на MQL и работает внутри терминала, то нужно исследовать, какое сообщение посылается, когда вызываем "Открыть" из контекстного меню журнала. Ведь именно так происходит сброс данных на HDD без закрытия терминала. Но такая возможность - недокументированная и придется с каждым новым билдом проверять, не изменилось ли там чего.

Andrey Khatimlianskii
56157
Andrey Khatimlianskii 2015.06.03 15:13  
Rustamzhan Salidzhanov:
   правый клик в окне терминала, и выбор команды "смотреть" приводит к сбросу логов в файл
Я в курсе )
Спрашиваю про конкретный код. Может, кто знает
Andrey Khatimlianskii
56157
Andrey Khatimlianskii 2015.06.03 15:14  
Игорь Герасько:

Если логи будет читать сторонняя программа, то способ принудительного сброса лога - закрытие терминала ))) Потом сразу же открываем терминал.

Если программа основана на MQL и работает внутри терминала, то нужно исследовать, какое сообщение посылается, когда вызываем "Открыть" из контекстного меню журнала. Ведь именно так происходит сброс данных на HDD без закрытия терминала. Но такая возможность - недокументированная и придется с каждым новым билдом проверять, не изменилось ли там чего.

Это нужно в советнике, закрытие не подходит (да и долгое оно, не вариант).

Если никто не подскажет, буду исследовать команды. 

Ihor Herasko
9033
Ihor Herasko 2015.06.03 15:19  
Andrey Khatimlianskii:

Если никто не подскажет, буду исследовать команды. 

Звучит, как угроза)) Но кто сказал, что мы испугаемся угроз?

Ну а если серьезно, то, на мой взгляд, это наиболее оптимальный вариант. Читать ListCtrl - проблемнее, т. к. там, скорее всего, двойной буфер используется.

Rustamzhan Salidzhanov
7683
Rustamzhan Salidzhanov 2015.06.03 15:22  
да там все несложно, был когда то скрипт , или советник для реконнекта, который делает практически те же самые движения, только целевое окно ему переназначить. в кодбейзе лежал
Andy
564
Andy 2015.06.03 16:23  

1. если кто-то пишет во вкладку "Эксперты", то наверное этот кто-то может писать параллельно то же самое в конкретный файл

2. учитывая непреодолимое стремление МК к песочницам и безопасности, врядли есть стандартный способ получить данные из папки, которая частью песочницы не является, а потому рискну предположить, что единственный способ прочитать системные логи - это из DLL читать *.log файлы отсюда - http://www.metatrader5.com/ru/terminal/help/startworking/structure

George Merts
3594
George Merts 2015.06.03 16:52  

Лично я все трассировочные сообщения вывожу с помощью макросов TRACE(), которые для DEBUG варианта разворачиваются в функцию (для RELEASE все зависит от установленных разрешений):

void PerformTrace(string strValue,string strFunc,string strLine)
{
   if(FUNCTIONSIG4TRACE !="" && strFunc != FUNCTIONSIG4TRACE)
      return;

   if(TRACE_PERMITION != true)
      return;
 
   uint uiCurTickCounter = GetTickCount();
  
   if(bDenyOftenTrace == true && uiCurTickCounter - uiGlobalTickCounter < TRACEMINTIME)
      return;
  
   uiGlobalTickCounter = uiCurTickCounter;
 
   string strRes;
  
   if(TRACEFUNCTIONSIG == 1)
      #ifdef __MQL5__
         StringConcatenate(strRes,strFunc,", line ",strLine,": ",strValue);
      #else  
         strRes = StringConcatenate(strFunc,", line ",strLine,": ",strValue);
      #endif  
   else
      strRes = strValue;
  
   if(TRACEREPEAT == 0)
      {
      if(strLastMessage == strValue)
         {
         ++uiNumOfPassedMessages;
         return;
         };
     
      if(uiNumOfPassedMessages > 0)
         {
         strRes = "(ВНИМАНИЕ !!! Пропущено одинаковых предыдущих сообщений: " + IntegerToString(uiNumOfPassedMessages) + "); " + strRes ;
         uiNumOfPassedMessages = 0;
         };

      strLastMessage = strValue;
      };              

   switch(TRACEMODE)
      {
      case 0:
         return;
     
      case 1:
         Print(strRes);
         return;
     
      case 2:  
         CLogFile::GlobalLogString(strRes,"MyTrace.log");
         return;


      case 3:  
         MessageBox(strRes,"TRACE Message");
         return;

      case 4:  
         Print(strRes);
         MessageBox(strRes,"TRACE Message");
         return;

      case 5:
         Print(strRes);
         CLogFile::GlobalLogString(strRes,"MyTrace.log");
         return;

      case 6:
         Print(strRes);
         CLogFile::GlobalLogString(strRes,"MyTrace.log");
         CComment::GlobalCommentString(strRes);
         return;
        
      default:
         break;
      }
};


Определяя параметр TRACEMODE - можно выводить все сообщения так, как надо, и если эти сообщения будут потом использоваться - я их вывожу в отдельный файл, который потом читается в необходимом месте.

Кроме того, там есть дополнительные параметры, с помощью которого можно задавать режимы работы частых трейсов или вобще их запретить.

Таким образом, обеспечивается гибкий вывод сообщений так, как необходимо, или вобще выключение всякого вывода.

Andrey Khatimlianskii
56157
Andrey Khatimlianskii 2015.06.03 17:06  
artemiusgreat:

1. если кто-то пишет во вкладку "Эксперты", то наверное этот кто-то может писать параллельно то же самое в конкретный файл

2. учитывая непреодолимое стремление МК к песочницам и безопасности, врядли есть стандартный способ получить данные из папки, которая частью песочницы не является, а потому рискну предположить, что единственный способ прочитать системные логи - это из DLL читать *.log файлы отсюда - http://www.metatrader5.com/ru/terminal/help/startworking/structure

1. Спасибо, кэп)

Если бы надо было читать свои записи, вопроса бы не возникло

2. Понятно, что это будет dll, вопрос в том  - какая.

Andrey Khatimlianskii
56157
Andrey Khatimlianskii 2015.06.03 17:08  
George Merts:

Лично я все трассировочные сообщения вывожу с помощью макросов TRACE(), которые для DEBUG варианта разворачиваются в функцию (для RELEASE все зависит от установленных разрешений):

Таким образом, обеспечивается гибкий вывод сообщений так, как необходимо, или вобще выключение всякого вывода.

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