Skip to content

Commit

Permalink
Standardize id field with new order
Browse files Browse the repository at this point in the history
Signed-off-by: Sylvain Rabot <sylvain@abstraction.fr>
  • Loading branch information
sylr committed Nov 23, 2022
1 parent fc61159 commit 5059101
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 67 deletions.
68 changes: 39 additions & 29 deletions cmd/cancel/mass/mass.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"syscall"
"time"

"github.com/google/uuid"
"github.com/quickfixgo/enum"
"github.com/quickfixgo/field"
"github.com/quickfixgo/quickfix"
Expand All @@ -25,6 +26,7 @@ import (
)

var (
optionOrderID string
optionOrderSide string
optionOrderSymbol string
optionExecReportsTimeout time.Duration
Expand Down Expand Up @@ -57,6 +59,7 @@ var MassCancelOrderCmd = &cobra.Command{
}

func init() {
MassCancelOrderCmd.Flags().StringVar(&optionOrderID, "id", "", "Order id (uuid autogenerated if not given)")
MassCancelOrderCmd.Flags().StringVar(&optionOrderSide, "side", "", "Order side (buy, sell ... etc)")
MassCancelOrderCmd.Flags().StringVar(&optionOrderSymbol, "symbol", "", "Order symbol")

Expand All @@ -75,6 +78,11 @@ func Validate(cmd *cobra.Command, args []string) error {
return errors.OptionOrderSideUnknown
}

if len(optionOrderID) == 0 {
uid := uuid.New()
optionOrderID = uid.String()
}

return nil
}

Expand Down Expand Up @@ -191,7 +199,6 @@ LOOP:

case msg, ok := <-app.FromAppMessages:
if !ok {
logger.Error().Msg("Bad FIX application message received")
break LOOP
}

Expand All @@ -209,6 +216,35 @@ LOOP:
return nil
}

func buildMessage(session config.Session) (quickfix.Messagable, error) {
eside, err := dict.OrderSideStringToEnum(optionOrderSide)
if err != nil {
return nil, err
}

switch session.BeginString {
case quickfix.BeginStringFIXT11:
switch session.DefaultApplVerID {
case "FIX.5.0SP2":
message := quickfix.NewMessage()
message.Header.Set(field.NewMsgType(enum.MsgType_ORDER_MASS_CANCEL_REQUEST))
message.Body.Set(field.NewClOrdID(optionOrderID))
message.Body.Set(field.NewMassCancelRequestType(enum.MassCancelRequestType_CANCEL_ORDERS_FOR_A_SECURITY))
message.Body.Set(field.NewTransactTime(time.Now()))
message.Body.Set(field.NewSide(eside))
message.Body.Set(field.NewSymbol(optionOrderSymbol))

return message, nil

default:
return nil, errors.FixVersionNotImplemented
}

default:
return nil, errors.FixVersionNotImplemented
}
}

