ライブラリ: エキスパート - ページ 7

 

MT4 とは異なり、MT5 では Expert Advisor の起動時または変更時に入力パラメータをログに記録しません。そのため、ターミナルで何が起動されたかをログから判断することはできません。

同様の機能により、この状況を修正することができます。

#include <fxsaber\Expert.mqh> //https://www.mql5.com/ja/code/19003

// 実行中のEAのデータを出力する。
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}


アプリケーション

input int inInput1 = 1;
input int inInput2 = 2;

int OnInit()
{
  Print(EAToString());
  
  return(INIT_FAILED);
}


結果

Test8 (EURUSD,M1)       Expert Experts\Test8.ex5, expertmode = 4
Test8 (EURUSD,M1)       inInput1 = 1
Test8 (EURUSD,M1)       inInput2 = 2


残念ながら、スクリプトに対しては機能しません。MT4はスクリプトの入力パラメータを自ら出力しますが、MT5は出力しません。

 
このライブラリを使用したDLLを使用するEAを実行できません。ログではDLLのロードが許可されていません。何か対処法はありますか?
 
pivomoe:
このライブラリを使用したDLLを使用するEAを実行できません。ログではDLLのロードが許可されていません。何か対処法はありますか?
Params[0].string_value += "\nexpertmode=5"; // DLLの使用許可
 
fxsaber:

うまくいっている。

 
input グループでライブラリの動作を確認しました。コードを変更する必要はなかった。
 

私が懸念しているのは、文字列内の一時的なテンプレート名として定数を使用する原則である:

#define  FILENAME (__FILE__ + ".tpl")

これはマルチスレッドに関連する潜在的なバグを含んでいる。異なるチャート上で実行されている同じプログラムがライブラリを使用しようとすると、テンプレート・ファイルとの衝突が発生する可能性があります - アクセス・エラーが発生するか、異なるテンプレートが使用されたにもかかわらず、2つの同じテンプレートが静かに起動します。

できれば、MQL-program-name + timestamp + randomの形式で一時的な名前を生成する必要があります。

また、フォルダに散らばらないように、次の呼び出し時にタイムアウトで自動的に以前のファイルを削除することが望ましい。例えば、1日後に(タイムスタンプの一部を解析して)。

追記。FILE__はソース・ファイルであり、これを使用するすべてのプログラムで常にExpert.mqhと等しいため、このケースはさらに悪化する!名前による文章を修正。
 
Stanislav Korotky:

これは、すべての長所と短所を天秤にかけて、意識的に行ったことだ。

テンプレートを作成したら、1日に1回ではなく、すぐに削除することは理にかなっている。しかし、最後に保存したテンプレートが常にあれば、何が起こっているのかをよりよく分析できて便利だ。

 
fxsaber:

メリットとデメリットを考慮し、意図的にやったことだ。

テンプレートを作成したら、1日に1回ではなく、すぐに削除するのは理にかなっている。しかし、最後に保存したテンプレートが常にあれば、何が起きているのかをよりよく分析できて便利だ。

現在の方法の長所を挙げることはできません。IMHOは、より正しい方法を提案しました。

Sync=true(デフォルト)の場合、一度に削除するのは理にかなっていますが、現在はそのようには実装されていません。

 
Stanislav Korotky:

今の方法の "長所 "はひとつも思いつかない。IMHOは、より正しい方法を提案した。

長所は実践的な応用です。私は 以前に起動したExpert AdvisorでTerminalを起動した。それらは完璧に機能した。理論的な衝突を再現することは可能でしょう。しかし、私の場合は実践には程遠い。もし普遍的な解決策を作ることに決めたら、ここで共有してください。バイブルを更新します。私自身はまだ準備ができていない。

Sync=true(デフォルト)なら一度に削除するのが理にかなっているのですが、今はそのようには実装されていません。

そう、わざと削除しているわけではないんだ。

 
fxsaber:

これは実践的なアプリケーションです。私は以前に起動したExpert AdvisorでTerminalを起動 しました。それらは完璧に機能した。理論的な衝突を再現することは可能だと確信している。しかし、私の場合は実践には程遠い。もし普遍的な解決策を作ることに決めたら、ここで共有してください。バイブルを更新します。私自身はまだ準備ができていない。

ええ、わざと削除しているわけではありません。

なぜExpert.mqh.tplという定数名が、それを生成するプログラムにちなんだ名前のテンプレートよりも「実用的」(practical?)なのか、いまだに理解できないのだが?biblaを使うプログラムA.mq5とB.mq5があるとしよう。もしそれらが独自の名前でテンプレートを生成した場合、まず第一に、一方を他方で上書きするのではなく、_それぞれのプログラムのアクションの最後の「フィンガープリント」を持つ方がより実用的でしょう。第二に、ジェネレーターが誰であるかを名前によってすぐに知ることができる(特にそのプログラムが外国のものである場合に便利である)。現在では、Expert.mqh.tplファイルの中に入るまで、それを知ることはできない。私が示した普遍的な解決策は、MQLプログラムの名前+タイムスタンプ+ランダムを取ることです。また、ファイルをsync=trueのままにしておく必要はないと思います。すべてのテストとデバッグはとっくに終わっていると思います。エラーやデバッグが必要な場合は、sync=falseというオプションがあります。そうすれば、ファイルは残されるはずだ。すべてが論理的だと思います。編集も簡単です。

誰かが複数のプログラムで並行してビブリオを使用しない限り、実際には衝突はめったに起こらないかもしれないことに同意します。私は持っていませんが、コードをざっと見て、FilesフォルダのExpert.mqh.tplに目が留まりました。すべては純粋に想像です。