From 5053bfa9afcefce599537b018064415dcbfdbd6e Mon Sep 17 00:00:00 2001 From: Ramiro Paz Date: Tue, 10 Mar 2026 16:28:09 -0300 Subject: [PATCH] changing to initiator --- Makefile | 6 +-- main.go | 4 ++ src/app/version/version.go | 19 +++++----- src/client/fix/application.go | 70 ++++++++++------------------------- src/client/fix/manager.go | 39 +++++++++---------- tools/build.sh | 2 +- tools/generate-jwt.sh | 2 +- tools/restart | 2 +- 8 files changed, 58 insertions(+), 86 deletions(-) diff --git a/Makefile b/Makefile index b149483..c758d23 100644 --- a/Makefile +++ b/Makefile @@ -56,13 +56,13 @@ build: check-env swag vendor only-build # Build a native version. Set e=environm only-build: check-env @echo "Building for $(e) environment..." - env OUT_PATH=$(DEFAULT_OUT_PATH) tools/build.sh $(e) + env OUT_PATH=$(DEFAULT_OUT_PATH) GOARCH=amd64 GOOS=linux tools/build.sh $(e) linux-build: check-env swag # Build a linux version for prod environment. Set e=environment: prod, dev, demo, open-demo env OUT_PATH=$(DEFAULT_OUT_PATH) GOARCH=amd64 GOOS=linux tools/build.sh $(e) -deploy: check-env # Deploy to remote server. Set e=environment: prod, dev, demo, open-demo - tools/deploy.sh $(e) +deploy: # Deploy to remote server. Set e=environment: prod, dev, demo, open-demo; s=serverName; i=instance; e.g. make deploy e=dev s=nonprodFix i=dpl + make build e=$(e) && qscp build/out/distribution/qfixdpl.gz $(s):/home/quantex/qfixtb/$(i)/ fmt: download-versions # Apply the Go formatter to the code cd tools/check; unset GOPATH; GOBIN=$$PWD/../bin go install mvdan.cc/gofumpt@$(call get_version,gofumpt); diff --git a/main.go b/main.go index c3d77c3..3d6535a 100644 --- a/main.go +++ b/main.go @@ -178,6 +178,10 @@ func parseLogLevel(level string) (slog.Level, error) { func startRunner(runner, globalCfg, serviceCfg string) { var fn func(cfg app.Config) error + + if runner == "" { + runner = "service" + } switch runner { case "service": fn = service.Runner diff --git a/src/app/version/version.go b/src/app/version/version.go index c82ad74..72f8367 100644 --- a/src/app/version/version.go +++ b/src/app/version/version.go @@ -3,7 +3,6 @@ package version import ( "fmt" - "os" "runtime" "strings" ) @@ -38,17 +37,17 @@ type EnvironmentType int //nolint:recvcheck // The methods of this are autogener var environment EnvironmentType //nolint:gochecknoglobals // Just keept this global to avoid having to create an instance func init() { - aux := os.Getenv(quantexEnvironment) - if aux == "" { - panic("QUANTEX_ENVIRONMENT is not set") - } + // aux := os.Getenv(EnvironmentTypeDev) + // if aux == "" { + // panic("QUANTEX_ENVIRONMENT is not set") + // } - env, err := ParseEnvironmentType(aux) - if err != nil { - panic("Invalid QUANTEX_ENVIRONMENT value: " + aux + " " + err.Error()) - } + // env, err := ParseEnvironmentType(aux) + // if err != nil { + // panic("Invalid QUANTEX_ENVIRONMENT value: " + aux + " " + err.Error()) + // } - environment = env + environment = EnvironmentTypeDev } // Base returns the version base name diff --git a/src/client/fix/application.go b/src/client/fix/application.go index de4c204..8b6868f 100644 --- a/src/client/fix/application.go +++ b/src/client/fix/application.go @@ -1,29 +1,26 @@ -// Package fix implements the QuickFIX acceptor application. +// Package fix implements the QuickFIX initiator application. package fix import ( "log/slog" - "time" "quantex.com/qfixdpl/quickfix" - "quantex.com/qfixdpl/quickfix/gen/fix50sp2/newordersingle" - "quantex.com/qfixdpl/src/domain" + "quantex.com/qfixdpl/quickfix/gen/fix50sp2/quote" ) type application struct { - router *quickfix.MessageRouter - orderStore domain.OrderStore - onLogon func(quickfix.SessionID) - onLogout func(quickfix.SessionID) + router *quickfix.MessageRouter + onLogon func(quickfix.SessionID) + onLogout func(quickfix.SessionID) + onQuote func(quote.Quote, quickfix.SessionID) } -func newApplication(orderStore domain.OrderStore) *application { +func newApplication() *application { app := &application{ - router: quickfix.NewMessageRouter(), - orderStore: orderStore, + router: quickfix.NewMessageRouter(), } - app.router.AddRoute(newordersingle.Route(app.handleNewOrderSingle)) + app.router.AddRoute(quote.Route(app.handleQuote)) return app } @@ -33,14 +30,14 @@ func (a *application) OnCreate(sessionID quickfix.SessionID) { } func (a *application) OnLogon(sessionID quickfix.SessionID) { - slog.Info("FIX client logged on", "session", sessionID.String()) + slog.Info("FIX session logged on", "session", sessionID.String()) if a.onLogon != nil { a.onLogon(sessionID) } } func (a *application) OnLogout(sessionID quickfix.SessionID) { - slog.Info("FIX client logged out", "session", sessionID.String()) + slog.Info("FIX session logged out", "session", sessionID.String()) if a.onLogout != nil { a.onLogout(sessionID) } @@ -58,48 +55,19 @@ func (a *application) FromApp(msg *quickfix.Message, sessionID quickfix.SessionI return a.router.Route(msg, sessionID) } -func (a *application) handleNewOrderSingle(msg newordersingle.NewOrderSingle, sessionID quickfix.SessionID) quickfix.MessageRejectError { - clOrdID, err := msg.GetClOrdID() +func (a *application) handleQuote(msg quote.Quote, sessionID quickfix.SessionID) quickfix.MessageRejectError { + quoteID, err := msg.GetQuoteID() if err != nil { return err } - symbol, err := msg.GetSymbol() - if err != nil { - return err + symbol, _ := msg.GetSymbol() + + slog.Info("Quote received", "quoteID", quoteID, "symbol", symbol, "session", sessionID.String()) + + if a.onQuote != nil { + a.onQuote(msg, sessionID) } - side, err := msg.GetSide() - if err != nil { - return err - } - - ordType, err := msg.GetOrdType() - if err != nil { - return err - } - - orderQty, err := msg.GetOrderQty() - if err != nil { - return err - } - - price, _ := msg.GetPrice() // Price is optional for some OrdTypes - - order := domain.Order{ - ClOrdID: clOrdID, - Symbol: symbol, - Side: string(side), - OrdType: string(ordType), - OrderQty: orderQty, - Price: price, - SessionID: sessionID.String(), - ReceivedAt: time.Now(), - } - - a.orderStore.SaveOrder(order) - - slog.Info("NewOrderSingle received", "clOrdID", clOrdID, "symbol", symbol, "side", order.Side) - return nil } diff --git a/src/client/fix/manager.go b/src/client/fix/manager.go index dba697b..6bd70fa 100644 --- a/src/client/fix/manager.go +++ b/src/client/fix/manager.go @@ -17,9 +17,9 @@ import ( "quantex.com/qfixdpl/src/domain" ) -// Manager wraps the QuickFIX acceptor and implements domain.FIXSender. +// Manager wraps the QuickFIX initiator and implements domain.FIXSender. type Manager struct { - acceptor *quickfix.Acceptor + initiator *quickfix.Initiator app *application sessionsMu sync.RWMutex sessions map[string]quickfix.SessionID @@ -38,7 +38,7 @@ func NewManager(cfg app.FIXConfig, orderStore domain.OrderStore, notify domain.N } func (m *Manager) Start() error { - fixApp := newApplication(m.orderStore) + fixApp := newApplication() fixApp.onLogon = m.onLogon fixApp.onLogout = m.onLogout m.app = fixApp @@ -57,26 +57,26 @@ func (m *Manager) Start() error { storeFactory := quickfix.NewMemoryStoreFactory() logFactory := quickfix.NewNullLogFactory() - acceptor, err := quickfix.NewAcceptor(fixApp, storeFactory, settings, logFactory) + initiator, err := quickfix.NewInitiator(fixApp, storeFactory, settings, logFactory) if err != nil { - return fmt.Errorf("creating FIX acceptor: %w", err) + return fmt.Errorf("creating FIX initiator: %w", err) } - m.acceptor = acceptor + m.initiator = initiator - if err = m.acceptor.Start(); err != nil { - return fmt.Errorf("starting FIX acceptor: %w", err) + if err = m.initiator.Start(); err != nil { + return fmt.Errorf("starting FIX initiator: %w", err) } - slog.Info("FIX acceptor started", "settings", m.cfg.SettingsFile) + slog.Info("FIX initiator started", "settings", m.cfg.SettingsFile) return nil } func (m *Manager) Stop() { - if m.acceptor != nil { - m.acceptor.Stop() - slog.Info("FIX acceptor stopped") + if m.initiator != nil { + m.initiator.Stop() + slog.Info("FIX initiator stopped") } } @@ -94,17 +94,18 @@ func (m *Manager) onLogout(sessionID quickfix.SessionID) { // SendQuote implements domain.FIXSender. func (m *Manager) SendQuote(clOrdID, quoteID, symbol, currency string, bidPx, offerPx, bidSize, offerSize decimal.Decimal) error { - order, ok := m.orderStore.GetOrderByClOrdID(clOrdID) - if !ok { - return fmt.Errorf("order not found: %s", clOrdID) - } - m.sessionsMu.RLock() - sessionID, ok := m.sessions[order.SessionID] + var sessionID quickfix.SessionID + var ok bool + for _, sid := range m.sessions { + sessionID = sid + ok = true + break + } m.sessionsMu.RUnlock() if !ok { - return fmt.Errorf("session not active for order %s (session %s)", clOrdID, order.SessionID) + return fmt.Errorf("no active FIX session") } q := quote.New( diff --git a/tools/build.sh b/tools/build.sh index ef8aa77..293350b 100755 --- a/tools/build.sh +++ b/tools/build.sh @@ -42,7 +42,7 @@ if COMMIT_MSG=$(QUANTEX_ENVIRONMENT=$ENV "${OUT_PATH}/qfixdpl" -v 2>/dev/null); echo "$COMMIT_MSG" else echo "---------------------------------" - echo "Skeleton" + echo "QFIXDPL" echo "Built at: ${BUILT_TIME}" echo "Branch: ${BUILD_BRANCH}" echo "SHA: ${BUILD_HASH}" diff --git a/tools/generate-jwt.sh b/tools/generate-jwt.sh index 2ae449e..a8610ef 100755 --- a/tools/generate-jwt.sh +++ b/tools/generate-jwt.sh @@ -3,7 +3,7 @@ set -e read -r -p "Issuer: " ISSUER -read -r -p "Service (e.g. SKELETON): " SERVICE +read -r -p "Service (e.g. QFIXDPL): " SERVICE read -r -p "Token: " TOKEN read -r -p "Expire (e.g. 24h) [none]: " EXPIRY diff --git a/tools/restart b/tools/restart index 052ecf0..ffeba99 100644 --- a/tools/restart +++ b/tools/restart @@ -1,4 +1,4 @@ #!/bin/bash systemctl daemon-reload -systemctl restart skeleton.service \ No newline at end of file +systemctl restart qfixdpl.service \ No newline at end of file