fixparser
Version:
FIX.Latest / 5.0 SP2 Parser / AI Agent Trading
123 lines (112 loc) • 4.9 kB
text/typescript
import {
EncryptMethod,
FIXParser,
Field,
Fields,
// HandlInst,
LicenseManager,
MDEntryType,
MDUpdateType,
type Message,
Messages,
// OrdType,
ResetSeqNumFlag,
// Side,
SubscriptionRequestType,
// TimeInForce,
} from 'fixparser';
const initializeConnection = async () => {
const fixParser = new FIXParser({ logging: false });
const SENDER = process.env.FIXPARSER_SENDER;
const TARGET = process.env.FIXPARSER_TARGET;
// NOTE: This feature requires a FIXParser Pro license
await LicenseManager.setLicenseKey(process.env.FIXPARSER_LICENSE_KEY);
fixParser.connect({
host: '10.0.200.48', //process.env.FIXGW_SERVER,
port: 5002,
protocol: 'tcp',
sender: SENDER,
target: TARGET,
fixVersion: 'FIX.4.4',
onOpen: () => {
console.log('Open');
sendLogon();
setTimeout(() => {
sendMarketDataRequest();
}, 500);
// setInterval(() => {
// sendOrder();
// }, 10000);
},
onMessage: (message: Message) => {
const msgType = message.getField(Fields.MsgType);
const symbol = message.getField(Fields.Symbol);
if (msgType?.value === Messages.MarketDataIncrementalRefresh) {
const price = message.getField(Fields.MDEntryPx);
console.log(`${symbol?.value}: ${price?.value}`);
}
},
onClose: () => console.log('Disconnected'),
});
const sendLogon = () => {
const logon = fixParser.createMessage(
new Field(Fields.MsgType, Messages.Logon),
new Field(Fields.MsgSeqNum, fixParser.getNextTargetMsgSeqNum()),
new Field(Fields.SenderCompID, SENDER),
new Field(Fields.SendingTime, fixParser.getTimestamp()),
new Field(Fields.TargetCompID, TARGET),
new Field(Fields.ResetSeqNumFlag, ResetSeqNumFlag.Yes),
new Field(Fields.EncryptMethod, EncryptMethod.None),
new Field(Fields.HeartBtInt, 10),
);
const messages = fixParser.parse(logon.encode());
console.log('sending message', messages[0].description, messages[0].messageString);
fixParser.send(logon);
};
const sendMarketDataRequest = () => {
const mdr = fixParser.createMessage(
new Field(Fields.MsgType, Messages.MarketDataRequest),
new Field(Fields.SenderCompID, SENDER),
new Field(Fields.MsgSeqNum, fixParser.getNextTargetMsgSeqNum()),
new Field(Fields.TargetCompID, TARGET),
new Field(Fields.SendingTime, fixParser.getTimestamp()),
new Field(Fields.MDReqID, 'MDR001'),
new Field(Fields.SubscriptionRequestType, SubscriptionRequestType.SnapshotAndUpdates),
new Field(Fields.MarketDepth, 0),
new Field(Fields.MDUpdateType, MDUpdateType.FullRefresh),
new Field(Fields.NoRelatedSym, 5),
new Field(Fields.Symbol, 'AAPL'),
new Field(Fields.Symbol, 'MSFT'),
new Field(Fields.Symbol, 'GOOGL'),
new Field(Fields.Symbol, 'TSLA'),
new Field(Fields.Symbol, 'AMZN'),
new Field(Fields.NoMDEntryTypes, 2),
new Field(Fields.MDEntryType, MDEntryType.Bid),
new Field(Fields.MDEntryType, MDEntryType.Offer),
);
const messages = fixParser.parse(mdr.encode());
console.log('sending message', messages[0].description, messages[0].messageString.replace(/\x01/g, '|'));
fixParser.send(mdr);
};
// const sendOrder = () => {
// const order = fixParser.createMessage(
// new Field(Fields.MsgType, Messages.NewOrderSingle),
// new Field(Fields.MsgSeqNum, fixParser.getNextTargetMsgSeqNum()),
// new Field(Fields.SenderCompID, SENDER),
// new Field(Fields.SendingTime, fixParser.getTimestamp()),
// new Field(Fields.TargetCompID, TARGET),
// new Field(Fields.ClOrdID, '11223344'),
// new Field(Fields.HandlInst, HandlInst.AutomatedExecutionNoIntervention),
// new Field(Fields.OrderQty, '123'),
// new Field(Fields.TransactTime, fixParser.getTimestamp()),
// new Field(Fields.OrdType, OrdType.Market),
// new Field(Fields.Side, Side.Buy),
// new Field(Fields.Symbol, '700.HK'),
// new Field(Fields.TimeInForce, TimeInForce.Day),
// );
// const messages = fixParser.parse(order.encode());
// console.log('sending message', messages[0].description, messages[0].messageString.replace(/\x01/g, '|'));
// fixParser.send(order);
// };
};
initializeConnection().catch((err) => console.error('Error initializing connection:', err));