Questions des débutants MQL5 MT5 MetaTrader 5 - page 775

 
Vladimir Karputov:

Il est écrit : "... Étape 1 ...".

À l'étape 2, réfléchissez maintenant par vous-même, à savoir comment plusieurs threads SANS CONFLIT peuvent écrire dans UN fichier.


C'est ça le truc, ils ne peuvent pas...

J'en déduis que les agents de réseau ne peuvent pas travailler avec les bibliothèques dll ?


Existe-t-il un moyen de connaître le numéro de passe du testeur ? Pour pouvoir coller les dossiers ensemble...

 
Aleksey Vyazmikin:

Comment apprendre aux agents à écrire dans le même fichier ? Actuellement, chacun crée son propre fichier dans son propre dossier, ce qui n'est pas bon.

Pour écrire les données des agents dans le même fichier, vous devez utiliser le mode Frame.

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

Vous devez utiliser le mode Cadre pour écrire les données des agents dans un seul fichier.


Merci ! Je vais devoir y réfléchir.

Qu'est-ce que le "mode cadre" ?

 
Aleksey Vyazmikin:

Qu'est-ce que le "Frame Mode" ?

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

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

Merci - quel est le mode compris.

Cependant, je ne comprends pas, est-il possible de passer 100 indicateurs en un lot dans ce cadre ? Pourquoi dans un seul cadre - puisque chaque cadre est considéré comme un passage séparé, comme j'ai compris de la description, ou j'ai mal compris ?

Et où puis-je trouver la description du format de fichier*.mqd?

 
Aleksey Vyazmikin:

Cependant, je ne comprends pas, est-il possible de passer 100 indicateurs dans ce cadre en un lot ?

Regardez l'exemple ci-dessus. N'importe quelle quantité de données arbitraires peut y être transmise.

 
fxsaber:

Regardez l'exemple ci-dessus. Il transmet des données arbitraires en n'importe quelle quantité.


Beaucoup de questions, laissez-moi vous demander...

Voici la fonction dans le code

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

Le sens est clair : nous recueillons des données qui seront écrites plus tard.

Je ne sais pas vraiment pourquoi nous déclarons les variables entre parenthèses et ce que signifie le signe "&" devant une variable ?

 
Aleksey Vyazmikin:

Beaucoup de questions, laissez-moi vous demander...

Voici la fonction dans le code

Le sens est clair : nous recueillons des données qui seront écrites plus tard.

Je ne sais pas vraiment pourquoi nous déclarons les variables entre parenthèses et ce que signifie le signe "&" devant une variable ?

C'est l'essentiel. Lisez l'aide sur les paramètres des fonctions formelles et le passage des paramètres par référence.
 
Aleksey Vyazmikin:

Beaucoup de questions, laissez-moi vous demander...

Voici la fonction dans le code

Le sens est clair : nous recueillons des données qui seront écrites plus tard.

Je ne comprends pas bien pourquoi nous devons déclarer les variables entre parenthèses et ce que signifie le signe "&" devant la variable ?

Extrait de la documentation


Il est possible de passer des paramètres de types simples par référence. Dans ce cas, la modification de ces paramètres dans une fonction appelée affectera les variables correspondantes passées par référence. Pour spécifier qu'un paramètre est transmis par référence, il faut placer un modificateur "&" après le type de données.

Exemple :

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:
C'est l'essentiel. Lisez l'aide sur les paramètres formels des fonctions et le passage des paramètres par référence.

Peut-être les bases, pas d'arguments, mais je n'arrive pas à entrer dans le code, où ça commence, où ça finit... d'où les questions. Ok c'est une référence( ?), mais à quoi ?

D'où vient la variable"Str" à l'origine ?

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