Dados aleatórios
O teste com dados aleatórios é um tipo especial de teste. Não se destina a procurar os parâmetros ótimos. Em vez disso, este tipo de teste permite detetar erros no código ao expor o algoritmo de negociação a vários cenários de bolsa.
Regra geral, apenas um determinado conjunto de cenários é usado no desenvolvimento do algoritmo. Por isso, quando ocorre uma situação especial, o algoritmo pode não reagir corretamente ou lançar exceções. Por exemplo, podem ocorrer as seguintes situações:
- A estratégia trabalha com candles TimeFrameCandleMessage e espera, em cada iteração, que exista sempre um candle para o período de tempo solicitado. Um período começou quando não houve uma única transação, e o candle não foi criado. Como resultado, na ausência de tratamento adequado, será lançada a NullReferenceException e a estratégia irá parar.
- A estratégia trabalha com um instrumento pouco líquido e usa IOrderBookMessage. A estratégia espera que o livro de ordens esteja sempre preenchido. Em determinado momento, o livro de ordens está preenchido apenas de um lado (por exemplo, há bids, mas não há offers). Se a estratégia não estiver preparada para esta situação, irá registar uma ordem incorretamente ou lançar uma exceção e parar.
- A estratégia calcula os níveis de preço. O código está escrito de tal forma que a estratégia aguarda que os níveis definidos antecipadamente sejam rompidos. Se os níveis forem calculados e definidos incorretamente, nunca serão rompidos, ou apenas um deles será sempre rompido. Como resultado, a estratégia não executará quaisquer transações ou estas transações perderão dinheiro.
Para estes e muitos outros cenários de funcionamento da bolsa, impossíveis de prever antecipadamente, o S# fornece testes com dados aleatórios, capazes de gerar o número máximo de condições num intervalo curto devido à sua diversidade uniforme.
Teste com dados aleatórios da estratégia de médias móveis
O exemplo SampleRandomEmulation (..Samples/Testing/SampleRandomEmulation) é quase idêntico ao exemplo SampleHistoryTesting (a sua descrição encontra-se na secção teste com dados históricos) devido ao uso da classe unificada HistoryEmulationConnector. Mas, ao contrário do teste com dados históricos, no teste com dados aleatórios os dados de mercado não são carregados e são gerados "on the fly". Por isso, são adicionados ao exemplo dois geradores de dados aleatórios: um para o livro de ordens e outro para as tick trades. Em SampleHistoryTesting é usado apenas um gerador - para o livro de ordens, uma vez que não há histórico armazenado.
_connector.MarketDataAdapter.SendInMessage(new GeneratorMessage { IsSubscribe = true, Generator = new RandomWalkTradeGenerator(new SecurityId { SecurityCode = security.Code }) { Interval = TimeSpan.FromSeconds(1), MaxVolume = maxVolume, MaxPriceStepCount = 3, GenerateOriginSide = true, MinVolume = minVolume, RandomArrayLength = 99, } }); _connector.SubscribeMarketDepth(new TrendMarketDepthGenerator(_connector.GetSecurityId(security)) { GenerateDepthOnEachTrade = false });O resultado do funcionamento do exemplo é o seguinte:
