public static void LoadDataRow(ref DataRow destinationRow, List <KeyValuePair <FixTag, string> > fieldMap, QuickFix.Message fixMessage) { foreach (KeyValuePair <FixTag, string> fixTagToDbField in fieldMap) { FixTag currentTag = fixTagToDbField.Key; string valueColumn = fixTagToDbField.Value; string value; if (fixMessage.isSetField((int)currentTag)) { value = fixMessage.getField((int)currentTag); if (string.IsNullOrEmpty(destinationRow[valueColumn] as string)) { if ((int)currentTag == (int)FixTag.MaturityMonthYear) { destinationRow[valueColumn] = FixFieldValueConverter.FormatMaturityDate(value, FixFieldValueConverter.TryGetFixValue(FixTag.MaturityDay, fixMessage)); } else { destinationRow[valueColumn] = FixFieldValueConverter.Instance[currentTag, value, valueColumn.Contains("DATE")]; } } } else if (fixMessage.getHeader().isSetField((int)currentTag)) { value = fixMessage.getHeader().getField((int)currentTag); if (string.IsNullOrEmpty(destinationRow[valueColumn] as string)) { destinationRow[valueColumn] = FixFieldValueConverter.Instance[currentTag, value, valueColumn.Contains("DATE")]; } } } }
public override string ProcMarketOrder(ref bool comp, string symbol, string price, int qty) { QuickFix.Message sno = generateOrderMessage(symbol, price, qty, false); if (sno == null) { return(string.Empty); } return(SendMessageToSession(sno) ? sno.getField((int)EFixTags.ClOrdID) : string.Empty); }
public static string TryGetFixValue(FixTag tag, QuickFix.Message fixMsg) { string value = string.Empty; if (fixMsg.isSetField((int)tag)) { value = fixMsg.getField((int)tag); } return(value); }
/// <summary> /// submit an order to IB using a incomming FIX new order single /// </summary> /// <param name="myMsg"></param> private void submitOrder(KaiTrade.Interfaces.IMessage myMsg) { QuickFix.Message myQFOrder = null; try { // Extract the raw FIX Message from the inbound message string strOrder = myMsg.Data; // Use QuickFix to handle the message myQFOrder = new QuickFix.Message(strOrder); // Use product manager to validate the product specified on // the order exists for this adapter // Get the product associated with the FIX message //QuickFix.Symbol symbol = new QuickFix.Symbol(); //myQFOrder.getField(symbol); QuickFix.Side mySide = new QuickFix.Side(); QuickFix.OrdType myOrdType = new QuickFix.OrdType(); QuickFix.OrderQty myOrderQty = new QuickFix.OrderQty(); QuickFix.Price myPrice = new QuickFix.Price(); QuickFix.StopPx myStopPx = new QuickFix.StopPx(); QuickFix.Account myAccount = new QuickFix.Account(); QuickFix.ClOrdID myClOrdID = new QuickFix.ClOrdID(); QuickFix.TimeInForce myTimeInForce = new QuickFix.TimeInForce(); // the account code is mandatory if (myQFOrder.isSetField(myAccount)) { myQFOrder.getField(myAccount); } else { this.SendAdvisoryMessage("IB TWS: you need to provide a valid account"); throw new Exception("IB TWS: you need to provide a valid account"); } myQFOrder.getField(myClOrdID); // Get the Order type myQFOrder.getField(myOrdType); // Get the QTY myQFOrder.getField(myOrderQty); // get the Side of the order myQFOrder.getField(mySide); // Set order duration myQFOrder.getField(myTimeInForce); // Prices if (myQFOrder.isSetField(myPrice)) { myQFOrder.getField(myPrice); } if (myQFOrder.isSetField(myStopPx)) { myQFOrder.getField(myStopPx); } // get the contract TWSLib.IContract myContract = getIBContract(myQFOrder); if (myContract == null) { this.SendAdvisoryMessage("IB TWS: cannot find a valid contract"); throw new Exception("IB TWS: cannot find a valid contract"); } // create an IB Order TWSLib.IOrder myIBOrder = m_Host.TWS.createOrder(); myIBOrder.whatIf = 0; myIBOrder.account = myAccount.getValue(); if(myOrdType.getValue() == QuickFix.OrdType.LIMIT) { myIBOrder.orderType = "LMT"; myIBOrder.lmtPrice = myPrice.getValue(); } else if(myOrdType.getValue() == QuickFix.OrdType.MARKET) { myIBOrder.orderType = "MKT"; } else if (myOrdType.getValue() == QuickFix.OrdType.STOP) { myIBOrder.orderType = "STP"; myIBOrder.auxPrice = myStopPx.getValue(); if (myPrice.getValue() == -1) { myIBOrder.lmtPrice = myStopPx.getValue(); } else { myIBOrder.lmtPrice = myPrice.getValue(); } } else if (myOrdType.getValue() == QuickFix.OrdType.STOP_LIMIT) { myIBOrder.orderType = "STP"; myIBOrder.auxPrice = myStopPx.getValue(); if (myPrice.getValue() == -1) { myIBOrder.lmtPrice = myStopPx.getValue(); } else { myIBOrder.lmtPrice = myPrice.getValue(); } } else { this.SendAdvisoryMessage("IB TWS: order type not supported"); throw new Exception("IB TWS: order type not supported"); } myIBOrder.totalQuantity = (int) myOrderQty.getValue(); // Side string myAction = KaiUtil.QFUtils.DecodeSide(mySide).ToUpper(); myIBOrder.action = myAction; // Time in force string myTIF = KaiUtil.QFUtils.DecodeTimeInForce(myTimeInForce).ToUpper(); myIBOrder.timeInForce = myTIF; if (myOrdType.getValue() == QuickFix.OrdType.LIMIT) { myIBOrder.lmtPrice = myPrice.getValue(); } DriverBase.OrderContext myCntx = RecordOrderContext(myClOrdID.getValue(), myQFOrder, null, m_NextID.ToString()); SetContextCommand(myCntx, DriverBase.ORCommand.Undefined, DriverBase.ORCommand.Submit); myCntx.OrderQty = myIBOrder.totalQuantity; myCntx.CumQty = 0; m_Host.TWS.placeOrderEx(m_NextID++, myContract, myIBOrder); } catch (Exception myE) { _log.Error("submitOrder", myE); // To provide the end user with more information // send an advisory message, again this is optional // and depends on the adpater this.SendAdvisoryMessage("IB TWS:submitOrder: problem submitting order:" + myE.ToString()); QuickFix.OrdStatus myOrdStatus; QuickFix.ExecType myExecType = new QuickFix.ExecType(QuickFix.ExecType.REJECTED); myOrdStatus = new QuickFix.OrdStatus(QuickFix.OrdStatus.REJECTED); QuickFix.OrderQty orderQty = new QuickFix.OrderQty(); if (myQFOrder != null) { myQFOrder.getField(orderQty); QuickFix.OrdRejReason myRejReason = new QuickFix.OrdRejReason(QuickFix.OrdRejReason.OTHER); sendExecReport(myQFOrder, new QuickFix.OrderID("UNKNOWN"), myOrdStatus, myExecType, 0.0, (int)orderQty.getValue(), 0, 0, 0, myE.Message, myRejReason); } } }
/// <summary> /// Handle an incomming execution report /// </summary> /// <param name="myMsg"></param> public void HandleExecReport(KaiTrade.Interfaces.Message myMsg) { try { if (m_Log.IsInfoEnabled) { m_Log.Info("OrderService:HandleExecReport:" + myMsg.Data); } if (m_ORLog.IsInfoEnabled) { m_ORLog.Info("OrderService:HandleExecReport:" + myMsg.Data); } // Get order manager KaiTrade.Interfaces.OrderManager myOM = KTAFacade.Instance().Factory.GetOrderManager(); //Create a quickfix message object QuickFix.Message myFixMsg = new QuickFix.Message(myMsg.Data); QuickFix.ExecID myExecID = new QuickFix.ExecID(); myFixMsg.getField(myExecID); // check if we have already processed this report if (!myOM.RecordExecutionReport(myExecID.getValue(), myFixMsg)) { // we have processed this already m_Log.Warn("HandleExecReport: Duplicate Exec Report:" + myMsg.Data); return; } // these fields must be present QuickFix.OrderID myOrderID = new QuickFix.OrderID(); myFixMsg.getField(myOrderID); QuickFix.ExecType myExecType = new QuickFix.ExecType(); myFixMsg.getField(myExecType); QuickFix.OrdStatus myOrdStatus = new QuickFix.OrdStatus(); myFixMsg.getField(myOrdStatus); // we need the clordid to update an existing order - if // it is not present or unknow we create a synthetic order QuickFix.ClOrdID myClOrdID = new QuickFix.ClOrdID(); KaiTrade.Interfaces.Order myOrder = null; if (myFixMsg.isSetField(myClOrdID)) { myFixMsg.getField(myClOrdID); myOrder = myOM.GetOrderWithClOrdIDID(myClOrdID.getValue()); } if (myOrder == null) { myOrder = CreateSyntheticOrder(myFixMsg); } // add the ExecRep to the Order KaiTrade.Interfaces.Fill myFill = new K2DataObjects.FillData(); myFill.OrderID = myOrder.Identity; myFill.SetUpFromFixExecReport(myFixMsg.ToString()); myOrder.FillsList.Add(myFill); // update mandatory fields myOrder.OrderID = myOrderID; myOrder.OrdStatus = myOrdStatus; QuickFix.Text myText = new QuickFix.Text(); if (myFixMsg.isSetField(myText)) { myFixMsg.getField(myText); myOrder.Text = myText.getValue(); } QuickFix.Account myAccount = new QuickFix.Account(); if (myFixMsg.isSetField(myAccount)) { myFixMsg.getField(myAccount); myOrder.Account = myAccount; } // process the execution depanding on type of ExecReport switch (myExecType.getValue()) { case QuickFix.ExecType.NEW: processGeneralExecRep(ref myOrder, myFixMsg); /* if (order.LastOrderCommand == KaiTrade.Interfaces.LastOrderCommand.neworder) { order.LastOrderCommand = KaiTrade.Interfaces.LastOrderCommand.none; } else { m_Log.Error("HandleExecReport:OrderStatus new not expected"); } * */ break; case QuickFix.ExecType.FILL: if (order.LastOrderCommand == KaiTrade.Interfaces.LastOrderCommand.neworder) { order.LastOrderCommand = KaiTrade.Interfaces.LastOrderCommand.none; } processFill(ref myOrder, myFixMsg); break; case QuickFix.ExecType.PARTIAL_FILL: if (order.LastOrderCommand == KaiTrade.Interfaces.LastOrderCommand.neworder) { order.LastOrderCommand = KaiTrade.Interfaces.LastOrderCommand.none; } processFill(ref myOrder, myFixMsg); break; case QuickFix.ExecType.ORDER_STATUS: processGeneralExecRep(ref myOrder, myFixMsg); break; default: processGeneralExecRep(ref myOrder, myFixMsg); break; } myOM.SetChanged(myOrder.Identity); // Check if the order is part of a strategy if (myOrder.ParentIdentity != null) { // get the strategy concerned KaiTrade.Interfaces.IStrategy myStrat = KTAFacade.Instance().Factory.GetStrategyManager().GetStrategy(myOrder.ParentIdentity); if (myStrat != null) { myStrat.HandleExecReport(myFixMsg, myOrder); } else { m_Log.Error("Strategy not found for:" + myOrder.ParentIdentity); } } if (myOrder.OCAGroupName.Length > 0) { KTAFacade.Instance().Factory.GetOCOManager().OnOrderTraded(myOrder); } if (m_ORLog.IsInfoEnabled) { m_ORLog.Info("OrderService:HandleExecRep:Exit:" + myOrder.ToString()); } } catch (Exception myE) { m_Log.Error("HandleExecReport", myE); } }