mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 141

 

얘들 아, 매우 필요한 것 :

 #define abort(ANY) do { printf ( "abort, file=%s,  line=%i" , __FILE__ , __LINE__ ); Alert ( 1 /( uint ) MathAbs ( 0 ));} while ( false )

치명적인 오류가 발생한 경우 실행을 중단하고 소멸자가 호출되지 않습니다(죄송하지만 최소한 그런 방식으로). 글쎄, 표준 아날로그 및 예외가없는 경우 최소한 몇 가지 대안.

로그 메시지:

2019.08.19 21:28:14.364 lrp_last_7(m_GBPCHF,M1) 중단, 파일=lrp_last_7.mq5, 줄=299
2019.08.19 21:28:14.364 lrp_last_7 (m_GBPCHF,M1) 'lrp_last_7.mq5' (299,2)에서 영분할
 
fxsaber :

MT5 테스터의 특징이지만, 주제와 간접적인 관련이 있기 때문에 이 스레드에 공개하기로 결정했습니다.

보이지 않는 최적화 탭으로 이동하려면 최적화된 매개변수가 없는 상태에서 전체 검색을 선택해야 합니다.


ATP, 이 결과를 얻는 방법에 대해 모두 의아해함))

 

함수 포인터의 템플릿이 반환 매개변수 오버로딩 측면에서 작동하지 않습니까?

 template < typename Out >
typedef Out (*Func0)( void );

int Select( void )
{
   return 10 ;
}

void OnStart ()
{
   Func0< int > f = Select;
}

:

 '<' - unexpected token  TestObj.mq5     24        9
'>' - name expected     TestObj.mq5     24        13

그렇다면:

 void OnStart ()
{
   Func0 f = Select;
}

우리는 이것을 가지고 있습니다:

'Select' - cannot resolve function address      TestObj.mq5     15      14
'Select' - type mismatch        TestObj.mq5     15      14
 
Vasiliy Sokolov :

함수 포인터의 템플릿이 반환 매개변수 오버로딩 측면에서 작동하지 않습니까?

C++에서 작동합니까? 이와 같은 질문에 대한 전용 스레드 가 있습니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

도서관: 전문가

fxsaber , 2019.09.12 06:17

MT4와 달리 MT5는 실행되거나 변경될 때 Expert Advisors의 입력 매개변수를 기록하지 않습니다. 따라서 로그에서 터미널에서 시작된 것이 무엇인지 확인하는 것은 불가능합니다.

유사한 기능이 이 상황을 수정할 수 있습니다.

 #include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

// Выводит данные запущенного советника
string EAToString( const long Chart_ID = 0 )
{
   string Names[];
   MqlParam Params[];
  
   const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
   const int Size = ArraySize (Names);
  
   string Str = "Expert " + Params[ 0 ].string_value + ", expertmode = " + ( string )Flag;
  
   for ( int i = 0 ; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1 ].string_value;
    
   return (Str);    
}


애플리케이션

 input int inInput1 = 1 ;
input int inInput2 = 2 ;

int OnInit ()
{
   Print (EAToString());
  
   return ( INIT_FAILED );
}


결과

Test8 (EURUSD,M1)       Expert Experts\Test8.ex5, expertmode = 4
Test8 (EURUSD,M1)       inInput1 = 1
Test8 (EURUSD,M1)       inInput2 = 2


ZY 불행히도 for 스크립트는 작동하지 않습니다. MT4 자체는 스크립트 입력 매개변수를 출력하지만 MT5는 출력하지 않습니다.

 
이 주제와 관련이 없는 댓글은 " MQL4 및 MQL5에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 "으로 이동되었습니다.
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MetaTrader 5 전략 테스터: 오류, 버그, 개선 제안

fxsaber , 2019.09.18 22:32

최신 MT5 테스터 설정 가져오기.

 #include <WinAPI\fileapi.mqh>
#include <WinAPI\handleapi.mqh>

