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

 
インプットの名前を知っている場合は、2 番目のオプションの方がよい。Expert Advisor で入力の順序を考える必要がなくなる。また、技術的にも実装が優れている。
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // カウンセラーへの道
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  Params[1].type = TYPE_INT;
  Params[1].integer_value = 123423;
  EXPERT::AddInputName(Params[1], "inpFirst");

  EXPERT::Run(0, Params);
}


inpFirst は 2 番目のインプットであるにもかかわらず、任意のインプットを設定することができる。設定されていないものはデフォルトとなる。

 
実験のために、いくつかのチャートのロボットをクローンする必要があった。私はこの機能を使ってそれを行った。
#include <fxsaber\Expert.mqh> //https://www.mql5.com/ja/code/19003

// 実行中のExpert Advisorを現在の設定で一方のチャートから他方のチャートにコピーします。
bool ExpertFromTo( const long ChartSource, const long ChartTarget )
{
  bool Res = false;
    
  MqlParam Params[];
  string Names[];

  const int ExpertMode = EXPERT::Parameters(ChartSource, Params, Names);  
  const int Size = ArraySize(Params);
  
  if (Size)
  {
    Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
    
    for (int i = 1; i < Size; i++)
      EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);

    Res = EXPERT::Run(ChartTarget, Params);
  }
  
  return(Res);
}


次のように使った。

#property script_show_inputs

input int inAmount = 5; // クローンの数

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  if (Size > inAmount)
    for (int i = 0, Count = 0; i < Size; i++)
    {
      const string Symb = SymbolName(i, true);
      
      if (Symb != _Symbol)
      {
        ExpertFromTo(0, ChartOpen(Symb, PERIOD_CURRENT)); // 新しいチャート-シンボルで現在のEAを実行する。
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

複数のターミナルで十数種類のExpert Advisorを再起動する作業が発生する。一般的には、大きなルーチン。

例えば、何かを修正した。そしてMEで一括コンパイルして再起動する。私はそのようなスクリプトを使用しています。

// すべてのチャートでEAをリロードする。
input int inInterval = 5; // チャートの再スタート間隔(秒

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // タスクをチャート・キューに入れる。
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // キューを移動させる。
}

void OnStart()
{
  const long chartID = ::ChartID();

  for (long Chart = ChartFirst(); (Chart != -1) && !IsStopped(); Chart = ChartNext(Chart))
    if ((Chart != chartID) && (ChartGetString(Chart, CHART_EXPERT_NAME) != NULL) && (ReloadChart(Chart)))    
      Sleep(inInterval * 1000);
}

私はコード内の重要な場所をマークしている。それがなければ、テンプレートの適用は、スクリプトの最後までされません。例えて言えば、ターミナルをリロードした後のExpert Advisorの起動なども 解決できます。

 
fxsaber:

複数のターミナルで何十種類ものExpert Advisorを再起動する作業が発生する。一般的に、大変な作業です。

例えば、何かを修正した。MEで一括コンパイルして再起動。私はこのスクリプトを使っている。

コード中の重要な場所をハイライトしました。これがないと、テンプレートはスクリプトの最後まで使用されません。類推すると、ターミナルをリロードした後のExpert Advisorの起動なども 解決できます。

指定したチャート上でEAの名前を取得できれば一式となる。難しくなければ完成させてください。

 
Vladimir Pastushak:

指定された表に参議院議員の名前を入れてもらえれば完成です。差し支えなければ、完成させてください。

ChartGetString(Chart, CHART_EXPERT_NAME)

こちらはMT5です。クロスプラットフォームやExpert Advisorへのフルパスが必要な場合は、Expert.mqh経由で。

 
fxsaber:

これはMT5です。クロスプラットフォームまたは Expert Advisor へのフルパスが必要な場合は、Expert.mqh.

クロスプラットフォームが必要な場合

 
Vladimir Pastushak:

クロスプラットフォーマーが必要だ...

取引、自動取引システム、取引戦略のテストに関するフォーラム。

ライブラリ: Expert

fxsaber, 2019.09.12 06:17.

#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);    
}
 
// ファイル入力変数を選択されたファイルと等しくする。
bool FileDialogToInput( const string InputName, const long Chart = 0 )
{  
  string FileNames[];
  const bool Res = (FileSelectDialog(MQLInfoString(MQL_PROGRAM_NAME) + " " + _Symbol + " " + EnumToString(_Period) +
                    ": input string " + InputName + " = ",
                    NULL, NULL, FSD_FILE_MUST_EXIST, FileNames, NULL) > 0);
  if (Res)
  {    
    MqlParam Params[];
    string Names[];
  
    const int ExpertMode = EXPERT::Parameters(Chart, Params, Names);  
    const int Size = ArraySize(Params);
    
    if (Size)
    {
      Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
      
      for (int i = 1; i < Size; i++)
      {
        if (Names[i - 1] == InputName)
          Params[i].string_value = FileNames[0];
        
        EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);
      }
  
      EXPERT::Run(Chart, Params);
    }    
  }
  
  return(Res);
}

この関数は、入力変数としてファイルを選択することができる。この実装。

input string inFileName = NULL; // 選択されたファイル

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // 入力変数に有効なファイルが指定された場合のコード。

  return(INIT_SUCCEEDED);
}


起動します。


OKをクリックし、選択する。


Openをクリックし、実行中のEAのプロパティ(F7)を見る。


いくつのファイルでも同じように動作します。

input string inFileName1 = NULL; // 選択されたファイル1
input string inFileName2 = NULL; // 選択されたファイル2

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName1))
    return(FileDialogToInput(TOSTRING(inFileName1)) || INIT_FAILED);

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // 入力変数に有効なファイルが指定された場合のコード。

  return(INIT_SUCCEEDED);
}
 
また、セットファイルからのパラメーターのロードはまだサポートされていないようだが?
 
traveller00:
また、セットファイルからのパラメーターのロードはまだサポートされていないようだが?

まだです。でも、とても簡単なことなんだ。