Bibliotecas: MultiTester - página 56

 

Às vezes, é necessário visualizar uma parte do histórico de preços na forma de uma tabela. Isso pode ser feito por meio de CTRL+U, selecionando a guia Bars/Ticks. Inserir o intervalo necessário manualmente. Isso é tedioso.


Por isso, criei uma funcionalidade adicional, que é demonstrada pelo Expert Advisor a seguir.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/pt/code/26132
#include <fxsaber\Keyboard\Keyboard.mqh> // https://www.mql5.com/pt/code/48393

input bool inTicks = true; // true - Ticks, false - Bars
input int inBefore = -60; // Antes em segundos
input int inAfter = 60;   // Após em segundos
input ENUM_TIMEFRAMES inPeriod = PERIOD_CURRENT; // Período (modo Barras)

datetime GetTime( const int X )
{
  int Window;
  datetime Res;
  double Price;
    
  return(ChartXYToTimePrice(0, X, 0, Window, Res, Price) ? Res : 0);
}

void OnChartEvent( const int32_t id, const long &lparam, const double&, const string& )
{
  if ((id == CHARTEVENT_CLICK) && KEYBOARD::IsControl())
  {
    const datetime Time = GetTime((int)lparam);

    if (Time)
    {
      if (inTicks)
        MTTESTER::CopyTicks(_Symbol, Time + inBefore, Time + inAfter);
      else
        MTTESTER::CopyRates(_Symbol, inPeriod, Time + inBefore, Time + inAfter);      
    }    
  }
}


Você clica (com a tecla CTRL pressionada) no local necessário do gráfico e obtém automaticamente os dados tabulares correspondentes de uma só vez.

As funções selecionadas simplesmente preenchem determinados campos de dados e os consultam. Em seguida, por meio da GUI, você vê o que estava interessado. Automação, em geral.

 
Talvez a ideia de escrever uma ferramenta de EA que combine vários recursos úteis seja uma boa ideia.
 

5430 As janelas ainda piscam ao preparar uma tarefa.

Como corrigir isso?

 
Aleksei Skrypnev #:

5430 O Windows ainda pisca ao preparar uma tarefa.

Como corrigir isso?

Da seguinte maneira.
Попробуйте загрузить все файлы в архиве.
Попробуйте загрузить все файлы в архиве.
  • 2025.12.22
  • www.mql5.com
если бы время файлов в архиве совпадало со временем модификации в кодобазе. Не соответствует времени изменения конкретного файла. Я вижу корректную структуру после разархивирования а ведь сам редактор позволяет загрузить все эти файлы именно так
 
fxsaber #:
Assim.

É um ótimo tema. Mas eu fiz o download antes de tudo separadamente e ainda pisca.

Vi que no arquivo MultiTester_Example.mq5

adicionei linhas ao arquivo MultiTester_Example.mq5.

#define  FAKE // Remover - bypass para colocar o código na KB.

#ifdef  FAKE
  void OnStart() {}
#else // #ifdef FAKE
#endif // #ifdef FAKE #else

Eu comentei isso ou devo fazer diferente? Ou posso excluir todas essas 4 linhas?

//#define FAKE // Remove - bypass para colocar o código na KB.

#ifdef FAKE// void OnStart() {}

#else // #ifdef FAKE

#endif // #ifdef FAKE #else


P.S. Vi que, quando peguei a lista antiga de tarefas sem essas linhas, ela ficou piscando. Com as novas linhas, ela não pisca.

Mas será que comentei corretamente apenas uma linha?

 
Aleksei Skrypnev #:

É um ótimo tema. Mas eu baixei antes que tudo separadamente ainda pisque.

Eu vi isso no arquivo MultiTester_Example.mq5

foram adicionadas as linhas

Eu comentei dessa forma ou devo fazer diferente? Ou posso excluir todas essas 4 linhas em geral?


P.S. Vi que peguei a lista de tarefas antiga sem essas linhas e ela estava piscando. Com as novas linhas, ela não está piscando.

Mas será que eu comentei apenas uma linha corretamente?

Seu entendimento está correto: remova os comentários ou exclua essas 4 linhas completamente.
 
