Bibliotecas: SingleTesterCache

 

SingleTesterCache:

Dados de passagem única do testador.

SingleTesterCache

Author: fxsaber

 

Todas as estatísticas que estão no Relatório de execução única estão disponíveis. Anteriormente, era impossível obter grande parte dessas informações, mesmo que você tivesse a fonte do Expert Advisor.

  double            ghpr;                    // transação média geométrica 
  double            ghprpercent;             // média geométrica da transação em porcentagem 
  double            ahpr;                    // média aritmética da transação 
  double            ahprpercent;             // média aritmética de transações em porcentagem 
  double            zscore;                  // teste de série 
  double            zscorepercent;           // teste de série em porcentagem 
  double            lrcorr;                  // coeficiente de correlação da regressão linear 
  double            lrstderror;              // erro padrão do desvio de equilíbrio da regressão linear 
  double            corr_prf_mfe;            // correlação entre a mfe e o lucro 
  double            corr_prf_mae;            // correlação entre mae e lucro 
  double            corr_mfe_mae;            // correlação entre mae e mfe 
  double            mfe_a;                   // correlação entre mfe e lucro, coeficiente da linha de regressão linear 
  double            mfe_b;                   // correlação entre mfe e lucro, coeficiente da linha de regressão linear 
  double            mae_a;                   // correlação entre mae e lucro, coeficiente da linha de regressão linear 
  double            mae_b;                   // correlação entre mae e lucro, coeficiente da linha de regressão linear 
  UINT              in_per_hours[24];        // distribuição de insumos por horas 
  UINT              in_per_week_days[7];     // distribuição de insumos por dia da semana 
  UINT              in_per_months[12];       // distribuição de insumos por mês 
  double            out_per_hours[24][2];    // distribuição de insumos por horas 
  double            out_per_week_days[7][2]; // distribuição de insumos por dia da semana 
  double            out_per_months[12][2];   // distribuição de insumos por mês 
  INT64             holding_time_min;        // tempo mínimo de manutenção da posição 
  INT64             holding_time_max;        // tempo máximo de manutenção da posição 
  INT64             holding_time_avr;        // tempo médio de manutenção da posição
 

A versão atual do formato tst não tem os seguintes dados

  • Tempo em milissegundos.
  • ID da posição.
  • MagicNumber.
Isso impõe limitações nos cenários de uso.
 

Reprodução de vários bugs. Execute o Expert Advisor no Tester em uma conta de hedge.

#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PAUSE 100000

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
    Sleep(PAUSE);
    
    OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0);
    Sleep(PAUSE);

    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);
    
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);

    TesterWithdrawal(100);    
    
    FirstRun = false;
  }
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      Print(OrderTicketID()); // MT5-PositionID
    }
}


Obtemos o seguinte

2020.01.08 23:59:58   #1 2020.01.01 00:00:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.01 00:00:00 0.00000 0.00 0.00 100000.00 0
2020.01.08 23:59:58   0
2020.01.08 23:59:58   #4 2020.01.02 06:00:00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:03:20 1.12132 -3.56 0.00 -4.46 0
2020.01.08 23:59:58   2
2020.01.08 23:59:58   #5 2020.01.02 06:01:40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:06:40 1.12129 -7.14 0.00 -14.27 0
2020.01.08 23:59:58   3
2020.01.08 23:59:58   #6 2020.01.02 06:10:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.02 06:10:00 0.00000 0.00 0.00 -100.00 withdrawal 0
2020.01.08 23:59:58   0


Em seguida, lemos o arquivo tst correspondente com o script.

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

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Se fosse possível ler o último registro de cache de uma única execução
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Conduza-o para o objeto correspondente.

    for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++)
      Print(SingleTesterCache.Positions[i].ToString());
  }
}


Ele exibirá dados sobre as posições

id = 0
mfe = 0.0
mae = -8.029999999999999
profit = -4.46
lifetime = 00:03:20

id = 0
mfe = 0.0
mae = -21.4
profit = -14.27
lifetime = 00:05:00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00:00:00


Se compararmos tudo o que foi dito nesta postagem, os seguintes erros são apresentados.

  • Ids nulos em vez dos ids corretos.
  • A comissão e o swap não são levados em conta no cálculo do lucro.
  • A negociação de retirada é erroneamente incluída no número de posições de negociação fechadas.
 

Em vez de set-files, agora uso tst-files. Você pode alternar entre eles muito rapidamente, tendo não apenas parâmetros de entrada, mas também backtests completos.

É uma pena que seja impossível combinar diferentes TSs em um portfólio devido à falta de dados de milissegundos no tst.


