/// <summary> /// Creates a FIX4.4 NewOrderSingle message for Forexware /// </summary> /// <param name="order"></param> /// <returns></returns> public QuickFix.FIX44.NewOrderSingle NewOrderSingle(Order order) { var newOrderSingle = new QuickFix.FIX44.NewOrderSingle(); var clOrdId = new QuickFix.Fields.ClOrdID(order.OrderID); newOrderSingle.SetField(clOrdId); var handlInst = new QuickFix.Fields.HandlInst(HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE); newOrderSingle.SetField(handlInst); //set order side if (order.OrderSide == Constants.OrderSide.BUY) { newOrderSingle.Set(new Side(Side.BUY)); } else if (order.OrderSide == Constants.OrderSide.SELL) { newOrderSingle.Set(new Side(Side.SELL)); } var symbol = new QuickFix.Fields.Symbol(order.Security.Symbol); newOrderSingle.SetField(symbol); var transactTime = new QuickFix.Fields.TransactTime(order.OrderDateTime); newOrderSingle.SetField(transactTime); var orderQty = new QuickFix.Fields.OrderQty(order.OrderSize); newOrderSingle.SetField(orderQty); //limit, market and stop orders are supported. if (order.GetType() == typeof(LimitOrder)) { newOrderSingle.Set(new OrdType(OrdType.LIMIT)); newOrderSingle.Set(new Price(((LimitOrder)order).LimitPrice)); } else if (order.GetType() == typeof(MarketOrder)) { newOrderSingle.Set(new OrdType(OrdType.MARKET)); } else if (order.GetType() == typeof(StopOrder)) { newOrderSingle.Set(new OrdType(OrdType.STOP)); // set StopPX field // TODO: add StopPx field } var account = new QuickFix.Fields.Account(_account); newOrderSingle.SetField(account); if (order.GetType() == typeof(LimitOrder) || order.GetType() == typeof(StopOrder)) { var tif = new QuickFix.Fields.TimeInForce(FixCommon.Converter.ConvertTif.GetFixValue(order.OrderTif)); newOrderSingle.SetField(tif); } return(newOrderSingle); }
/// <summary> /// Creates a FIX4.4 NewOrderSingle message for Fxcm /// </summary> /// <param name="order"></param> /// <returns></returns> public QuickFix.FIX44.NewOrderSingle NewOrderSingle(Order order) { var newOrderSingle = new QuickFix.FIX44.NewOrderSingle(); var clOrdId = new QuickFix.Fields.ClOrdID(order.OrderID); newOrderSingle.SetField(clOrdId); var account = new QuickFix.Fields.Account(_account); newOrderSingle.SetField(account); //var noTradingSession = new QuickFix.Fields.NoTradingSessions(1); //newOrderSingle.SetField(noTradingSession); // Create a new Trading Session Group QuickFix.FIX44.NewOrderSingle.NoTradingSessionsGroup noTradingSession = new QuickFix.FIX44.NewOrderSingle.NoTradingSessionsGroup(); { var tradingSessionId = new QuickFix.Fields.TradingSessionID(_tradeTargetCompId); noTradingSession.SetField(tradingSessionId); var tradingSessionSubId = new QuickFix.Fields.TradingSessionSubID(_tradeTargetSubId); noTradingSession.SetField(tradingSessionSubId); newOrderSingle.AddGroup(noTradingSession); } var securityType = new QuickFix.Fields.SecurityType(FixCommon.Constants.SecurityType.ForeignExchangeContract); newOrderSingle.SetField(securityType); var symbol = new QuickFix.Fields.Symbol(order.Security.Symbol); newOrderSingle.SetField(symbol); var product = new QuickFix.Fields.Product(FixCommon.Constants.Product.Currency); newOrderSingle.SetField(product); //set order side if (order.OrderSide == Constants.OrderSide.BUY) { newOrderSingle.Set(new Side(Side.BUY)); } else if (order.OrderSide == Constants.OrderSide.SELL) { newOrderSingle.Set(new Side(Side.SELL)); } var transactTime = new QuickFix.Fields.TransactTime(order.OrderDateTime); newOrderSingle.SetField(transactTime); var orderQty = new QuickFix.Fields.OrderQty(order.OrderSize); newOrderSingle.SetField(orderQty); //var minQty = new QuickFix.Fields.MinQty(order.OrderSize); //newOrderSingle.SetField(minQty); //only limit and market orders are supported. if (order.GetType() == typeof(LimitOrder)) { newOrderSingle.Set(new OrdType(OrdType.LIMIT)); newOrderSingle.Set(new Price(((LimitOrder)order).LimitPrice)); var tif = new QuickFix.Fields.TimeInForce(FixCommon.Converter.ConvertTif.GetFixValue(order.OrderTif)); newOrderSingle.SetField(tif); } else if (order.GetType() == typeof(MarketOrder)) { newOrderSingle.Set(new OrdType(OrdType.MARKET)); } //var maxShow = new QuickFix.Fields.MaxShow(order.OrderSize); //newOrderSingle.SetField(maxShow); //var execInst = new QuickFix.Fields.ExecInst(ExecInst.BEST_EXECUTION); //newOrderSingle.SetField(execInst); var currency = new QuickFix.Fields.Currency(order.OrderCurrency); newOrderSingle.SetField(currency); //var handlInst = new QuickFix.Fields.HandlInst(HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE); //newOrderSingle.SetField(handlInst); return(newOrderSingle); }
public bool EnviarOrdem(OrdemInfo ordem, long ini = 0, long fim = 0, int delay = 0, string mnemonic = "") { //Cria a mensagem FIX de NewOrderSingle QuickFix.FIX44.NewOrderSingle ordersingle = new QuickFix.FIX44.NewOrderSingle(); if (ordem.Account > 0) { ordersingle.Set(new Account(ordem.Account.ToString())); } if (!string.IsNullOrEmpty(mnemonic)) { ordersingle.SetField(new Account(mnemonic), true); } // Instrument Identification Block ordersingle.Set(new Symbol(ordem.Symbol)); if (!string.IsNullOrEmpty(ordem.SecurityID)) { ordersingle.Set(new SecurityID(ordem.SecurityID)); } ordersingle.Set(new SecurityIDSource(SecurityIDSource.EXCHANGE_SYMBOL)); //long clOrd =0; ordersingle.Set(new ClOrdID(ordem.ClOrdID)); if (ordem.Side == OrdemDirecaoEnum.Venda) { ordersingle.Set(new Side(Side.SELL)); } else { ordersingle.Set(new Side(Side.BUY)); } TimeInForce tif = FixMessageUtilities.deOrdemValidadeParaTimeInForce(ordem.TimeInForce); if (tif != null) { ordersingle.Set(tif); } ordersingle.Set(new OrderQty(ordem.OrderQty)); if (ordem.TimeInForce == OrdemValidadeEnum.ValidoAteDeterminadaData) { DateTime expiredate = Convert.ToDateTime(ordem.ExpireDate); ordersingle.Set(new ExpireDate(expiredate.ToString("yyyyMMdd"))); } OrdType ordType = FixMessageUtilities.deOrdemTipoParaOrdType(ordem.OrdType); if (ordType != null) { ordersingle.Set(ordType); } // Verifica envio do preco switch (ordem.OrdType) { case OrdemTipoEnum.Limitada: case OrdemTipoEnum.MarketWithLeftOverLimit: ordersingle.Set(new Price(Convert.ToDecimal(ordem.Price))); break; case OrdemTipoEnum.StopLimitada: case OrdemTipoEnum.StopStart: ordersingle.Set(new Price(Convert.ToDecimal(ordem.Price))); ordersingle.Set(new StopPx(Convert.ToDecimal(ordem.StopPrice))); break; case OrdemTipoEnum.Mercado: case OrdemTipoEnum.OnClose: break; default: ordersingle.Set(new Price(Convert.ToDecimal(ordem.Price))); break; } ordersingle.Set(new TransactTime(DateTime.Now)); ordersingle.Set(new HandlInst('1')); if (ordem.MaxFloor > 0) { ordersingle.Set(new MaxFloor(Convert.ToDecimal(ordem.MaxFloor))); } if (ordem.MinQty > 0) { ordersingle.Set(new MinQty(Convert.ToDecimal(ordem.MinQty))); } // Cliente QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup1 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); //PartyIDGroup1.set(new PartyID(ordem.Account.ToString())); PartyIDGroup1.Set(new PartyID(ordem.ExecBroker)); PartyIDGroup1.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup1.Set(new PartyRole(PartyRole.ENTERING_TRADER)); // Corretora QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup2 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup2.Set(new PartyID("227")); PartyIDGroup2.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup2.Set(new PartyRole(PartyRole.ENTERING_FIRM)); // Location ID QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup3 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); if (ordem.SenderLocation != null && ordem.SenderLocation.Length > 0) { PartyIDGroup3.Set(new PartyID(ordem.SenderLocation)); } else { PartyIDGroup3.Set(new PartyID("GRA")); } PartyIDGroup3.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup3.Set(new PartyRole(PartyRole.SENDER_LOCATION)); // Corretora QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup4 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup4.Set(new PartyID("245427")); PartyIDGroup4.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup4.Set(new PartyRole(PartyRole.ENTERING_FIRM)); ordersingle.AddGroup(PartyIDGroup1); ordersingle.AddGroup(PartyIDGroup2); ordersingle.AddGroup(PartyIDGroup3); //ordersingle.AddGroup(PartyIDGroup4); //BEI - 2012-Nov-13 if (ordem.ForeignFirm != null && ordem.ForeignFirm.Length > 0) { QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup5 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup5.Set(new PartyID(ordem.ForeignFirm)); PartyIDGroup5.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup5.Set(new PartyRole(PartyRole.FOREIGN_FIRM)); ordersingle.AddGroup(PartyIDGroup5); } //SelfTradeProtection - 2012-Nov-27 if (ordem.InvestorID != null && ordem.InvestorID.Length > 0) { QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup6 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup6.Set(new PartyID(ordem.InvestorID)); PartyIDGroup6.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup6.Set(new PartyRole(PartyRole.INVESTOR_ID)); ordersingle.AddGroup(PartyIDGroup6); } if (ordem.ExecutingTrader != null && ordem.ExecutingTrader.Length > 0) { QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup7 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup7.Set(new PartyID(ordem.ExecutingTrader)); PartyIDGroup7.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup7.Set(new PartyRole(PartyRole.EXECUTING_TRADER)); ordersingle.AddGroup(PartyIDGroup7); } //if (ordem.Account > 0) //{ // QuickFix.FIX44.NewOrderSingle.NoAllocsGroup noAllocsGrp = new QuickFix.FIX44.NewOrderSingle.NoAllocsGroup(); // noAllocsGrp.Set(new AllocAccount(ordem.Account.ToString())); // noAllocsGrp.Set(new AllocAcctIDSource(99)); // ordersingle.AddGroup(noAllocsGrp); //} if (ordem.PositionEffect != null && ordem.PositionEffect.Equals("C")) { ordersingle.Set(new PositionEffect('C')); } // Memo Field if (ordem.Memo5149 != null && ordem.Memo5149.Length > 0) { if (ordem.Memo5149.Length > 50) { ordem.Memo5149 = ordem.Memo5149.Substring(0, 50); } StringField memo5149 = new StringField(5149, ordem.Memo5149); ordersingle.SetField(memo5149); } // AccountType if (ordem.AcountType == ContaTipoEnum.REMOVE_ACCOUNT_INFORMATION) { IntField int581 = new IntField(581, 38); ordersingle.SetField(int581); } else if (ordem.AcountType == ContaTipoEnum.GIVE_UP_LINK_IDENTIFIER) { IntField int581 = new IntField(581, 40); ordersingle.SetField(int581); } bool bRet = false; if (ini == 0) { bRet = Session.SendToTarget(ordersingle, _session.SessionID); } else { //_times = times; //Thread th = new Thread(new ParameterizedThreadStart(ExecOrders)); //th.Start(ordersingle); long times = fim - ini; logger.Info("=====================================> INICIO ========> Qtd: " + times); for (long i = 0; i < times; i++) { //logger.Info("XXX: " + i); ClOrdID xx = new ClOrdID(ini.ToString()); ordersingle.ClOrdID = xx; bRet = Session.SendToTarget(ordersingle, _session.SessionID); if (!bRet) { logger.Info("erro"); break; } if (0 != delay) { Thread.Sleep(delay); } ini++; //System.Windows.Forms.Application.DoEvents(); } logger.Info("=====================================> FIM ========> Qtd: " + times); } return(bRet); }
public bool EnviarOrdem(OrdemInfo ordem) { //Cria a mensagem FIX de NewOrderSingle QuickFix.FIX44.NewOrderSingle ordersingle = new QuickFix.FIX44.NewOrderSingle(); if (ordem.Account > 0) { ordersingle.Set(new Account(ordem.Account.ToString())); } // Instrument Identification Block ordersingle.Set(new Symbol(ordem.Symbol)); ordersingle.Set(new SecurityID(ordem.SecurityID)); ordersingle.Set(new SecurityIDSource(SecurityIDSource.EXCHANGE_SYMBOL)); ordersingle.Set(new ClOrdID(ordem.ClOrdID)); if (ordem.Side == OrdemDirecaoEnum.Venda) { ordersingle.Set(new Side(Side.SELL)); } else { ordersingle.Set(new Side(Side.BUY)); } TimeInForce tif = FixMessageUtilities.deOrdemValidadeParaTimeInForce(ordem.TimeInForce); if (tif != null) { ordersingle.Set(tif); } ordersingle.Set(new OrderQty(ordem.OrderQty)); if (ordem.TimeInForce == OrdemValidadeEnum.ValidoAteDeterminadaData) { DateTime expiredate = Convert.ToDateTime(ordem.ExpireDate); ordersingle.Set(new ExpireDate(expiredate.ToString("yyyyMMdd"))); } OrdType ordType = FixMessageUtilities.deOrdemTipoParaOrdType(ordem.OrdType); if (ordType != null) { ordersingle.Set(ordType); } // Verifica envio do preco switch (ordem.OrdType) { case OrdemTipoEnum.Limitada: case OrdemTipoEnum.MarketWithLeftOverLimit: ordersingle.Set(new Price(Convert.ToDecimal(ordem.Price))); break; case OrdemTipoEnum.StopLimitada: case OrdemTipoEnum.StopStart: ordersingle.Set(new Price(Convert.ToDecimal(ordem.Price))); ordersingle.Set(new StopPx(Convert.ToDecimal(ordem.StopPrice))); break; case OrdemTipoEnum.Mercado: case OrdemTipoEnum.OnClose: break; default: ordersingle.Set(new Price(Convert.ToDecimal(ordem.Price))); break; } ordersingle.Set(new TransactTime(DateTime.Now)); ordersingle.Set(new HandlInst('1')); if (ordem.MaxFloor > 0) { ordersingle.Set(new MaxFloor(Convert.ToDecimal(ordem.MaxFloor))); } if (ordem.MinQty > 0) { ordersingle.Set(new MinQty(Convert.ToDecimal(ordem.MinQty))); } // Cliente QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup1 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); //PartyIDGroup1.set(new PartyID(ordem.Account.ToString())); PartyIDGroup1.Set(new PartyID(ordem.ExecBroker)); PartyIDGroup1.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup1.Set(new PartyRole(PartyRole.ENTERING_TRADER)); // Corretora QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup2 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup2.Set(new PartyID("227")); PartyIDGroup2.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup2.Set(new PartyRole(PartyRole.ENTERING_FIRM)); // Location ID QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup3 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); if (ordem.SenderLocation != null && ordem.SenderLocation.Length > 0) { PartyIDGroup3.Set(new PartyID(ordem.SenderLocation)); } else { PartyIDGroup3.Set(new PartyID("GRA")); } PartyIDGroup3.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup3.Set(new PartyRole(PartyRole.SENDER_LOCATION)); ordersingle.AddGroup(PartyIDGroup1); ordersingle.AddGroup(PartyIDGroup2); ordersingle.AddGroup(PartyIDGroup3); //BEI - 2012-Nov-13 if (ordem.ForeignFirm != null && ordem.ForeignFirm.Length > 0) { QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup5 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup5.Set(new PartyID(ordem.ForeignFirm)); PartyIDGroup5.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup5.Set(new PartyRole(PartyRole.FOREIGN_FIRM)); ordersingle.AddGroup(PartyIDGroup5); } //SelfTradeProtection - 2012-Nov-27 if (ordem.InvestorID != null && ordem.InvestorID.Length > 0) { QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup6 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup6.Set(new PartyID(ordem.InvestorID)); PartyIDGroup6.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup6.Set(new PartyRole(PartyRole.INVESTOR_ID)); ordersingle.AddGroup(PartyIDGroup6); } if (ordem.ExecutingTrader != null && ordem.ExecutingTrader.Length > 0) { QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup PartyIDGroup7 = new QuickFix.FIX44.NewOrderSingle.NoPartyIDsGroup(); PartyIDGroup7.Set(new PartyID(ordem.ExecutingTrader)); PartyIDGroup7.Set(new PartyIDSource(PartyIDSource.PROPRIETARY_CUSTOM_CODE)); PartyIDGroup7.Set(new PartyRole(PartyRole.EXECUTING_TRADER)); ordersingle.AddGroup(PartyIDGroup7); } //if (ordem.Account > 0) //{ // QuickFix.FIX44.NewOrderSingle.NoAllocsGroup noAllocsGrp = new QuickFix.FIX44.NewOrderSingle.NoAllocsGroup(); // noAllocsGrp.Set(new AllocAccount(ordem.Account.ToString())); // noAllocsGrp.Set(new AllocAcctIDSource(99)); // ordersingle.AddGroup(noAllocsGrp); //} if (ordem.PositionEffect != null && ordem.PositionEffect.Equals("C")) { ordersingle.Set(new PositionEffect('C')); } // Memo Field if (ordem.Memo5149 != null && ordem.Memo5149.Length > 0) { if (ordem.Memo5149.Length > 50) { ordem.Memo5149 = ordem.Memo5149.Substring(0, 50); } StringField memo5149 = new StringField(5149, ordem.Memo5149); ordersingle.SetField(memo5149); } // AccountType if (ordem.AcountType == ContaTipoEnum.REMOVE_ACCOUNT_INFORMATION) { IntField int581 = new IntField(581, 38); ordersingle.SetField(int581); } else if (ordem.AcountType == ContaTipoEnum.GIVE_UP_LINK_IDENTIFIER) { IntField int581 = new IntField(581, 40); ordersingle.SetField(int581); } bool bRet = Session.SendToTarget(ordersingle, _session.SessionID); return(bRet); }