초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 775

 
Vladimir Karputov :

"... 1 단계 ..."라고 쓰여 있습니다.

위의 2단계 - 이제 스스로 생각해 보십시오. 즉, 충돌이 없는 여러 스레드가 어떻게 하나의 파일에 쓸 수 있는지 생각해 보십시오.


예, 문제의 사실은 그들이 할 수 없다는 것입니다 ...

네트워크 에이전트가 dll과 함께 작동할 수 없다는 것을 알고 있습니까?


테스터의 합격번호는 어떻게 알 수 있나요? 그러면 파일을 붙일 것은 무엇입니까 ...

 
Aleksey Vyazmikin :

에이전트가 하나의 파일에 쓰도록 가르치는 방법은 무엇입니까? 이제 모든 사람이 자신의 폴더에 자신의 파일을 생성합니다. 이는 좋지 않습니다.

에이전트 데이터를 하나의 파일에 쓰려면 프레임 모드를 사용해야 합니다.

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