Вопросы по ООП в MQL5 - страница 78

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы по ООП в MQL5

Vladimir Simakov, 2020.06.10 19:06

#define LOG(dText) CLog::Ptr().Log((string)__LINE__,__FUNCSIG__,dText)

class CLog{
   int cHndl;
   CLog():cHndl(FileOpen(MQLInfoString(MQL_PROGRAM_NAME)+_Symbol+(string)(int)TimeCurrent()+".log",FILE_TXT|FILE_WRITE)){}
  ~CLog() {FileClose(cHndl);}
public:
   static CLog* Ptr() {static CLog _log; return &_log;}
   void Log(string line,string sig,string text){
      string _text=StringFormat("Line: %s. Signature: %s. %s",line,sig,text);
      PrintFormat(_text);
      FileWrite(cHndl,_text);}
};


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

#define LOG(dText) CLog::_log.Log((string)__LINE__,__FUNCSIG__,dText)

class CLog{
   int cHndl;
   CLog():cHndl(FileOpen(MQLInfoString(MQL_PROGRAM_NAME)+_Symbol+(string)(int)TimeCurrent()+".log",FILE_TXT|FILE_WRITE)){}
  ~CLog() {FileClose(cHndl);}
public:
   static CLog _log;  
   void Log(string line,string sig,string text){
      string _text=StringFormat("Line: %s. Signature: %s. %s",line,sig,text);
      PrintFormat(_text);
      FileWrite(cHndl,_text);}
};

static CLog CLog::_log;


Такая конструкция не очень удобная, т.к. нельзя широко применять.

int f() { return(1); }

if (LOG(LOG(f()) -1) || LOG(LOG(f()) + 1))
  LOG(f());


Подобным образом делаю профайлинг нужных вызовов.

 
Vladimir Simakov:

Молодец! Правильно! А вот это?

Согласись, что уже посложнее)))

А если пользователь откроет файл в каком-то неведом редакторе и начнет новое тестирование? Будет искать ошибку в коде, исправлять, смотреть в лог, а лог не меняется...

А если произойдет большое заморочка и аварийное завершение работы терминала? Самое интересно в логи и не сохранится. 

 
Dmitry Fedoseev:

А если пользователь откроет файл в каком-то неведом редакторе и начнет новое тестирование? Будет искать ошибку в коде, исправлять, смотреть в лог, а лог не меняется...

А если произойдет большое заморочка и аварийное завершение работы терминала? Самое интересно в логи и не сохранится. 

А кто Вам мешает FileFlush делать? Это прототип для примера, дальше каждый сам кузнец своего счастья, а за законченные решения денежку обычно просят)))) Так открывай в чем угодно))) В этой реализации на каждый запуск - свой файл)))

UPD: я показал пример, когда ООП жизнь облегчает, а дальше, пишите как хотите, присказку про рукоблудие никто не отменял))).
 
Vladimir Simakov:

А кто Вам мешает FileFlush делать? Это прототип для примера, дальше каждый сам кузнец своего счастья, а за законченные решения денежку обычно просят)))) Так открывай в чем угодно))) В этой реализации на каждый запуск - свой файл)))

UPD: я показал пример, когда ООП жизнь облегчает, а дальше, пишите как хотите, присказку про рукоблудие никто не отменял))).

Ай, не обратил внимания, что имя файла новое каждый раз. Тогда FileFlush() добавить и с пивом потянет.

 
Dmitry Fedoseev:

Ай, не обратил внимания, что имя файла новое каждый раз. Тогда FileFlush() добавить и с пивом потянет.

Насколько я помню, FileFlush в MQL уже давно является пустышкой.  Вызывать её бесполезно.
 
Alexey Navoykov:
Насколько я помню, FileFlush в MQL уже давно является пустышкой.  Вызывать её бесполезно.

ХЗ. Без тестов не скажешь.

 
Без FileFlush и без FileClose на диск сбрасывается. Закрывал терминал через диспетчер задач.
 
Alexey Navoykov:
Насколько я помню, FileFlush в MQL уже давно является пустышкой.  Вызывать её бесполезно.

не пустышка, в MQL4 точно знаю, что без FileFlush не получится оффлайн графики онлайн строить                (оффланй..онлайн...велик и могуч русский язык! )))     )

пока не сбросишь новые данные в историю, ничего нового на чарте оффлайн графика не будет

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


проверил на всякий случай в MQL5 - пишем по одной строке раз в 3 сек., выводим в лог счетчик, если настройка false , то открыв блокнотом - будет пустой файл, если true, то содержимое файла можно прочитать в любой момент

т.е. работает FileFlush  как заявлено

#property script_show_inputs
#include <Files\FileTxt.mqh>

input bool UseFileFlush = true;
//+------------------------------------------------------------------+
void OnStart()
{
   CFileTxt f;
   f.Open("tstFileFlush.txt", FILE_WRITE | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_COMMON);
   int cnt = 0;
   while(!IsStopped())
   {
      f.WriteString(string(++cnt) + " : QWERTY\n");
      if(UseFileFlush) f.Flush();
      printf("cnt = %i", cnt);
      Sleep(3000);
   }
}
//+------------------------------------------------------------------+
 

по сабжу

а как происходит кастинг указателя класса  к родительскому типу

вернее не как, а насколько это затратно  приведение типов ? или это  на этапе компиляции будет произведено и  будет сопоставлена таблица вызовов функций (методов) 

 
Igor Makanu:

по сабжу

а как происходит кастинг указателя класса  к родительскому типу

вернее не как, а насколько это затратно  приведение типов ? или это  на этапе компиляции будет произведено и  будет сопоставлена таблица вызовов функций (методов) 

Никак не затратно в этом случае. Затратны (на одно разыменование при обращении) вызовы виртуальных методов.

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