From 399872610036d9a081f8a34c4987c13a29b81f63 Mon Sep 17 00:00:00 2001 From: Ramiro Paz Date: Thu, 12 Mar 2026 17:10:31 -0300 Subject: [PATCH] respond automatically to quote requests --- src/client/fix/application.go | 15 ++++++++++----- src/client/fix/manager.go | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/client/fix/application.go b/src/client/fix/application.go index 8bfbeff..759c174 100644 --- a/src/client/fix/application.go +++ b/src/client/fix/application.go @@ -12,11 +12,12 @@ import ( ) type application struct { - router *quickfix.MessageRouter - notifier domain.Notifier - onLogon func(quickfix.SessionID) - onLogout func(quickfix.SessionID) - onQuote func(quote.Quote, quickfix.SessionID) + router *quickfix.MessageRouter + notifier domain.Notifier + onLogon func(quickfix.SessionID) + onLogout func(quickfix.SessionID) + onQuote func(quote.Quote, quickfix.SessionID) + onQuoteRequest func(quoterequest.QuoteRequest, quickfix.SessionID) } func newApplication(n domain.Notifier) *application { @@ -99,6 +100,10 @@ func (a *application) handleQuoteRequest(msg quoterequest.QuoteRequest, sessionI "session", sessionID.String(), ) + if a.onQuoteRequest != nil { + a.onQuoteRequest(msg, sessionID) + } + return nil } diff --git a/src/client/fix/manager.go b/src/client/fix/manager.go index 3eb26c7..646ad40 100644 --- a/src/client/fix/manager.go +++ b/src/client/fix/manager.go @@ -13,6 +13,7 @@ import ( "quantex.com/qfixdpl/quickfix/gen/enum" "quantex.com/qfixdpl/quickfix/gen/field" "quantex.com/qfixdpl/quickfix/gen/fix50sp2/quote" + "quantex.com/qfixdpl/quickfix/gen/fix50sp2/quoterequest" "quantex.com/qfixdpl/quickfix/store/file" "quantex.com/qfixdpl/src/app" "quantex.com/qfixdpl/src/common/tracerr" @@ -43,6 +44,7 @@ func (m *Manager) Start() error { fixApp := newApplication(m.notify) fixApp.onLogon = m.onLogon fixApp.onLogout = m.onLogout + fixApp.onQuoteRequest = m.handleQuoteRequest m.app = fixApp f, err := os.Open(m.cfg.SettingsFile) @@ -166,3 +168,27 @@ func (m *Manager) SendQuote(clOrdID, quoteID, symbol, currency string, bidPx, of return nil } + +// handleQuoteRequest auto-responds to an incoming QuoteRequest with a quote at price 99.6. +func (m *Manager) handleQuoteRequest(msg quoterequest.QuoteRequest, sessionID quickfix.SessionID) { + quoteReqID, err := msg.GetQuoteReqID() + if err != nil { + slog.Error("handleQuoteRequest: missing QuoteReqID", "error", err.Error()) + return + } + + var symbol, currency string + + relatedSyms, relErr := msg.GetNoRelatedSym() + if relErr == nil && relatedSyms.Len() > 0 { + sym := relatedSyms.Get(0) + symbol, _ = sym.GetSymbol() + currency, _ = sym.GetCurrency() + } + + price := decimal.NewFromFloat(99.6) + + if sendErr := m.SendQuote(quoteReqID, quoteReqID, symbol, currency, price, price, decimal.Zero, decimal.Zero); sendErr != nil { + slog.Error("handleQuoteRequest: failed to send quote", "quoteReqID", quoteReqID, "error", sendErr.Error()) + } +}