func processReponse(app *application.CancelOrder, msg *quickfix.Message) error {
msgType := field.MsgTypeField{}
text := field.TextField{}
Expand Down Expand Up @@ -237,6 +273,7 @@ func processReponse(app *application.CancelOrder, msg *quickfix.Message) error {
if msgType.Value() == enum.MsgType_REJECT || msgType.Value() == enum.MsgType_BUSINESS_MESSAGE_REJECT {
return makeError(errors.FixOrderRejected)
}

if msgType.Value() == enum.MsgType_ORDER_MASS_CANCEL_REPORT {
app.WriteMessageBodyAsTable(os.Stdout, msg)
resp := field.MassCancelResponseField{}
Expand All @@ -249,33 +286,6 @@ func processReponse(app *application.CancelOrder, msg *quickfix.Message) error {
} else {
return quickfix.InvalidMessageType()
}
return nil
}

func buildMessage(session config.Session) (quickfix.Messagable, error) {
eside, err := dict.OrderSideStringToEnum(optionOrderSide)
if err != nil {
return nil, err
}

switch session.BeginString {
case quickfix.BeginStringFIXT11:
switch session.DefaultApplVerID {
case "FIX.5.0SP2":
message := quickfix.NewMessage()
message.Header.Set(field.NewMsgType(enum.MsgType_ORDER_MASS_CANCEL_REQUEST))
message.Body.Set(field.NewClOrdID(optionOrderSymbol + "_CANCELREQ"))
message.Body.Set(field.NewMassCancelRequestType(enum.MassCancelRequestType_CANCEL_ORDERS_FOR_A_SECURITY))
message.Body.Set(field.NewTransactTime(time.Now()))
message.Body.Set(field.NewSide(eside))
message.Body.Set(field.NewSymbol(optionOrderSymbol))
return message, nil

default:
return nil, errors.FixVersionNotImplemented
}

default:
return nil, errors.FixVersionNotImplemented
}
return nil
}
73 changes: 36 additions & 37 deletions cmd/cancel/order/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"os"
"os/signal"
"strconv"
"strings"
"syscall"
"time"
Expand All @@ -28,7 +27,7 @@ import (
var (
optionOrderSide string
optionOrderSymbol string
optionOrderID int
optionOrderID string
optionExecReportsTimeout time.Duration
)

Expand Down Expand Up @@ -59,15 +58,15 @@ var CancelOrderCmd = &cobra.Command{
}

func init() {
CancelOrderCmd.Flags().StringVar(&optionOrderID, "id", "", "Order id")
CancelOrderCmd.Flags().StringVar(&optionOrderSide, "side", "", "Order side (buy, sell ... etc)")
CancelOrderCmd.Flags().StringVar(&optionOrderSymbol, "symbol", "", "Order symbol")
CancelOrderCmd.Flags().IntVar(&optionOrderID, "id", -1, "Order id (returned in ExecutionReport.OrderID)")

CancelOrderCmd.Flags().DurationVar(&optionExecReportsTimeout, "exec-reports-timeout", 5*time.Second, "Log out if execution reports not received within timeout (0s wait indefinitely)")

CancelOrderCmd.MarkFlagRequired("id")
CancelOrderCmd.MarkFlagRequired("side")
CancelOrderCmd.MarkFlagRequired("symbol")
CancelOrderCmd.MarkFlagRequired("id")

CancelOrderCmd.RegisterFlagCompletionFunc("side", complete.OrderSide)
}
Expand Down Expand Up @@ -195,7 +194,6 @@ LOOP:

case msg, ok := <-app.FromAppMessages:
if !ok {
logger.Error().Msg("Bad FIX application message received")
break LOOP
}

Expand All @@ -212,6 +210,37 @@ LOOP:
return nil
}

func buildMessage(session config.Session) (quickfix.Messagable, error) {
eside, err := dict.OrderSideStringToEnum(optionOrderSide)
if err != nil {
return nil, err
}

switch session.BeginString {
case quickfix.BeginStringFIXT11:
switch session.DefaultApplVerID {
case "FIX.5.0SP2":
message := quickfix.NewMessage()
message.Header.Set(field.NewMsgType(enum.MsgType_ORDER_CANCEL_REQUEST))
message.Body.Set(field.NewClOrdID(optionOrderID))
message.Body.Set(field.NewSide(eside))
message.Body.Set(field.NewTransactTime(time.Now()))
message.Body.Set(field.NewOrderID(optionOrderID))
message.Body.Set(field.NewOrigClOrdID(optionOrderID))
message.Body.Set(field.NewSymbol(optionOrderSymbol))

return message, nil

default:
return nil, errors.FixVersionNotImplemented
}

default:
return nil, errors.FixVersionNotImplemented
}

}

func processReponse(app *application.CancelOrder, msg *quickfix.Message) error {
msgType := field.MsgTypeField{}
text := field.TextField{}
Expand Down Expand Up @@ -240,10 +269,12 @@ func processReponse(app *application.CancelOrder, msg *quickfix.Message) error {
if msgType.Value() == enum.MsgType_REJECT || msgType.Value() == enum.MsgType_BUSINESS_MESSAGE_REJECT {
return makeError(errors.FixOrderRejected)
}

if msgType.Value() == enum.MsgType_ORDER_CANCEL_REJECT {
app.WriteMessageBodyAsTable(os.Stdout, msg)
return makeError(errors.FixOrderRejected)
}

if msgType.Value() == enum.MsgType_EXECUTION_REPORT {
app.WriteMessageBodyAsTable(os.Stdout, msg)
ordStatus := field.OrdStatusField{}
Expand All @@ -259,35 +290,3 @@ func processReponse(app *application.CancelOrder, msg *quickfix.Message) error {

return nil
}

func buildMessage(session config.Session) (quickfix.Messagable, error) {
eside, err := dict.OrderSideStringToEnum(optionOrderSide)
if err != nil {
return nil, err
}

orderId := strconv.Itoa(optionOrderID)

switch session.BeginString {
case quickfix.BeginStringFIXT11:
switch session.DefaultApplVerID {
case "FIX.5.0SP2":
message := quickfix.NewMessage()
message.Header.Set(field.NewMsgType(enum.MsgType_ORDER_CANCEL_REQUEST))
message.Body.Set(field.NewClOrdID(orderId + "_CANCEL"))
message.Body.Set(field.NewSide(eside))
message.Body.Set(field.NewTransactTime(time.Now()))
message.Body.Set(field.NewOrderID(orderId))
message.Body.Set(field.NewOrigClOrdID(orderId))
message.Body.Set(field.NewSymbol(optionOrderSymbol))
return message, nil

default:
return nil, errors.FixVersionNotImplemented
}

default:
return nil, errors.FixVersionNotImplemented
}

}
2 changes: 1 addition & 1 deletion cmd/new/order/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,11 @@ var NewOrderCmd = &cobra.Command{
}

func init() {
NewOrderCmd.Flags().StringVar(&optionOrderID, "id", "", "Order id (uuid autogenerated if not given)")
NewOrderCmd.Flags().StringVar(&optionOrderSide, "side", "", "Order side (buy, sell ... etc)")
NewOrderCmd.Flags().StringVar(&optionOrderType, "type", "", "Order type (market, limit, stop ... etc)")
NewOrderCmd.Flags().StringVar(&optionOrderSymbol, "symbol", "", "Order symbol")
NewOrderCmd.Flags().Int64Var(&optionOrderQuantity, "quantity", 1, "Order quantity")
NewOrderCmd.Flags().StringVar(&optionOrderID, "id", "", "Order id (uuid autogenerated if not given)")
NewOrderCmd.Flags().StringVar(&optionOrderExpiry, "expiry", "day", "Order expiry (day, good_till_cancel ... etc)")
NewOrderCmd.Flags().Float64Var(&optionOrderPrice, "price", 0.0, "Order price")
NewOrderCmd.Flags().StringVar(&optionOrderOrigination, "origination", "", "Order origination")
Expand Down

0 comments on commit 5059101

Please sign in to comment.