adding project logic
This commit is contained in:
105
src/client/fix/application.go
Normal file
105
src/client/fix/application.go
Normal file
@ -0,0 +1,105 @@
|
||||
// Package fix implements the QuickFIX acceptor application.
|
||||
package fix
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"time"
|
||||
|
||||
"quantex.com/qfixdpl/quickfix"
|
||||
"quantex.com/qfixdpl/quickfix/gen/fix50sp2/newordersingle"
|
||||
"quantex.com/qfixdpl/src/domain"
|
||||
)
|
||||
|
||||
type application struct {
|
||||
router *quickfix.MessageRouter
|
||||
orderStore domain.OrderStore
|
||||
onLogon func(quickfix.SessionID)
|
||||
onLogout func(quickfix.SessionID)
|
||||
}
|
||||
|
||||
func newApplication(orderStore domain.OrderStore) *application {
|
||||
app := &application{
|
||||
router: quickfix.NewMessageRouter(),
|
||||
orderStore: orderStore,
|
||||
}
|
||||
|
||||
app.router.AddRoute(newordersingle.Route(app.handleNewOrderSingle))
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
func (a *application) OnCreate(sessionID quickfix.SessionID) {
|
||||
slog.Info("FIX session created", "session", sessionID.String())
|
||||
}
|
||||
|
||||
func (a *application) OnLogon(sessionID quickfix.SessionID) {
|
||||
slog.Info("FIX client 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())
|
||||
if a.onLogout != nil {
|
||||
a.onLogout(sessionID)
|
||||
}
|
||||
}
|
||||
|
||||
func (a *application) ToAdmin(_ *quickfix.Message, _ quickfix.SessionID) {}
|
||||
|
||||
func (a *application) ToApp(_ *quickfix.Message, _ quickfix.SessionID) error { return nil }
|
||||
|
||||
func (a *application) FromAdmin(_ *quickfix.Message, _ quickfix.SessionID) quickfix.MessageRejectError {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *application) FromApp(msg *quickfix.Message, sessionID quickfix.SessionID) quickfix.MessageRejectError {
|
||||
return a.router.Route(msg, sessionID)
|
||||
}
|
||||
|
||||
func (a *application) handleNewOrderSingle(msg newordersingle.NewOrderSingle, sessionID quickfix.SessionID) quickfix.MessageRejectError {
|
||||
clOrdID, err := msg.GetClOrdID()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
symbol, err := msg.GetSymbol()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user