// Получает имя файла настроек последнего запуска MT5-Тестера.
string GetTesterINIFileName( ulong &Size )
{
   string Str = NULL ;
   const string Path = :: TerminalInfoString ( TERMINAL_PATH )+ "\\MQL5\\Profiles\\Tester\\" ;
  
  FIND_DATAW FindData;
   const HANDLE handle = kernel32::FindFirstFileW(Path + "*.ini" , FindData);
  
   if (handle != INVALID_HANDLE )
  {     
     ulong MaxTime = 0 ;
    Size = 0 ;
    
     do
    {
       const ulong TempTime = (( ulong )FindData.ftLastWriteTime.dwHighDateTime << 32 ) + FindData.ftLastWriteTime.dwLowDateTime;
      
       if (TempTime > MaxTime)
      {
        MaxTime = TempTime;
        
        Str = :: ShortArrayToString (FindData.cFileName);
        Size = (( ulong )FindData.nFileSizeHigh << 32 ) + FindData.nFileSizeLow;;
      }      
    }
     while (kernel32::FindNextFileW(handle, FindData));    
    
    kernel32::FindClose(handle);
  }
  
   return ((Str == NULL ) ? NULL : Path + Str);   
}

#define GENERIC_READ   0x80000000
#define SHARE_READ     1
#define OPEN_EXISTING 3

// Получает настройки последнего запуска MT5-Тестера.
string GetTesterINI( void )
{
   string Str = NULL ;
  
   ulong Size;
   const string FileName = GetTesterINIFileName(Size);
  
   if (FileName != NULL )
  {
     const HANDLE handle = kernel32::CreateFileW(FileName, GENERIC_READ, SHARE_READ, 0 , OPEN_EXISTING, 0 , 0 );
    
     if (handle != INVALID_HANDLE )
    {
       uint Read;
       ushort Buffer[];
      
      :: ArrayResize (Buffer, ( int )Size / sizeof ( ushort ));
            
       if (kernel32::ReadFile(handle, Buffer, ( int )Size, Read, 0 ))      
        Str = :: ShortArrayToString (Buffer);
      
      kernel32::CloseHandle(handle);        
    }
  }
  
   return (Str);
}


애플리케이션

 // Советник при запуске одиночного прогона возвращает свои настройки.
input int inInput1 = 1 ;
input int inInput2 = 2 ;

int OnInit ()
{
   if ( MQLInfoInteger ( MQL_TESTER ) && ! MQLInfoInteger ( MQL_OPTIMIZATION ))
     Print (GetTesterINI());
  
   return ( INIT_FAILED );
}


결과

 2019.04 . 01 00 : 00 : 00    ;Одиночный тест советника: Test9, EURUSD M1, цены открытия, 2019.04 . 01 - 2019.09 . 18
2019.04 . 01 00 : 00 : 00    [Tester]
2019.04 . 01 00 : 00 : 00    Expert=Test9.ex5
2019.04 . 01 00 : 00 : 00    Symbol =EURUSD
2019.04 . 01 00 : 00 : 00    Period =M1
2019.04 . 01 00 : 00 : 00    Optimization= 0
2019.04 . 01 00 : 00 : 00    Model= 2
2019.04 . 01 00 : 00 : 00    FromDate= 2019.04 . 01
2019.04 . 01 00 : 00 : 00    ToDate= 2019.09 . 18
2019.04 . 01 00 : 00 : 00    ForwardMode= 0
2019.04 . 01 00 : 00 : 00    Deposit= 10000
2019.04 . 01 00 : 00 : 00    Currency=EUR
2019.04 . 01 00 : 00 : 00    ProfitInPips= 1
2019.04 . 01 00 : 00 : 00    Leverage= 100
2019.04 . 01 00 : 00 : 00    ExecutionMode= 0
2019.04 . 01 00 : 00 : 00    OptimizationCriterion= 6
2019.04 . 01 00 : 00 : 00    Visual= 0
2019.04 . 01 00 : 00 : 00    [TesterInputs]
2019.04 . 01 00 : 00 : 00    inInput1= 123 || 1 || 1 || 10 ||N
2019.04 . 01 00 : 00 : 00    inInput2= 2 || 2 || 1 || 20 ||N

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

스크립트: 균형 그래프 HTML

fxsaber , 2019.09.19 09:56

