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.
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.
// 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.
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.
- www.mql5.com
- 2020.01.16
- www.mql5.com
Respondido lá.
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?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso


SingleTesterCache:
Dados de passagem única do testador.
Author: fxsaber