Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 775

 
Vladimir Karputov:

Dort heißt es: "... Schritt 1 ...".

Zu Schritt 2 - überlegen Sie nun selbst, wie mehrere Threads OHNE KONFLIKT in EINE Datei schreiben können.


Das ist die Sache, sie können nicht...

Ich nehme an, dass Netzwerkagenten nicht mit DLL-Bibliotheken arbeiten können?


Gibt es eine Möglichkeit, die Prüfnummer des Prüfers herauszufinden? Um die Dateien zusammenkleben zu können...

 
Aleksey Vyazmikin:

Wie kann den Agenten beigebracht werden, in dieselbe Datei zu schreiben? Zurzeit erstellt jeder seine eigene Datei in seinem eigenen Ordner, was nicht gut ist.

Um die Daten der Agenten in dieselbe Datei zu schreiben, müssen Sie den Frame-Modus verwenden.

// Пример записи данных Агентов (включая Облачные) в один файл
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:

Sie müssen den Frame-Modus verwenden, um die Daten der Agenten in eine einzige Datei zu schreiben.


Ich danke Ihnen! Ich werde mich damit befassen müssen.

Was ist der "Frame-Modus"?

 
Aleksey Vyazmikin:

Was ist der "Frame-Modus"?

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

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

Danke - wie ist der Modus zu verstehen.

Ich verstehe jedoch nicht, ob es möglich ist, 100 Indikatoren in einem Stapel in diesem Rahmen zu übergeben? Warum in einem Bild - da jedes Bild als ein separater Durchgang betrachtet wird, wie ich es in der Beschreibung verstanden habe, oder habe ich es falsch verstanden?

Und wo kann ich die Beschreibung des*.mqd-Dateiformats finden?

 
Aleksey Vyazmikin:

Allerdings verstehe ich nicht, ist es möglich, 100 Indikatoren in diesem Rahmen in einem Stapel zu übergeben?

Sehen Sie sich das obige Beispiel an. Dort können beliebige Datenmengen übertragen werden.

 
fxsaber:

Sehen Sie sich das obige Beispiel an. Es überträgt beliebige Daten in beliebiger Menge.


Viele Fragen, darf ich sie stellen?

Hier ist die Funktion im Code

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

Die Bedeutung ist klar - wir sammeln Daten, die später geschrieben werden sollen.

Ich bin mir nicht ganz sicher, warum wir Variablen in Klammern deklarieren und was das "&"-Zeichen vor einer Variablen bedeutet?

 
Aleksey Vyazmikin:

Ich habe eine Menge Fragen, darf ich sie Ihnen stellen?

Hier ist die Funktion im Code

Die Bedeutung ist klar - wir sammeln Daten, die später geschrieben werden sollen.

Ich bin mir nicht ganz sicher, warum wir Variablen in Klammern deklarieren und was das "&"-Zeichen vor einer Variablen bedeutet?

Das sind die Grundlagen. Lesen Sie in der Hilfe über formale Funktionsparameter und die Übergabe von Parametern per Referenz.
 
Aleksey Vyazmikin:

Ich habe eine Menge Fragen, darf ich sie Ihnen stellen?

Hier ist die Funktion im Code

Die Bedeutung ist klar - wir sammeln Daten, die später geschrieben werden sollen.

Ich verstehe nicht ganz, warum wir Variablen in Klammern deklarieren müssen und was das "&"-Zeichen vor der Variable bedeutet?

Aus der Dokumentation


Es ist möglich, Parameter einfacher Typen per Referenz zu übergeben. In diesem Fall wirkt sich die Änderung solcher Parameter innerhalb einer aufgerufenen Funktion auf die entsprechenden Variablen aus, die als Referenz übergeben werden. Um anzugeben, dass ein Parameter als Referenz übergeben wird, muss ein Modifikator "&" hinter dem Datentyp stehen.

Beispiel:

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:
Das sind die Grundlagen. Lesen Sie in der Hilfe über formale Funktionsparameter und die Übergabe von Parametern per Referenz.

Vielleicht die Grundlagen, keine Argumente, ich komme nur nicht in den Code hinein, wo er beginnt, wo er endet... Daher die Fragen. Ok, es ist ein Verweis(?), aber auf was?

Woher stammt die Variable"Str" ursprünglich?

    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-папку Терминала (не Агента)
    }
Grund der Beschwerde: