Bibliotecas: SingleTesterCache - página 7

fxsaber #:

Eu registraria o valor máximo. O tempo de criação do próximo registro TesterTradeState provavelmente depende da frequência escolhida pelos desenvolvedores e de algumas outras condições.

Se eu tivesse uma tarefa para criar um arquivo tst muito semelhante ao original, não obteria um TesterTradeState[] idêntico .

Entendi

Após a execução do script SingleTesterCache_Example.ex5, o resultado do Test.tst não é aberto no testador de estratégias ao clicar no botão “Resultados anteriores”.

Anexo o arquivo com o resultado da execução do script e o histórico da conta na qual executei o script.

Atualizei a biblioteca hoje.

Versão do MT5: 6230.

Arquivos anexados:
Files.zip  315 kb
Ivan Titov testador de estratégias ao clicar no botão “Resultados anteriores”.

Não utilizo o método Save desde a criação da biblioteca (em breve fará sete anos). Nesse período, provavelmente, foram feitas alterações por parte da MQ.


É preciso pegar o tst original, analisá-lo e, em seguida, gravá-lo. Depois, verificar onde está a diferença.

Eu, pessoalmente, ainda não estou pronto para lidar com isso. Não utilizo essa funcionalidade.

Ou seja, no que diz respeito a “gravar arquivos tst” , é melhor não usaressa biblioteca. Apenas para “ler”. Entendi certo?
Ivan Titov #:
Ou seja, no que diz respeito a “gravar arquivos tst” , é melhor não usaressa biblioteca. Apenas no que diz respeito a “ler”. Entendi certo?
Se for para gravar com o Tester, será necessário um ajuste explícito. Qual exatamente, é preciso verificar.
fxsaber #:
Se for escrito para ser lido pelo Tester, será necessário um ajuste explícito. Qual exatamente, é preciso verificar.
Substituir esse número
      this.Header.version = ::MathMax(this.Header.version, 502);

por 505.


Se for necessário discutir os resultados de um backtest sem divulgar nomes (por exemplo, um expert advisor do Market), é possível tornar o arquivo tst anônimo e publicá-lo tranquilamente no fórum.

Faça da seguinte maneira.

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

template <typename T>
void ChangeComments( T &Array[], const string NewComment = NULL )
{
  for (uint i = ArraySize(Array); (bool)i--;)
    Array[i].comment = NewComment;
    
  return;
}

void ChangeName( SINGLETESTERCACHE &SingleTesterCache, const string Name = "Deleted", const bool Comments = false )
{
  SingleTesterCache.Header.expert_name = Name;            // nome do especialista
  SingleTesterCache.Header.expert_path = Name;            // nome do especialista com o caminho a partir do MQL5

  if (!Comments)
  {  
    ChangeComments(SingleTesterCache.Deals);
    
    ChangeComments(SingleTesterCache.Orders);
  }
  
  return;
}

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Se foi possível ler o último registro do cache de uma execução única
  {
    SINGLETESTERCACHE SingleTesterCache(Bytes2); // Atribuímos esse valor ao objeto correspondente.

    ChangeName(SingleTesterCache);
    
    SingleTesterCache.Save("ForumBacktest.tst");
  }
}


Primeiro, faça o backtest e, em seguida, execute este script no Terminal. No final, você obterá seu backtest sem dados de identificação. Assim, todas as estatísticas do backtest serão preservadas, e você poderá publicá-las no fórum sem receio.

Aqui, no código-fonte, é possível ver como organizar o funcionamento em simultâneo com qualquer número de caches de passagem única.


Mais especificamente, é assim que as transações são selecionadas.

struct DEAL_SIGN2 : public DEAL_SIGN
{
  bool operator =( const TradeDeal &Deal )
  {
    const bool Res = (Deal.action <= DEAL_TYPE_SELL);

    if (Res)
    {
      const double ContactSize = Deal.contract_size ? Deal.contract_size * 1000 : 1e8;

      this.Volume = (1.0 - (Deal.action << 1)) * Deal.volume / ContactSize;
      this.Time = Deal.time_create;
    }

    return(Res);
  }
};

int GetDeals( const string FileName, DEAL_SIGN &Deals[] )
{
  const SINGLETESTERCACHE SingleTesterCache(FileName);

  int Amount = 0;
  DEAL_SIGN2 Deal;

  for (int i = 0, const Size = ArrayResize(Deals, ArraySize(SingleTesterCache.Deals)); i < Size; i++)
    if (Deal = SingleTesterCache.Deals[i])
      Deals[Amount++] = Deal;

  return(ArrayResize(Deals, Amount));
}
Коэффициент НЕкорреляции.
Коэффициент НЕкорреляции.
  • www.mql5.com
При составлении портфеля ТС стараются опираться на статистику. Например, пробуют составлять таблицу корреляции на основе вычислений соответствующих коэффициента (КК). Основная причина такого подхода -