텍스트 파일을 MQH로 변환하는 변환기.

 void ChangeString( string &Str )
{
   StringReplace (Str, "\\", "\\\\");
   StringReplace (Str, "\"", "\\\"");
  
  Str = "\"" + Str + "\\r\\n\" + " + "\n";
  
   return ;
}

bool TextFileToMQH( const string FileNameIn, const string FileNameOut )
{
   const int handleIn = FileOpen (FileNameIn, FILE_READ | FILE_TXT | FILE_ANSI );
   bool Res = (handleIn != INVALID_HANDLE );

   if (Res)  
  {
     const int handleOut = FileOpen (FileNameOut, FILE_WRITE | FILE_TXT | FILE_ANSI );
    
     if (Res = (handleOut != INVALID_HANDLE ))
    {
       FileWriteString (handleOut, " string StrMQH = \n");
      
       while (! FileIsEnding (handleIn))
      {
         string Str = FileReadString (handleIn);
  
        ChangeString(Str);
         FileWriteString (handleOut, Str);
      }

       FileWriteString (handleOut, " NULL ;\n");
  
       FileClose (handleOut);            
    }
    
     FileClose (handleIn);
  }
  
   return (Res);
}

void OnStart ()
{
  TextFileToMQH("Graph.txt", "Graph.mqh");
}


소스에 텍스트 데이터를 삽입할 수 있습니다.

 #include <..\Files\Graph.mqh>
 
리소스 저장 기능
 const string ResourceNameFull = ObjectGetString ( 0 , Name, OBJPROP_BMPFILE );
ResourceSave (ResourceNameFull, "test.bmp" ); // false

const string ResourceNameShort = StringSubstr (ResourceNameFull, StringFind (ResourceNameFull, "::" ));
ResourceSave (ResourceNameShort, "test.bmp" ); // true
 
ResourceSave 는 테스터에서 작동하지 않습니다. 아래 대안.
 // Сохраняет ресурс в BMP-формате.
bool ResourceSaveBMP( const string ResourceName, const string FileName )
{
   struct BMPFILEHEADER
  {
     short Type;
     uint    Size;
     short Reserved1;
     short Reserved2;
     uint    OffBits;
  };
  
   struct BMPINFOHEADER
  {    
     uint    Size;
     uint    Width;
     uint    Height;
     short Planes;
     short BitCount;
     int    Compression;
     uint    SizeImage;
     int    XPelsPerMeter;
     int    YPelsPerMeter;
     int    ClrUsed;
     int    ClrImportant;
    
     void Set( void )
    {
       this .Size = sizeof ( this );
       this .Planes = 1 ;
       this .BitCount = 32 ;
       this .SizeImage = this .Width * this .Height * ( this .BitCount >> 3 );
      
       return ;      
    }
  };
  
   struct BMPHEADER
  {
    BMPFILEHEADER File;
    BMPINFOHEADER Info;
    
     void Set( void )
    {
       this .Info.Set();

       this .File.Type = 19778 ;
       this .File.OffBits = sizeof ( this );
       this .File.Size = this .Info.SizeImage + this .File.OffBits;
      
       return ;
    }
  } BMPHeader = { 0 };
  
   uint Data[];  
   bool Res = ResourceReadImage (ResourceName, Data, BMPHeader.Info.Width, BMPHeader.Info.Height);
  
   if (Res)
  {
     const int handle = FileOpen (FileName, FILE_WRITE | FILE_BIN );
    
     if (Res = (handle != INVALID_HANDLE ))
    {      
      BMPHeader.Set();

       uint Picture[];
      
       const uint Size = ArrayResize (Picture, ArraySize (Data));
      
      for ( uint i = 0 ; i < Size; i += BMPHeader.Info.Width)
         ArrayCopy (Picture, Data, i, Size - i - BMPHeader.Info.Width, BMPHeader.Info.Width);
              
       FileWriteStruct (handle, BMPHeader);
       FileWriteArray (handle, Picture);
      
       FileClose (handle);
    }
  }
  
   return (Res);
}


애플리케이션

   ResourceSave (ResourceName, "test.bmp" );  
   ResourceSaveBMP(ResourceName, "test2.bmp" );