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

 

A fim de obter o graal no modo pips, fechar as posições perdidas com um marcador para todo o volume da posição, e as rentáveis com 0,01 lotes.

Exemplo.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

const bool Init = EventSetTimer(100);

void OnTimer()
{
  while (OrdersTotal())
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0) ? 0.01 : OrderLots(), OrderClosePrice(), 0);
      
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
}


Resultado

 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Bibliotecas: SingleTesterCache

fxsaber, 2020.01.12 23:20

A versão actual do formato tst não contém os seguintes dados

  • Tempo em milissegundos.
  • PositionID.
  • MagicNumber.
Isto impõe restrições nos cenários de utilização.
 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Bibliotecas: SingleTesterCache

fxsaber, 2020.01.13 00:01

Reproduzir vários bugs. Lançamos o Consultor Especialista no Teste de Estratégia sobre uma conta de cobertura.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/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


Depois lemos o ficheiro tst correspondente utilizando o guião.

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

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

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


Irá imprimir os 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 neste post, veremos os seguintes bugs.

  • Id zero, em vez de id correcto.
  • A comissão e a troca não são tidas em conta no cálculo do lucro.
  • O comércio de retirada está erroneamente incluído no número de posições comerciais fechadas.

 

O depurador não é totalmente funcional. O que falta em comparação com os depuradores padrão, por ordem decrescente de falhas.

1. Modificação da memória. Pode-se ver variáveis, mas a edição parece não ser possível.

2. Pontos de ruptura condicionados. Como parar se o teste variável=10.

3. Possibilidade de mover a execução. Por outras palavras, basta clicar sobre uma linha e dizer-lhe para a executar a partir daí. Por outras palavras, clique numa linha e diga: "Agora corra a partir daqui".

4. um anexo a um guião/conselheiro/indicador já em execução. Ou, pelo menos, a capacidade de fixação ao colidir, pelo que é fácil de analisar.

 
traveller00:

O depurador não é totalmente funcional. O que falta em comparação com os depuradores padrão, por ordem decrescente de falhas.

2. Pontos de ruptura condicionados. Como parar se o teste variável=10.

if (smth) {

    int a;

}
 
Sim, concordo, é possível conseguir quase tudo por remontagem. Excepto no ponto 4. 4. Mas eu ainda gostaria de o ver no depurador, porque é um conjunto padrão de funções para o depurador.
 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Bibliotecas: SingleTesterCache

fxsaber, 2020.01.14 10:49

Utilizo agora os ficheiros t em vez dos ficheiros set. Pode alternar entre eles muito rapidamente, tendo não só parâmetros de entrada mas também testes completos de retrocesso.

É uma pena que não possamos agora combinar TS diferentes numa carteira completa devido à falta de dados de milissegundos em tst.


Espero que os criadores comecem a utilizar ao máximo os campos existentes

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;              // время снятия завки

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


Geralmente, na prática não podemos demonstrar toda a frieza da utilização do tst devido a alguns ligeiras desvantagens no tst. Isto poderia ser corrigido.

 


TesterWithdrawal está no relatório, mas TesterDeposit está ausente.

 
Como compreender esta imagem. O gráfico de optimização mostra valores máximos de cerca de 5000. Mas na tabela de optimização o valor máximo é 4670. Onde estão os parâmetros para os melhores passes ?
Arquivos anexados:
8c97so2_7-1.jpg  184 kb
 
Grozir:
Como compreender esta imagem. O gráfico de optimização mostra valores máximos de cerca de 5000. E na tabela de optimização o valor máximo é 4670. Onde estão os parâmetros para os melhores passes ?

Ordenar a coluna "Resultado".