Espero que os desenvolvedores comecem a usar os campos existentes em todo o seu potencial

INT64             TradeDeal::time_create;             // tempo de criação do registro

INT64             TradeOrder::time_setup;             // hora do recebimento do pedido do cliente para o sistema
INT64             TradeOrder::time_done;              // hora do cancelamento do pedido

escrevendo o valor de tempo em milissegundos em vez de segundos.


Em geral, na prática, para demonstrar toda a facilidade de uso do tst, não são apresentados defeitos muito pequenos do tst. Isso deve ser corrigido.

 
Muitas vezes é necessário examinar o gráfico de equilíbrio de passagem única com mais detalhes.
// Gráfico interativo de balanço de passagem única.

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

#include <..\Files\Graph.mqh> // https://www.mql5.com/pt/code/18801

#import "shell32.dll"
  int ShellExecuteW( int, string, string, string, string, int );
#import

#define  BASEPATH (::TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\")

bool CreateBalanceData( const SINGLETESTERCACHE &SingleTesterCache, const string FileName = "exdat.txt" )
{
  const int handle = FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI);
  const bool Res = (handle != INVALID_HANDLE);

  if (Res)
  {
    FileWriteString(handle, "var dat1=[\n");
    
    for (uint i = 0; i < SingleTesterCache.Header.equities_total; i++)
      FileWriteString(handle, "[" + (string)((long)SingleTesterCache.TradeState[i].time * 1000) + "," + ::DoubleToString(SingleTesterCache.TradeState[i].balance, 2) + "],\n");

    FileWriteString(handle, "];\n");
    FileWriteString(handle, "var T1=dat1[0][0];\n");
    FileWriteString(handle, "var T2=dat1[dat1.length-1][0];\n");
    FileWriteString(handle, "var nTrades=dat1.length;\n");
    FileWriteString(handle, "var Balance=" + ::DoubleToString(SingleTesterCache.TradeState[SingleTesterCache.Header.equities_total - 1].balance, 2) + ";\n");
    FileWriteString(handle, "var Currency=\"" + (SingleTesterCache.Header.trade_pips ? "Pips" : SingleTesterCache.Header.trade_currency[]) + "\";\n");

    FileClose(handle);
  }

  return(Res);
}

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Se fosse possível ler o último registro de cache de uma única execução
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Conduza-o para o objeto correspondente.
    
    const string FileName = "Report.htm";
    uchar Array[];    
    
    if ((StringToCharArray(StrMQH, Array) > 0) && FileSave(FileName, Array) && CreateBalanceData(SingleTesterCache))
      ShellExecuteW(0, "Open", BASEPATH + FileName, NULL, NULL, 3);      
  }
}


Se substituirmos

TradeState[i].balance -> TradeState[i].equity

será um gráfico de patrimônio líquido.

 

O volume de negociações/ordens está incorretamente escrito em tst. Ele é sempre calculado como se SYMBOL_TRADE_CONTRACT_SIZE = 100 000.

Se um valor diferente for definido, ele não terá efeito sobre o valor do volume no tst.

 
fxsaber:

na prática para demonstrar que toda a facilidade de usar o tst na prática não é proporcionada por pequenas deficiências do tst. Isso deve ser corrigido.

Oprimeiro gole.

TesterPortfolio - портфель ТС
TesterPortfolio - портфель ТС
  • www.mql5.com
Возьмем третий пункт. Допустим, взяли несколько приглянувшихся советников из Маркета. Настроили их для каждого символа. TesterPortfolio запустит все варианты одновременно, показав общую торговую статистику (просадка эквити на реальных тиках и т.д.). Чаще всего использую для оценки диверсификации различных настроек своих ТС. Использование. На...
 
TesterPortfolio - портфель ТС
TesterPortfolio - портфель ТС
  • 2020.01.16
  • www.mql5.com
В приложении советник/робот, который объединяет несколько независимых одиночных проходов MT5-Тестера в один. Сценарии использования. Чужой советник с закрытым исходным кодом не запускается в MT5-Визуализаторе. TesterPortfolio сможет немного помочь. Сбор статистики прямо во время торговли советников с закрытым исходным кодом. Например...
 
 

Não sei como isso acontece nos blogs. O aparecimento de um novo comentário (se não for uma resposta) é sinalizado de alguma forma? Ou é melhor postar em um dos tópicos do fórum onde os novos comentários ficam visíveis?

Por que eles não publicaram isso na KB? Seria mais conveniente.

Então, onde postar para obter uma resposta imediata?