public void TestMessageWritingWrittenEvents() { byte[] data = Encoding.ASCII.GetBytes("8=FIX.4.09=28635=849=ITGHK56=KODIAK_KASFQA34=163357=kasfqa52=20091023-05:40:1637=712-217=420=039=055=649707154=238=100000032=031=0.00000014=06=0.00000011=296.2.240=160=20091023-05:40:1659=047=A30=DMA15=KRW6005=ALT=18500TOT=1256276416111=09886=0.0000009887=09912=09911=010=135"); using MemoryStream stream = new(); using Fix.Writer writer = new(stream, leaveOpen : true); int messagesWriting = 0; int messagesWritten = 0; writer.MessageWriting += (sender, ev) => ++ messagesWriting; writer.MessageWritten += (sender, ev) => ++ messagesWritten; var message = new Fix.Message(data); writer.Write(message); Assert.AreEqual(1, messagesWriting); Assert.AreEqual(1, messagesWritten); }
protected void SendFromAcceptor(Fix.Dictionary.Message definition, IEnumerable <Fix.Field> fields = null) { var message = new Fix.Message { MsgType = definition.MsgType }; if (fields != null) { foreach (Fix.Field field in fields) { message.Fields.Add(field.Tag, field.Value); } } Acceptor.Send(message); }
public void TestDataField() { string signature = Convert.ToBase64String(StringToByteArray("A1E6230EC9659598189C45304C58C1D5")); string[,] expected = { { "8", "FIX.4.0" }, { "9", "131" }, { "35", "C" }, { "49", "KODIAK" }, { "56", "server" }, { "34", "7" }, { "50", "kgehvwap" }, { "52", "20090724-07:20:41" }, { "94", "0" }, { "33", "1" }, { "58", "UserRegisterRequest#7,13,13#" }, { "93", "16" }, { "89", signature }, { "10", "147" } }; byte[] a = Encoding.ASCII.GetBytes("8=FIX.4.09=13135=C49=KODIAK56=server34=750=kgehvwap52=20090724-07:20:4194=033=158=UserRegisterRequest#7,13,13#93=1689="); byte[] b = StringToByteArray("A1E6230EC9659598189C45304C58C1D5"); byte[] c = Encoding.ASCII.GetBytes("10=147"); byte[] data = a.Concat(b).Concat(c).ToArray(); var message = new Fix.Message(data); FieldsEqual(expected, message); Assert.AreEqual(14, message.Fields.Count); Assert.AreEqual(131, message.BodyLength); Assert.AreEqual("131", message.ComputeBodyLength()); Assert.AreEqual("147", message.CheckSum); Assert.AreEqual("147", message.ComputeCheckSum()); var stream = new MemoryStream(); using (Fix.Writer writer = new(stream, leaveOpen : true)) { writer.Write(message); } byte[] serialised = stream.ToArray(); Assert.IsTrue(StructuralComparisons.StructuralEqualityComparer.Equals(data, serialised)); }
static void FieldsEqual(string[,] expected, Fix.Message message) { Assert.AreEqual(expected.Length / 2, message.Fields.Count, "Field count"); for (int index = 0; index < message.Fields.Count; ++index) { Fix.Field actual = message.Fields[index]; if (!int.TryParse(expected[index, 0], out int tag)) { Assert.Fail("Non numeric tag '{0}={1}'", expected[index, 0], expected[index, 1]); } Assert.AreEqual(tag, actual.Tag, "Tag"); Assert.AreEqual(expected[index, 1], actual.Value, "Value"); } }
public void TestNoTrailingSeparator() { string[,] expected = { { "8", "FIX.4.0" }, { "9", "286" }, { "35", "8" }, { "49", "ITGHK" }, { "56", "KODIAK_KASFQA" }, { "34", "1633" }, { "57", "kasfqa" }, { "52", "20091023-05:40:16" }, { "37", "712-2" }, { "17", "4" }, { "20", "0" }, { "39", "0" }, { "55", "6497071" }, { "54", "2" }, { "38", "1000000" }, { "32", "0" }, { "31", "0.000000" }, { "14", "0" }, { "6", "0.000000" }, { "11", "296.2.2" }, { "40", "1" }, { "60", "20091023-05:40:16" }, { "59", "0" }, { "47", "A" }, { "30", "DMA" }, { "15", "KRW" }, { "6005", "ALT=18500TOT=1256276416" }, { "111", "0" }, { "9886", "0.000000" }, { "9887", "0" }, { "9912", "0" }, { "9911", "0" }, { "10", "135" } }; byte[] data = Encoding.ASCII.GetBytes("8=FIX.4.09=28635=849=ITGHK56=KODIAK_KASFQA34=163357=kasfqa52=20091023-05:40:1637=712-217=420=039=055=649707154=238=100000032=031=0.00000014=06=0.00000011=296.2.240=160=20091023-05:40:1659=047=A30=DMA15=KRW6005=ALT=18500TOT=1256276416111=09886=0.0000009887=09912=09911=010=135"); var message = new Fix.Message(data); FieldsEqual(expected, message); }
public void TestReadKodiakOrderWave() { string[,] expected = { { "8", "FIX.4.0" }, { "9", "236" }, { "35", "UWO" }, { "49", "KODIAK" }, { "56", "server" }, { "34", "566" }, { "50", "kgehvwap" }, { "97", "N" }, { "52", "20090723-04:27:20" }, { "66", "0" }, { "68", "1" }, { "11", "kgehvwap.52.52" }, { "15", "AUD" }, { "21", "2" }, { "38", "56" }, { "40", "2" }, { "44", "39.590000" }, { "47", "A" }, { "54", "1" }, { "55", "RIO.AX" }, { "59", "3" }, { "63", "0" }, { "100", "ASX" }, { "203", "1" }, { "6000", "" }, { "6001", "test" }, { "6002", "" }, { "6005", "ALT=41.58" }, { "7050", "kgehvwap_test" }, { "10", "077" } }; byte[] data = Encoding.ASCII.GetBytes("8=FIX.4.09=23635=UWO49=KODIAK56=server34=56650=kgehvwap97=N52=20090723-04:27:2066=068=111=kgehvwap.52.5215=AUD21=238=5640=244=39.59000047=A54=155=RIO.AX59=363=0100=ASX203=16000=6001=test6002=6005=ALT=41.587050=kgehvwap_test10=077"); var message = new Fix.Message(data); FieldsEqual(expected, message); Assert.AreEqual(Fix.Dictionary.FIX_4_0.Messages.KodiakWaveOrder.MsgType, message.MsgType); }
static void TestMessageFieldAccess() { byte[] data = Encoding.ASCII.GetBytes("8=FIX.4.09=28635=849=ITGHK56=KODIAK_KASFQA34=163357=kasfqa52=20091023-05:40:1637=712-217=420=039=055=649707154=238=100000032=031=0.00000014=06=0.00000011=296.2.240=160=20091023-05:40:1659=047=A30=DMA15=KRW6005=ALT=18500TOT=1256276416111=09886=0.0000009887=09912=09911=010=135"); var message = new Fix.Message(data); int[] tags = new int[message.Fields.Count]; for (int index = 0; index < tags.Length; ++index) { tags[index] = message.Fields[index].Tag; } Console.WriteLine("length = {0}", tags.Length); var random = new Random(); for (int i = 0; i < 100000; ++i) { int tag = tags[random.Next(tags.Length)]; _ = message.Fields.Find(tag); } }
public static Fix.Dictionary.Message MessageDefinition(Fix.Message message) { Fix.Field beginString = message.Fields.Find(Fix.Dictionary.Fields.BeginString); Fix.Dictionary.Version version = null; if (beginString != null && !beginString.Value.StartsWith("FIXT.")) { version = Fix.Dictionary.Versions[beginString.Value]; } if (version == null) { version = Fix.Dictionary.Versions.Default; } Fix.Dictionary.Message exemplar = version.Messages[message.MsgType]; if (exemplar == null) { return(Fix.Dictionary.Messages[message.MsgType]); } return(exemplar); }
public void TestNameValuePairConstructor() { string[,] fields = { { "8", "FIX.4.0" }, { "9", "127" }, { "35", "C" }, { "49", "ITGHK" }, { "56", "KODIAK_KGEHVWAP" }, { "34", "4" }, { "52", "20090630-23:37:12" }, { "94", "0" }, { "33", "1" }, { "58", "RemotedHost#Name=gateQA-p01,Ip=10.132.3.125,Port=7081#" }, { "10", "128" } }; var message = new Fix.Message(fields); Assert.AreEqual("ITGHK", message.Fields.Find(49)?.Value); }
void ResendButtonClick(object?sender, EventArgs e) { if (SelectedMessage is not Fix.Message source) { return; } if (Session is null) { return; } // // Create a new copy of the message. // var message = new Fix.Message(); message.Fields.Clear(); foreach (Fix.Field field in source.Fields) { if (field.Tag == FIX_5_0SP2.Fields.ClOrdID.Tag) { message.Fields.Add(new Fix.Field(field.Tag, Session.FormatClOrdId(Session.NextClOrdId++))); } else if (field.Tag == FIX_5_0SP2.Fields.OrderID.Tag) { message.Fields.Add(new Fix.Field(field.Tag, Session.NextOrderId++)); } else if (field.Tag == FIX_5_0SP2.Fields.ExecID.Tag) { message.Fields.Add(new Fix.Field(field.Tag, Session.NextExecId++)); } else { message.Fields.Add(new Fix.Field(field.Tag, field.Value)); } } Session.Send(message); }
public void TestReadKodiakExecutionReport() { string[,] expected = { { "8", "FIX.4.0" }, { "9", "206" }, { "35", "8" }, { "49", "GEHVWAP" }, { "56", "HKGATE" }, { "128", "test" }, { "34", "220" }, { "97", "N" }, { "52", "20090723-04:27:20" }, { "6", "39.590000" }, { "11", "11" }, { "14", "100" }, { "17", "26" }, { "20", "0" }, { "30", "ASX" }, { "31", "39.590000" }, { "32", "56" }, { "37", "11" }, { "38", "100" }, { "39", "2" }, { "40", "1" }, { "44", "0.000000" }, { "54", "1" }, { "55", "RIO.AX" }, { "59", "0" }, { "60", "20090723-04:27:20" }, { "10", "130" } }; byte[] data = Encoding.ASCII.GetBytes("8=FIX.4.09=20635=849=GEHVWAP56=HKGATE128=test34=22097=N52=20090723-04:27:206=39.59000011=1114=10017=2620=030=ASX31=39.59000032=5637=1138=10039=240=144=0.00000054=155=RIO.AX59=060=20090723-04:27:2010=130"); var message = new Fix.Message(data); FieldsEqual(expected, message); //Assert.AreEqual(Fix.Dictionary.FIX_4_0.Messages.KodiakOrderWave, message.MsgType); }
public void TestConstructorAllMinimumRequirementsMet() { var message = new Fix.Message { MsgType = FIX_5_0SP2.Messages.NewOrderSingle.MsgType }; message.Fields.Set(FIX_5_0SP2.Fields.SenderCompID, "SENDER"); message.Fields.Set(FIX_5_0SP2.Fields.TargetCompID, "TARGET"); message.Fields.Set(FIX_5_0SP2.Fields.Symbol, "BHP"); message.Fields.Set(FIX_5_0SP2.Fields.ClOrdID, "1.2.3"); message.Fields.Set(FIX_5_0SP2.Fields.OrderQty, 5000); var order = new Fix.Order(message); Assert.IsNotNull(order); Assert.AreEqual("SENDER", order.SenderCompID); Assert.AreEqual("TARGET", order.TargetCompID); Assert.AreEqual("BHP", order.Symbol); Assert.AreEqual("1.2.3", order.ClOrdID); Assert.AreEqual(5000, order.OrderQty); Assert.AreEqual(1, order.Messages.Count); }
protected void SendFromInitiator(Fix.Dictionary.Message definition, IEnumerable <Fix.Field> fields = null) { var message = new Fix.Message { MsgType = definition.MsgType }; if (fields != null) { foreach (Fix.Field field in fields) { if (field.Tag == Fix.Dictionary.Fields.MsgSeqNum.Tag) { message.Fields.Set(field.Tag, field.Value); } else { message.Fields.Add(field.Tag, field.Value); } } } Initiator.Send(message); }
void UpdateUiState() { _resendButton.Enabled = false; _resendMenuItem.Enabled = false; _clearButton.Enabled = false; _clearMenuItem.Enabled = false; _exportButton.Enabled = false; _exportMenuItem.Enabled = false; _tailMessagesCheckBox.Enabled = false; _messageSearchTextBox.Enabled = false; _fieldSearchTextBox.Enabled = false; if (Session == null || Session.Messages == null || Session.Messages.Count < 1) { return; } _clearButton.Enabled = true; _clearMenuItem.Enabled = true; _exportButton.Enabled = true; _exportMenuItem.Enabled = true; _tailMessagesCheckBox.Enabled = true; _messageSearchTextBox.Enabled = true; Fix.Message message = SelectedMessage; if (message != null) { _fieldSearchTextBox.Enabled = true; if (Session.Connected && !message.Incoming) { _resendButton.Enabled = true; _resendMenuItem.Enabled = true; } } }
public void TestDataFieldWithNoPrecedingSize() { byte[] data = Encoding.ASCII.GetBytes("89=��#�e���E0LX��10=147"); _ = new Fix.Message(data); }
void RejectAllPendingOrders() { if (Session is null) { return; } foreach (DataGridViewRow row in _orderGrid.Rows) { try { var view = row.DataBoundItem as DataRowView; var orderRow = view?.Row as OrderDataRow; Fix.Order?order = orderRow?.Order; if (order is null) { continue; } if (order.OrdStatus != null) { continue; } var message = new Fix.Message { MsgType = FIX_5_0SP2.Messages.ExecutionReport.MsgType }; message.Fields.Set(FIX_5_0SP2.Fields.ClOrdID, order.ClOrdID); if (order.Side is FieldValue side) { message.Fields.Set(order.Side); } message.Fields.Set(FIX_5_0SP2.Fields.Symbol, order.Symbol); message.Fields.Set(FIX_5_0SP2.Fields.OrderQty, order.OrderQty); message.Fields.Set(FIX_5_0SP2.OrdStatus.Rejected); if (order.OrderID == null) { order.OrderID = Session.NextOrderId.ToString(); } message.Fields.Set(FIX_5_0SP2.Fields.OrderID, order.OrderID); message.Fields.Set(FIX_5_0SP2.Fields.ExecID, Session.NextExecId.ToString()); message.Fields.Set(FIX_5_0SP2.Fields.LastQty, 0); message.Fields.Set(FIX_5_0SP2.Fields.LastPx, 0); message.Fields.Set(FIX_5_0SP2.Fields.CumQty, 0); message.Fields.Set(FIX_5_0SP2.Fields.AvgPx, 0); if (Session.Version.BeginString != "FIX.4.0") { message.Fields.Set(FIX_5_0SP2.ExecType.Rejected); message.Fields.Set(FIX_5_0SP2.Fields.LeavesQty, 0); } if (Session.Version.BeginString.StartsWith("FIX.4.")) { message.Fields.Set(FIX_4_2.ExecTransType.New); } Session.Send(message); } catch (Exception ex) { MessageBox.Show(this, ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } } }
void MessageGridSelectionChanged(object sender, EventArgs e) { try { _fieldTable.BeginLoadData(); _fieldTable.Rows.Clear(); Fix.Message message = SelectedMessage; if (message == null) { return; } foreach (Fix.Field field in message.Fields) { if (_fieldTable.NewRow() is not FieldDataRow dataRow) { continue; } if (field.Definition == null) { field.Definition = Session.FieldDefinition(message, field); } dataRow.Field = field; if (field.Definition != null) { dataRow[FieldDataTable.ColumnIndent] = field.Definition.Indent; dataRow[FieldDataTable.ColumnName] = field.Definition.Name; dataRow[FieldDataTable.ColumnCustom] = false; dataRow[FieldDataTable.ColumnRequired] = field.Definition.Required; dataRow[FieldDataTable.ColumnDescription] = field.ValueDescription; } else { dataRow[FieldDataTable.ColumnCustom] = true; dataRow[FieldDataTable.ColumnRequired] = false; } dataRow[FieldDataTable.ColumnTag] = field.Tag; dataRow[FieldDataTable.ColumnValue] = field.Value; _fieldTable.Rows.Add(dataRow); } string text; using (MemoryStream stream = new()) using (Fix.Writer writer = new(stream, true)) { writer.Write(message); writer.Close(); text = Encoding.UTF8.GetString(stream.GetBuffer()); } _rawMessage.Text = text; switch (message.Status) { case Fix.MessageStatus.Error: _statusMessage.ForeColor = Color.White; _statusMessage.BackColor = Color.Red; break; case Fix.MessageStatus.Warn: _statusMessage.ForeColor = Color.Black; _statusMessage.BackColor = Color.Yellow; break; case Fix.MessageStatus.Info: _statusMessage.ForeColor = Color.White; _statusMessage.BackColor = Color.DodgerBlue; break; case Fix.MessageStatus.None: _statusMessage.ForeColor = SystemColors.ControlText; _statusMessage.BackColor = SystemColors.Control; break; } _statusMessage.Text = message.StatusMessage; MessageSelected?.Invoke(message); ApplyFieldSearch(); } finally { _fieldTable.EndLoadData(); UpdateUiState(); } }
void CancelAllOpenOrders() { if (Session is null) { return; } foreach (DataGridViewRow row in _orderGrid.Rows) { try { var view = row.DataBoundItem as DataRowView; var orderRow = view?.Row as OrderDataRow; Fix.Order?order = orderRow?.Order; if (order is null) { return; } if (order.OrdStatus == FIX_5_0SP2.OrdStatus.Canceled || order.OrdStatus == FIX_5_0SP2.OrdStatus.Rejected || order.OrdStatus == FIX_5_0SP2.OrdStatus.DoneForDay) { continue; } var message = new Fix.Message { MsgType = FIX_5_0SP2.Messages.OrderCancelRequest.MsgType }; MessagesPanel.UpdateMessage(message, order); message.Fields.Set(FIX_5_0SP2.Fields.TransactTime, Fix.Field.TimeString(Session.MillisecondTimestamps)); if (order.Side is FieldValue side) { message.Fields.Set(FIX_5_0SP2.Fields.Side, side.Value); } message.Fields.Set(FIX_5_0SP2.Fields.Symbol, order.Symbol); message.Fields.Set(FIX_5_0SP2.Fields.OrigClOrdID, order.ClOrdID); message.Fields.Set(FIX_5_0SP2.Fields.ClOrdID, Session.FormatClOrdId(Session.NextClOrdId++)); // // This field was removed from later versions. // Fix.Field?beginString = message.Fields.Find(FIX_5_0SP2.Fields.BeginString); if (beginString is not null && beginString.Value == "FIX.4.0") { message.Fields.Set(FIX_4_2.Fields.CxlType, "F"); } Session.Send(message); } catch (Exception ex) { MessageBox.Show(this, ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } } }
public void TestMsgTypeIsSetFromDefinition() { var message = new Fix.Message(FIX_5_0SP2.Messages.NewOrderSingle); Assert.AreEqual("D", message.MsgType); }
void UnsolicitedCancelAllOpenOrders() { foreach (DataGridViewRow row in _orderGrid.Rows) { try { var view = row.DataBoundItem as DataRowView; var orderRow = view.Row as OrderDataRow; Fix.Order order = orderRow.Order; if (order.OrdStatus == Fix.OrdStatus.Canceled || order.OrdStatus == Fix.OrdStatus.Rejected || order.OrdStatus == Fix.OrdStatus.DoneForDay) { continue; } var message = new Fix.Message { MsgType = Fix.Dictionary.Messages.ExecutionReport.MsgType }; message.Fields.Set(Fix.Dictionary.Fields.ClOrdID, order.ClOrdID); message.Fields.Set(Fix.Dictionary.Fields.Side, (Fix.Side)order.Side); message.Fields.Set(Fix.Dictionary.Fields.Symbol, order.Symbol); message.Fields.Set(Fix.Dictionary.Fields.OrderQty, order.OrderQty); message.Fields.Set(Fix.Dictionary.Fields.OrdStatus, Fix.OrdStatus.Canceled); if (order.OrderID == null) { order.OrderID = Session.NextOrderId.ToString(); } message.Fields.Set(Fix.Dictionary.Fields.OrderID, order.OrderID); message.Fields.Set(Fix.Dictionary.Fields.ExecID, Session.NextExecId.ToString()); message.Fields.Set(Fix.Dictionary.Fields.LastQty, 0); message.Fields.Set(Fix.Dictionary.Fields.LastPx, 0); message.Fields.Set(Fix.Dictionary.Fields.CumQty, order.OrderQty); message.Fields.Set(Fix.Dictionary.Fields.AvgPx, order.Price ?? 0); if (Session.Version.BeginString != Fix.Dictionary.Versions.FIX_4_0.BeginString) { message.Fields.Set(Fix.Dictionary.Fields.ExecType, Fix.Dictionary.FIX_4_2.ExecType.Canceled); message.Fields.Set(Fix.Dictionary.Fields.LeavesQty, 0); } if (Session.Version.BeginString.StartsWith("FIX.4.")) { message.Fields.Set(Fix.Dictionary.FIX_4_0.Fields.ExecTransType, Fix.Dictionary.FIX_4_0.ExecTransType.New); } Session.Send(message); } catch (Exception ex) { MessageBox.Show(this, ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } } }
void ClientMessageGridGridSelectionChanged(object sender, EventArgs e) { try { _fieldTable.BeginLoadData(); _fieldTable.Clear(); Fix.Message message = SelectedMessage; if (message == null) { return; } switch (message.Status) { case Fix.MessageStatus.Error: _statusMessage.ForeColor = Color.White; _statusMessage.BackColor = Color.Red; break; case Fix.MessageStatus.Warn: _statusMessage.ForeColor = Color.Black; _statusMessage.BackColor = Color.Yellow; break; case Fix.MessageStatus.Info: _statusMessage.ForeColor = Color.White; _statusMessage.BackColor = Color.DodgerBlue; break; case Fix.MessageStatus.None: _statusMessage.ForeColor = SystemColors.ControlText; _statusMessage.BackColor = SystemColors.Control; break; } _statusMessage.Text = message.StatusMessage; foreach (Fix.Field field in message.Fields) { if (_fieldTable.NewRow() is not FieldDataRow dataRow) { continue; } if (field.Definition == null && message.Definition != null) { field.Definition = FieldDefinition(message.Definition, field); } dataRow.Field = field; if (field.Definition != null) { dataRow[FieldDataTable.ColumnIndent] = field.Definition.Indent; dataRow[FieldDataTable.ColumnName] = field.Definition.Name; dataRow[FieldDataTable.ColumnCustom] = false; dataRow[FieldDataTable.ColumnRequired] = field.Definition.Required; dataRow[FieldDataTable.ColumnDescription] = field.ValueDescription; } else { dataRow[FieldDataTable.ColumnCustom] = true; dataRow[FieldDataTable.ColumnRequired] = false; } dataRow[FieldDataTable.ColumnTag] = field.Tag; dataRow[FieldDataTable.ColumnValue] = field.Value; _fieldTable.Rows.Add(dataRow); } } finally { _fieldTable.EndLoadData(); } }
public void TestDataFieldWithNoTrailingSeparator() { byte[] data = Encoding.ASCII.GetBytes("8=FIX.4.09=13135=C49=KODIAK56=server34=750=kgehvwap52=20090724-07:20:4194=033=158=UserRegisterRequest#7,13,13#93=1689=\xA1\xE6\x23\x0E\xC9\x65\x95\x98\x18\x9C\x45\x30\x4C\x58\xC1\xD5\x31\x30=147"); _ = new Fix.Message(data); }