Quoting-Strategie
Überblick
MqStrategy ist eine Strategie, die einen Quoting-Mechanismus zur Verwaltung von Marktpositionen verwendet. Sie erstellt einen Quoting-Prozessor auf Basis der aktuellen Position, sodass sie adaptiv auf Änderungen der Marktbedingungen reagieren kann.
Hauptkomponenten
public class MqStrategy : Strategy
{
private readonly StrategyParam<MarketPriceTypes> _priceType;
private readonly StrategyParam<Unit> _priceOffset;
private readonly StrategyParam<Unit> _bestPriceOffset;
private QuotingProcessor _quotingProcessor;
}
Strategieparameter
Die Strategie erlaubt die Anpassung der folgenden Parameter:
- PriceType - Marktpreistyp für das Quoting (Standardwert Following)
- PriceOffset - Preisabstand zum Marktpreis
- BestPriceOffset - Mindestabweichung für die Aktualisierung der Quote (Standardwert 0.1 %)
Initialisierung der Strategie
In der Methode OnStarted2 abonniert die Strategie Änderungen der Marktzeit:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// Änderungen der Marktzeit für Quote-Aktualisierungen abonnieren
Connector.CurrentTimeChanged += Connector_CurrentTimeChanged;
Connector_CurrentTimeChanged(default);
}
Verwaltung des Quoting-Prozessors
Die Methode Connector_CurrentTimeChanged wird aufgerufen, wenn sich die Marktzeit ändert, und verwaltet die Erstellung sowie Aktualisierung des Quoting-Prozessors:
private void Connector_CurrentTimeChanged(TimeSpan obj)
{
// Neuen Prozessor nur erstellen, wenn der aktuelle gestoppt ist oder nicht existiert
if (_quotingProcessor != null && _quotingProcessor.LeftVolume > 0)
return;
// Ressourcen des alten Prozessors freigeben, falls vorhanden
_quotingProcessor?.Dispose();
_quotingProcessor = null;
// Quoting-Seite anhand der aktuellen Position bestimmen
var side = Position <= 0 ? Sides.Buy : Sides.Sell;
// Neues Quoting-Verhalten erstellen
var behavior = new MarketQuotingBehavior(
PriceOffset,
BestPriceOffset,
PriceType
);
// Quoting-Volumen berechnen
var quotingVolume = Volume + Math.Abs(Position);
// Prozessor erstellen und initialisieren
_quotingProcessor = new QuotingProcessor(
behavior,
Security,
Portfolio,
side,
quotingVolume,
Volume, // Maximales Ordervolumen
TimeSpan.Zero, // Kein Timeout
this, // Strategy implementiert ISubscriptionProvider
this, // Strategy implementiert IMarketRuleContainer
this, // Strategy implementiert ITransactionProvider
this, // Strategy implementiert ITimeProvider
this, // Strategy implementiert IMarketDataProvider
IsFormedAndOnlineAndAllowTrading, // Handelsberechtigung prüfen
true, // Orderbuchpreise verwenden
true // Letzten Trade-Preis verwenden, wenn das Orderbuch leer ist
)
{
Parent = this
};
// Prozessorereignisse für das Logging abonnieren
_quotingProcessor.OrderRegistered += order =>
this.AddInfoLog($"Auftrag {order.TransactionId} zum Preis {order.Price} registriert");
_quotingProcessor.OrderFailed += fail =>
this.AddInfoLog($"Auftrag fehlgeschlagen: {fail.Error.Message}");
_quotingProcessor.OwnTrade += trade =>
this.AddInfoLog($"Ausführung erfolgt: {trade.Trade.Volume} zu {trade.Trade.Price}");
_quotingProcessor.Finished += isOk => {
this.AddInfoLog($"Quoting erfolgreich abgeschlossen: {isOk}");
_quotingProcessor?.Dispose();
_quotingProcessor = null;
};
// Prozessor starten
_quotingProcessor.Start();
}
Ressourcenfreigabe
In der Methode OnStopped gibt die Strategie Ressourcen frei:
protected override void OnStopped()
{
// Abonnement entfernen, um Speicherlecks zu verhindern
Connector.CurrentTimeChanged -= Connector_CurrentTimeChanged;
// Ressourcen des aktuellen Prozessors freigeben, falls vorhanden
_quotingProcessor?.Dispose();
_quotingProcessor = null;
base.OnStopped();
}
Handelslogik
- Die Strategie reagiert auf Änderungen der Marktzeit.
- Die Quoting-Richtung wird anhand der aktuellen Position bestimmt:
- Wenn Position <= 0 ist, wird eine Kauf-Quote erstellt.
- Wenn Position > 0 ist, wird eine Verkaufs-Quote erstellt.
- Das Quoting-Volumen wird als Basisvolumen plus absoluter Wert der aktuellen Position berechnet.
- Für das Quoting wird QuotingProcessor mit MarketQuotingBehavior verwendet.
Funktionen
- Verwendet den modernen Quoting-Prozessor statt älterer Quoting-Strategien.
- Reagiert adaptiv auf Positionsänderungen, indem die Quoting-Richtung geändert wird.
- Unterstützt die Konfiguration verschiedener Quoting-Parameter (Preistyp, Abstand, Mindestabweichung).
- Enthält detailliertes Logging der Ereignisse des Quoting-Prozessors.
- Verwaltet Ressourcen korrekt beim Stoppen der Strategie und beim Erstellen neuer Prozessoren.
- Unterstützt die Arbeit mit verschiedenen Typen von Marktpreisen (Following, Best, Opposite usw.).