MQL5의 OOP에 대한 질문 - 페이지 78

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL5의 OOP에 대한 질문

블라디미르 시마코프 , 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: OOP가 삶을 더 쉽게 만드는 예를 보여 줬고 원하는대로 쓰십시오. 아무도 자위에 대한 말을 취소하지 않았습니다)))).
 
Vladimir Simakov :

누가 당신이 FileFlush를 하지 못하도록 막나요? 이것은 예의 프로토 타입이며 모든 사람은 자신의 행복의 대장장이이며 완성 된 솔루션의 경우 일반적으로 돈을 요구합니다)))) 그래서 무엇이든 여십시오))) 이 구현에서 각 실행에는 자체 파일이 있습니다) ))

UPD: OOP가 삶을 더 쉽게 만드는 예를 보여 줬고 원하는대로 쓰십시오. 아무도 자위에 대한 말을 취소하지 않았습니다)))).

아, 파일 이름이 매번 새롭다는 것을 눈치채지 못했습니다. 그런 다음 FileFlush() 를 추가하고 맥주와 함께 당깁니다.

 
Dmitry Fedoseev :

아, 파일 이름이 매번 새롭다는 것을 눈치채지 못했습니다. 그런 다음 FileFlush()를 추가하고 맥주와 함께 당깁니다.

내가 기억하는 한 MQL의 FileFlush 는 오랫동안 더미였습니다. 그녀를 불러도 소용없다.
 
Alexey Navoykov :
내가 기억하는 한 MQL의 FileFlush는 오랫동안 더미였습니다. 그녀를 불러도 소용없다.

HZ. 테스트 없이는 말할 수 없습니다.

 
FileFlush가 없고 FileClose가 없으면 디스크가 플러시됩니다. 작업 관리자를 통해 터미널을 닫았습니다 .
 
Alexey Navoykov :
내가 기억하는 한 MQL의 FileFlush는 오랫동안 더미였습니다. 그녀를 불러도 소용없다.

더미가 아니라 MQL4에서 FileFlush 없이는 온라인으로 오프라인 차트를 작성할 수 없다는 것을 확실히 알고 있습니다(offline..online... 러시아어는 훌륭하고 강력합니다! ))))

새 데이터를 기록으로 재설정할 때까지 오프라인 차트에는 새로운 것이 없습니다.

또 다른 질문은 단말이 자동으로 파일을 리셋하고 사용자가 하지 않으면 파일을 닫는다는 것입니다.... 테스터에서 연초에 파일을 닫은 후에도 열 수 있습니다.... 나중에 확인


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 :

주제별

그리고 부모 유형에 대한 클래스 포인터의 캐스팅은 어떻게 발생합니까?

또는 오히려, 방법이 아니라 유형 캐스팅이 얼마나 비용이 많이 듭니까? 또는 컴파일 시간에 생성되고 함수 호출(메소드) 테이블이 비교됩니다.

이 경우 전혀 비싸지 않습니다. 가상 메서드에 대한 비용이 많이 듭니다(액세스할 때 한 번의 역참조).