Bom dia, caro fxsaber! Por favor, ajude-me a resolver um problema. Meu script tem uma função de arquivo, que desenvolvi com a ajuda da excelente biblioteca MTTESTER. Ele grava o Settin na pasta Tester na seguinte linha: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) // Sobrescreve o Settin da sandbox Files na pasta Tester. Obtemos um conjunto com o nome: "After archiving". Mas ele não é adequado para retrabalho posterior, aparentemente por causa da codificação. No entanto, se você gravá-lo manualmente no robô no testador de estratégias e salvá-lo com o nome "After manual writing to the robot and saving", esse conjunto já é adequado. E não se trata apenas de alterar o cabeçalho, mas de algo mais. Pedi ajuda aos ironmen (Qwen, Deep Seek) e eles geraram um script "ReloadSetsFromCommonFixed". Ele tem muitos recursos excelentes e funciona, exceto por esta linha: if(!FileCopy(source_path, FILE_COMMON, dest_path, FILE_COMMON)) O conjunto é copiado, mas na impressão de verificação a saída é abracadabra, aparentemente devido à codificação. O Iron ofereceu quatro soluções, mas nenhuma delas funcionou (o texto tem todas elas). Minha última esperança são as de couro. Existe alguma maneira de alterar esta linha na função de arquivamento: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) para simular também a gravação manual no robô com o salvamento subsequente no formato necessário "After manual writing to the robot and saving"? Atenciosamente, Alexander
 
klycko #:
Existe alguma maneira de alterar essa linha na função de arquivamento?

Procurei aqui (na janela aberta, pressione ENTER na barra de endereços) o registro definido. Provavelmente, esses sinalizadores são necessários.

FileOpen(FileName, FILE_WRITE | FILE_UNICODE | FILE_TXT);
 

Esses sinalizadores ajudaram muito e o problema de arquivamento foi resolvido. Agora o resultado está no formato correto.

Muito obrigado!

Mas no meu script Nocturne o comando não funciona corretamente :

prWrite0 = MTTESTER::SetSettings2(Settings); // Grava as configurações no robô

Embora prWrite0 = true após sua execução.

Provavelmente é novamente uma questão de sinalizadores ao ler o conjunto de configurações da pasta.

Isso é feito pela função GetKthFileContent, que tem a linha:

int handle = FileOpen(full_path, FILE_READ | FILE_WRITE | FILE_UNICODE | FILE_TXT | FILE_COMMON);

As variantes da linha abaixo também não funcionam:

// int handle = FileOpen(full_path, FILE_READ | FILE_TXT | FILE_COMMON); // Fonte variant line

// int handle = FileOpen(full_path, FILE_READ | FILE_UNICODE | FILE_TXT | FILE_COMMON);

Próximo comando:

prRead0 = MTTESTER::GetSettings(Control); // Lê as configurações do robô que acabaram de ser instaladas

funciona corretamente e prRead0 = true após sua execução.

Mas na rede de controle prMFI=true, pois foi originalmente carregado manualmente no robô. Isso significa que a gravação no robô não aconteceu de fato, embora o sinal de gravação prWrite0 = true.

Na rede original, prHEX=true

Na rede original do robô, prMFI=true

O comando MTTESTER::SetSettings2(Settings) funciona, mas essas configurações não aparecem no robô.

Qual é o problema aqui?

Atenciosamente, Alexander

 
klycko #:

Então, qual é o problema aqui?

Não me preocupei em estudar os sinalizadores e decidi escrever um código funcional para salvar e carregar os arquivos de configuração do testador.

// Carregar/salvar o arquivo de configuração do testador.
#property script_show_inputs

input bool inLoad = true; // Configurações Carregar/Salvar - verdadeiro/falso

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/pt/code/26132

void OnStart()
{
  const string FileName = __FILE__ + ".set";
  
  string Settings;
  ushort Words[];  
      
  if (inLoad) // Carregar configurações.
  {
    Print("Load: " + (string)FileLoad(FileName, Words));
    Settings = ShortArrayToString(Words, 1); // 1 - Unicode
    
    Print(MTTESTER::SetSettings(Settings));
  
  }
  else if (MTTESTER::GetSettings(Settings)) // Salvar configurações.
  {
    Words[ArrayResize(Words, 1) - 1] = 0xFEFF; // 1 - Unicode
    
    StringToShortArray(Settings, Words, ArraySize(Words));    
    Print("Save: " + (FileSave(FileName, Words) ? (string)ArraySize(Words) : "error"));
  }
}


Você pode salvar(inLoad = false) um arquivo de conjunto por meio do script, depois alterar algonele manualmente e carregá-lo(inLoad = true) no testador por meio do script.

Se funcionar, pegue as partes correspondentes do código-fonte para você.