MetaTrader 5 Strategy Tester: bugs, bugs, sugestões para melhorias - página 7

 
fxsaber:

Uma única passagem precisa de conhecer os seus parâmetros de entrada. É improvável que tal funcionalidade seja introduzida, por isso alguma reflexão sobre como isto poderia ser feito? WinAPI estaria bem.

Obtenha as últimas definições do MT5 Tester.

#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);
}


Candidatura

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

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


Resultado

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
 

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Nova versão da plataforma MetaTrader 5 build 1640: criação e teste dos seus próprios instrumentos financeiros

fxsaber, 2017.08.04 19:55

Durante a Optimização, é possível fazer algum tipo de protecção (pelo menos sob a forma de um aviso com um sinal sonoro) contra levar o computador a dormir?

Esqueci-me completamente que a Optimização estava em curso, e fechei a tampa do portátil. A ligação foi quebrada, depois de acordada foi restaurada e a optimização prosseguiu. Mas eu não fecharia a tampa se me lembrassem que a Optimização estava em curso. O que dizer quando se usa a Nuvem...

Também, durante a Optimização, a única indicação de que a Optimização está em curso no Terminal quando o Testador está escondido é uma barra verde no ícone (como quando se descarregam ficheiros num navegador). Não há qualquer aviso ao fechar o Terminal de que a Optimização está em curso.

 

Problema de repetição com os parâmetros de entrada de bool a serem exibidos no Testador.

Este Conselheiro Especialista

input int i = 0;
input bool b = false;

double OnTester() { return(i); }


Optimizá-lo conforme mostrado na imagem do ecrã.


Optamos por executar um dos passes.


Nos Parâmetros vemos zero em vez de falso.


 

Não tenho a certeza de como reproduzir. Por vezes, ao executar uma única execução a partir dos resultados da Optimização, o registo mostra (e substitui) os valores dos parâmetros de entrada correctamente (como na cache, incluindo entradas não optimizadas). Mas ao mesmo tempo, no separador Parâmetros, alguns parâmetros de entrada não são actualizados.


Acontece que se corre Single from Optimize - fine (corresponde ao resultado Optimize).

Depois entrar no modo Single e executar a mesma execução através do botão Start - obtém valores diferentes (porque alguns inputs têm valores diferentes dos do passo anterior).

 

Já foi dito sobre o tamanho selvagem dos troncos. Quando se olha para o diário de bordo, 99% do tempo está interessado no início e no fim do diário de bordo. Assim, devido ao tamanho selvagem, o início não pode ser visto de forma alguma.

Que tal duplicar o início e o fim do registo? Em particular, para ver em que parâmetros de entrada foi o início.

 
Chegou a uma situação em que era impossível ver os resultados de optimizações anteriores. A única coisa que ajudou foi uma reinicialização.
 

Estas são as mensagens que o testador agora transmite.

 
fxsaber:

Esta é a mensagem que o testador está agora a transmitir.

O provador já deu estas mensagens antes. Uma vez que agora é possível descarregar ficheiros opt-files. Isto é um aviso de que se aoptimização for executada, este ficheiro de opção será sobreescrito e a optimização recomeçará

 
Slava:

em caso de optimização, este ficheiro de opção será sobregravado

O nome vai coincidir?

Razão: