MQL5におけるOOPに関する質問 - ページ 78

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL5に関するFAQ

ウラジミール・シマコフ さん 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がないとオフラインのチャートをオンラインにすることができないという事実を知っています(オフライン...オンライン...偉大にして強大なロシア語! )))

新しいデータを履歴にリセットするまで、オフラインのチャートには何も表示されません。

もうひとつは、ユーザーがリセットしていない場合、端末が自動的にリセットしてファイルを閉じて しまうこと......。のテスターで、ファイルを閉じても開くことができない...。


MQL5で念のため確認したところ、3秒ごとに1行ずつ書き込み、ログにカウンターを出力していました。この設定がfalseの場合、メモ帳で開いた後、ファイルは空になります。

すなわち、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:

とうぜんのことながら

クラスポインタの親型へのキャストはどのように行われるのですか?

それとも、コンパイル時に行われ、関数(メソッド)呼び出しのテーブルが照合されるのでしょうか?

この場合、決して高くはありません。仮想メソッドを呼び出すには(デリファレンスごとに)コストがかかる。