Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 775

 
Vladimir Karputov:

Dice: "... Passo 1 ...".

Sul passo 2 - ora pensate voi stessi, cioè, come più threads SENZA CONFLITTO possono scrivere su UN file.


Questo è il punto, non possono...

Immagino che gli agenti di rete non possano lavorare con le librerie dll?


C'è un modo per scoprire il numero di passaggio del tester? Per poter incollare i file insieme...

 
Aleksey Vyazmikin:

Come si può insegnare agli agenti a scrivere sullo stesso file? In questo momento ognuno crea il proprio file nella propria cartella, il che non va bene.

Per scrivere i dati degli agenti nello stesso file è necessario utilizzare la modalità 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:

È necessario utilizzare la modalità Frame per scrivere i dati degli agenti in un unico file.


Grazie! Dovrò dare un'occhiata.

Che cos'è la "modalità frame"?

 
Aleksey Vyazmikin:

Cos'è il 'Frame Mode'?

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

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

Grazie - qual è la modalità intesa.

Tuttavia, non capisco, è possibile passare 100 indicatori in un batch in questo quadro? Perché in un solo fotogramma - dato che ogni fotogramma è considerato come un passaggio separato, come ho capito dalla descrizione, o ho capito male?

E dove posso trovare la descrizione del formato di file*.mqd?

 
Aleksey Vyazmikin:

Tuttavia, non capisco, è possibile passare 100 indicatori in questo quadro in un batch?

Guardate l'esempio qui sopra. Qualsiasi quantità di dati arbitrari può essere trasmessa lì.

 
fxsaber:

Guardate l'esempio qui sopra. Trasmette dati arbitrari in qualsiasi quantità.


Molte domande, mi permetta di farle.

Ecco la funzione nel codice

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

Il significato è chiaro - stiamo raccogliendo dati da scrivere in seguito.

Non ho capito bene perché stiamo dichiarando le variabili tra parentesi e cosa significa il segno "&" prima di una variabile?

 
Aleksey Vyazmikin:

Un sacco di domande, lascia che ti chieda?

Ecco la funzione nel codice

Il significato è chiaro - stiamo raccogliendo dati da scrivere in seguito.

Non ho capito bene perché stiamo dichiarando le variabili tra parentesi e cosa significa il segno "&" prima di una variabile?

Queste sono le basi. Leggete nella guida i parametri formali delle funzioni e il passaggio di parametri per riferimento.
 
Aleksey Vyazmikin:

Un sacco di domande, lascia che ti chieda?

Ecco la funzione nel codice

Il significato è chiaro - stiamo raccogliendo dati da scrivere in seguito.

Non capisco bene perché dobbiamo dichiarare le variabili tra parentesi e cosa significa il segno "&" prima della variabile?

Dalla documentazione


È possibile passare parametri di tipi semplici per riferimento. In questo caso, la modifica di tali parametri all'interno di una funzione chiamata influenzerà le variabili corrispondenti passate per riferimento. Per specificare che un parametro è passato per riferimento, un modificatore "&" deve essere messo dopo il tipo di dati.

Esempio:

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:
Sono le basi. Leggete nell'aiuto i parametri formali delle funzioni e il passaggio di parametri per riferimento.

Forse le basi, nessuna discussione, solo che non riesco a entrare nel codice, dove inizia, dove finisce... Da qui le domande. Ok è un riferimento(?), ma a cosa?

Da dove ha avuto origine la variabile"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-папку Терминала (не Агента)
    }
Motivazione: