初学者的问题 MQL5 MT5 MetaTrader 5 - 页 775

 
Vladimir Karputov:

它说:"...步骤1..."。

关于第2步--现在自己想一想,即多个没有冲突的线程如何能写到一个文件。


嗯,这只是它,他们不能...

我认为,网络代理不能与dll库一起工作?


有什么办法可以查出测试员的合格证号吗?为了能够将文件粘在一起...

 
Aleksey Vyazmikin:

如何教代理写到同一个文件?现在,每个人都在自己的文件夹中创建自己的文件,这并不理想。

要将Agent的数据写入同一个文件,你必须使用框架模式。

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

你需要使用框架模式将代理数据写入一个文件。


谢谢你!我必须要研究一下。

什么是 "框架模式"?

 
Aleksey Vyazmikin:

什么是 "框架模式"?

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

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

谢谢你------什么是模式的理解。

然而,我不明白,在这个框架下,是否有可能在一个批次中通过100个指标?为什么是一帧--因为每一帧都被认为是一个独立的通道,正如我从描述中理解的那样,还是我理解错了?

我在哪里可以找到*.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-папку Терминала (не Агента)
    }
原因: