初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 775

 
Vladimir Karputov:

それは、「...」と書いてあります。ステップ1 ...」とあります。

ステップ2について - 今度は自分自身で考えてみてください。つまり、「複数のスレッドが矛盾なく1つのファイルに書き込むにはどうしたらいいか」ということです。


それは、彼らができないことです...

ネットワークエージェントは、DLLライブラリを扱うことができないのですね。


テスターのパスナンバーを調べる方法はありますか?ファイルを結合できるようにするには・・・。

 
Aleksey Vyazmikin:

エージェントに同じファイルに書き込むように教えるにはどうしたらよいでしょうか?今は、みんなが自分のファイルを自分のフォルダに作っているので、よくないですね。

エージェントのデータを同じファイルに書き込むには、フレームモードを使用する必要があります。

// Пример записи данных Агентов (включая Облачные) в один файл
input int Range = 0;

void OnTick()
{
// ....
}

// Файл открываем только в режимах одиночночного прогона или Фрейма.
const int handle = ((MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION)) || MQLInfoInteger(MQL_FRAME_MODE)) ?
                   FileOpen(__FILE__, FILE_WRITE | FILE_TXT) : INVALID_HANDLE;

// Подготовка данных
void GetData( string &Str, MqlTick &Ticks[], double &Balance )
{
  Str = "Hello World!";
  
  CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 2); // Последние два тика (пример)
  
  Balance = AccountInfoDouble(ACCOUNT_BALANCE);
}

// Запись данных
void SaveData( const string &Str, const MqlTick &Ticks[], const double Balance )
{
  FileWrite(handle, Str);
  
  for (int i = 0; i < ArraySize(Ticks); i++)
    FileWrite(handle, Ticks[i].bid);
    
  FileWrite(handle, Balance);
}

void OnTesterDeinit()
{
  if (handle != INVALID_HANDLE)  
    FileClose(handle);
    
  ChartClose();
}

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

double OnTester()
{
  string Str;
  MqlTick Ticks[];
  double Balance;
  
  GetData(Str, Ticks, Balance); // Подготовка данных для записи

  if (MQLInfoInteger(MQL_OPTIMIZATION)) // Оптимизация
  {
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Str;
    Container[1] = Ticks;
    Container[2] = Balance;
  
    FrameAdd(NULL, 0, 0, Container.Data); // Отправили данные из Агента на Терминал
  }
  else // Одиночный прогон
  {    
    if (handle != INVALID_HANDLE)
      SaveData(Str, Ticks, Balance); // Данные будут записаны в MQL5\Files-папку Агента (не Терминала)
    
    FileClose(handle);
  }
  
  return(0);
}

void OnTesterPass()
{    
  if (handle != INVALID_HANDLE)
  {
    ulong Pass;
    string Name;
    long ID;
    double Value;
  
    CONTAINER<uchar> Container; // https://www.mql5.com/ru/forum/95447/page4#comment_5464205
  
    while (FrameNext(Pass, Name, ID, Value, Container.Data))
    {
      string Str;
      MqlTick Ticks[];
      double Balance;
      
      // Получили данные от Агента
      Container[0].Get(Str);
      Container[1].Get(Ticks);
      Container[2].Get(Balance);
      
//      FileWrite(handle, Pass);     // Если хочется записать номер прохода
      SaveData(Str, Ticks, Balance); // Данные будут записаны в MQL5\Files-папку Терминала (не Агента)
    }
  }
}
 
fxsaber:

Agentsのデータを1つのファイルに書き出すには、Frameモードを使用する必要があります。


ありがとうございました。調べてみないとわからないですね。

フレームモード」とは何ですか?

 
Aleksey Vyazmikin:

フレームモード」とは何ですか?

https://www.mql5.com/ru/docs/optimization_frames

Документация по MQL5: Работа с результатами оптимизации
Документация по MQL5: Работа с результатами оптимизации
  • www.mql5.com
Работа с результатами оптимизации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

ありがとうございます-モードがわかるもの

しかし、よくわからないのですが、このフレームで100個のインジケータを一括で渡すことは可能なのでしょうか?なぜ1フレームなのでしょうか。私が説明で理解したように、各フレームは別々のパスとみなされるからでしょうか、それとも私の理解が間違っているのでしょうか。

また、*.mqd ファイル形式の記述はどこにあるのでしょうか?

 
Aleksey Vyazmikin:

しかし、よくわからないのですが、この枠に100個のインジケータを一括で通すことは可能なのでしょうか?

上の例を見てください。そこでは、任意のデータをいくらでも伝送することができる。

 
fxsaber:

上の例を見てください。任意のデータを任意の量で伝送することができます。


多くの質問、聞かせてください。

以下は、コード内の関数です。

// Подготовка данных
void GetData( string &Str, MqlTick &Ticks[], double &Balance )
{
  Str = "Hello World!";
  
  CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 2); // Последние два тика (пример)
  
  Balance = AccountInfoDouble(ACCOUNT_BALANCE);
}

意味は明確で、後で書くためのデータを集めているのです。

なぜ括弧で変数を宣言するのか、変数の前の「&」記号は何を意味するのか、よくわからないのですが?

 
Aleksey Vyazmikin:

聞きたいことがたくさんあるんだけど、聞かせてくれる?

以下は、コード内の関数です。

意味は明確で、後で書くためのデータを集めているのです。

なぜ括弧で変数を宣言するのか、変数の前の「&」記号は何を意味するのか、よくわからないのですが?

これは基本中の基本です。形式的な関数パラメータと参照渡しの パラメータについては、ヘルプを参照してください。
 
Aleksey Vyazmikin:

聞きたいことがたくさんあるんだけど、聞かせてくれる?

以下は、コード内の関数です。

意味は明確で、後で書くためのデータを集めているのです。

なぜ括弧で変数を宣言する必要があるのか、また、変数の前の「&」記号は何を意味するのか、よく理解できません。

ドキュメントより


単純な型のパラメータを参照渡しすることが可能である。この場合、呼び出された関数内でそのようなパラメータを変更すると、参照渡しされた対応する変数に影響します。パラメータが参照渡しであることを指定するためには、データ型の後に修飾子"&"を付ける必要がある。

void func(int& x, double& y, double & z[])
  {
   double calculated_tp;
   ...
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(i==ArraySize(z))       break;
      if(OrderSelect(i)==false) break;
      z[i]=OrderOpenPrice();
     }
   x=i;
   y=calculated_tp;
Документация по MQL5: Основы языка / Переменные / Формальные параметры
Документация по MQL5: Основы языка / Переменные / Формальные параметры
  • www.mql5.com
Основы языка / Переменные / Формальные параметры - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin:
基本中の基本です。形式的な関数パラメータと参照渡しの パラメータについては、ヘルプを参照してください。

多分、基本的なことで、引数はありません。ただ、どこからどこまでがコードで、どこからがコードなのかがわからない......。ということで、質問させていただきました。参考文献(?)ということですが、何に対する文献なのでしょうか?

Str」変数は、もともとここで生まれたのですか?

    while (FrameNext(Pass, Name, ID, Value, Container.Data))
    {
      string Str;
      MqlTick Ticks[];
      double Balance;
      
      // Получили данные от Агента
      Container[0].Get(Str);
      Container[1].Get(Ticks);
      Container[2].Get(Balance);
      
//      FileWrite(handle, Pass);     // Если хочется записать номер прохода
      SaveData(Str, Ticks, Balance); // Данные будут записаны в MQL5\Files-папку Терминала (не Агента)
    }
理由: