Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 775

 
Vladimir Karputov:

Dice: "... Paso 1 ...".

En el paso 2 - ahora piensa por ti mismo, es decir, cómo múltiples hilos SIN CONFLICTO pueden escribir en UN archivo.


Esa es la cuestión, no pueden...

¿Supongo que los agentes de red no pueden trabajar con bibliotecas dll?


¿Hay alguna manera de averiguar el número de pase del probador? Para poder fusionar los archivos...

 
Aleksey Vyazmikin:

¿Cómo se puede enseñar a los agentes a escribir en el mismo archivo? Ahora mismo cada uno crea su propio archivo en su propia carpeta, lo que no es bueno.

Para escribir los datos de los Agentes en el mismo archivo se debe utilizar el modo Marco.

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

Para escribir los datos de los Agentes en un solo archivo, es necesario utilizar el modo Marco.


Gracias. Tendré que investigarlo.

¿Qué es el "modo marco"?

 
Aleksey Vyazmikin:

¿Qué es el "modo marco"?

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

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

Gracias - lo que se entiende por el modo.

Sin embargo, no entiendo, ¿es posible pasar 100 indicadores en un lote en este marco? ¿Por qué en un solo fotograma - ya que cada fotograma se considera como un pase separado, como he entendido de la descripción, o he entendido mal?

¿Y dónde puedo encontrar la descripción del formato de archivo*.mqd?

 
Aleksey Vyazmikin:

Sin embargo, no entiendo, ¿es posible pasar 100 indicadores en este marco en un lote?

Fíjate en el ejemplo anterior. Allí se puede transmitir cualquier cantidad de datos arbitrarios.

 
fxsaber:

Fíjate en el ejemplo anterior. Transmite datos arbitrarios en cualquier cantidad.


Muchas preguntas, déjame preguntarte...

Esta es la función en el código

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

El significado es claro: estamos recogiendo datos para escribirlos después.

No sé muy bien por qué declaramos las variables entre paréntesis y qué significa el signo "&" antes de una variable.

 
Aleksey Vyazmikin:

Muchas preguntas, déjame preguntarte...

Esta es la función en el código

El significado es claro: estamos recogiendo datos para escribirlos después.

No sé muy bien por qué declaramos las variables entre paréntesis y qué significa el signo "&" antes de una variable.

Esto es lo básico. Lea en la ayuda sobre los parámetros formales de las funciones y el paso de parámetros por referencia.
 
Aleksey Vyazmikin:

Muchas preguntas, déjame preguntarte...

Esta es la función en el código

El significado es claro: estamos recogiendo datos para escribirlos después.

No entiendo muy bien por qué hay que declarar las variables entre paréntesis y qué significa el signo "&" antes de la variable.

De la documentación


Es posible pasar parámetros de tipos simples por referencia. En este caso, la modificación de dichos parámetros dentro de una función llamada afectará a las correspondientes variables pasadas por referencia. Para especificar que un parámetro se pasa por referencia, debe colocarse un modificador "&" después del tipo de datos.

Ejemplo:

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:
Es lo básico. Lea en la ayuda sobre los parámetros formales de las funciones y el paso de parámetros por referencia.

Tal vez lo básico, sin argumentos, solo que no puedo entrar en el código, donde empieza, donde termina... de ahí las preguntas. Vale que es una referencia (?), pero ¿a qué?

¿Dónde se originó la variable"Str" aquí?

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