Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Khatimlianskii
59525
Andrey Khatimlianskii  

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

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

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

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

Rustamzhan Salidzhanov
7832
Rustamzhan Salidzhanov  
Andrey Khatimlianskii:

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

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

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

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

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

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

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

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

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

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

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

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

Ihor Herasko
16460
Ihor Herasko  
Andrey Khatimlianskii:

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

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

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

Rustamzhan Salidzhanov
7832
Rustamzhan Salidzhanov  
да там все несложно, был когда то скрипт , или советник для реконнекта, который делает практически те же самые движения, только целевое окно ему переназначить. в кодбейзе лежал
Andy
568
Andy  

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

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

George Merts
5217
George Merts  

Лично я все трассировочные сообщения вывожу с помощью макросов 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
59525
Andrey Khatimlianskii  
artemiusgreat:

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

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

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

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

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

Andrey Khatimlianskii
59525
Andrey Khatimlianskii  
George Merts:

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

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

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