Zufallsdaten
Das Testen mit Zufallsdaten ist eine besondere Art des Testens. Es dient nicht dazu, optimale Parameter zu suchen. Stattdessen kann ein solcher Test Fehler im Code aufdecken, indem der Handelsalgorithmus unterschiedlichen Börsenszenarien ausgesetzt wird.
In der Algorithmusentwicklung wird in der Regel nur eine bestimmte Menge von Szenarien verwendet. Tritt deshalb eine spezielle Situation auf, kann der Algorithmus falsch reagieren oder Ausnahmen auslösen. Zum Beispiel können folgende Situationen auftreten:
- Die Strategie arbeitet mit Kerzen vom Typ TimeFrameCandleMessage und erwartet bei jeder Iteration, dass für den angeforderten Zeitraum immer eine Kerze vorhanden ist. Ein Zeitraum beginnt jedoch, in dem kein einziger Trade stattgefunden hat, und es wird keine Kerze erstellt. Ohne korrekte Behandlung wird dadurch eine NullReferenceException ausgelöst und die Strategie stoppt.
- Die Strategie arbeitet mit einem illiquiden Instrument und verwendet IOrderBookMessage. Sie erwartet, dass das Orderbuch immer gefüllt ist. Zu einem bestimmten Zeitpunkt ist das Orderbuch nur teilweise gefüllt, zum Beispiel gibt es Gebote, aber keine Angebote. Wenn die Strategie diese Situation nicht berücksichtigt, registriert sie entweder eine Order falsch oder löst eine Ausnahme aus und stoppt.
- Die Strategie berechnet Preisniveaus. Der Code ist so geschrieben, dass die Strategie wartet, bis vorab gesetzte Niveaus durchbrochen werden. Wenn die Niveaus falsch berechnet oder gesetzt wurden, werden sie entweder nie durchbrochen oder es wird immer nur eines davon durchbrochen. Dadurch führt die Strategie entweder gar keine Trades aus oder diese Trades verursachen Verluste.
Für diese und viele andere Börsenszenarien, die sich im Voraus nicht vorhersagen lassen, stellt S# Tests mit Zufallsdaten bereit. Durch die gleichmäßige Einzigartigkeit der generierten Daten kann in kurzer Zeit eine maximale Anzahl von Bedingungen erzeugt werden.
Test einer Strategie mit gleitendem Durchschnitt anhand von Zufallsdaten
Das Beispiel SampleRandomEmulation (..Samples/Testing/SampleRandomEmulation) ist durch die Verwendung der einheitlichen Klasse HistoryEmulationConnector fast identisch mit dem Beispiel SampleHistoryTesting. Dessen Beschreibung finden Sie im Abschnitt Tests mit historischen Daten. Im Unterschied zu den Tests mit historischen Daten werden beim Testen mit Zufallsdaten die Marktdaten jedoch nicht geladen, sondern zur Laufzeit erzeugt. Daher werden dem Beispiel zwei Zufallsdatengeneratoren hinzugefügt: einer für das Orderbuch und einer für Tick-Trades. In SampleHistoryTesting wird nur ein Generator verwendet, nämlich für das Orderbuch, da keine gespeicherte Historie vorhanden ist.
_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 });Das Ergebnis des Beispiels sieht wie folgt aus:
