public void OnMessage(QuickFix.FIX43.NewOrderSingle n, SessionID s) { Symbol symbol = n.Symbol; Side side = n.Side; OrdType ordType = n.OrdType; OrderQty orderQty = n.OrderQty; Price price = new Price(DEFAULT_MARKET_PRICE); ClOrdID clOrdID = n.ClOrdID; switch (ordType.getValue()) { case OrdType.LIMIT: price = n.Price; if (price.Obj == 0) { throw new IncorrectTagValue(price.Tag); } break; case OrdType.MARKET: break; default: throw new IncorrectTagValue(ordType.Tag); } QuickFix.FIX43.ExecutionReport exReport = new QuickFix.FIX43.ExecutionReport( new OrderID(GenOrderID()), new ExecID(GenExecID()), new ExecType(ExecType.FILL), new OrdStatus(OrdStatus.FILLED), symbol, // Shouldn't be here? side, new LeavesQty(0), new CumQty(orderQty.getValue()), new AvgPx(price.getValue())); exReport.Set(clOrdID); exReport.Set(symbol); exReport.Set(orderQty); exReport.Set(new LastQty(orderQty.getValue())); exReport.Set(new LastPx(price.getValue())); if (n.IsSetAccount()) { exReport.SetField(n.Account); } try { Session.SendToTarget(exReport, s); } catch (SessionNotFound ex) { Console.WriteLine("==session not found exception!=="); Console.WriteLine(ex.ToString()); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public void NewOrder(string clrID, char handinst, char sideID, char orderType, string symbolID, string exchange, float?price, long Quantity) { ClOrdID clOrdID = new ClOrdID(clrID); HandlInst inst = new HandlInst('1');//似乎国信只支持直通私有 Side side = new Side(sideID); OrdType ordType = new OrdType(orderType); Symbol symbol = new Symbol(symbolID); TransactTime time = new TransactTime(); QuickFix42.NewOrderSingle message = new QuickFix42.NewOrderSingle(clOrdID, inst, symbol, side, time, ordType); message.setString(38, Quantity.ToString()); if (ordType.getValue() == OrdType.LIMIT) { message.setString(44, price.Value.ToString()); } message.setString(15, "CNY"); if (exchange == "SH") { message.setString(207, "XSHG"); } else if (exchange == "SZ") { message.setString(207, "XSHE"); } SendToServer(message); }
//35 = D public override void onMessage(QuickFix42.NewOrderSingle message, SessionID sessionID) { Console.WriteLine("Receive message " + message.getHeader().getField(35) + ", session: " + sessionID.toString()); try { ClOrdID clordid = message.getClOrdID(); string clord = clordid.getValue(); Side side = message.getSide(); char s = side.getValue(); OrdType ordtype = message.getOrdType(); char ord = ordtype.getValue(); TransactTime time = message.getTransactTime(); DateTime dt = time.getValue(); QuickFix42.ExecutionReport executionReport = new QuickFix42.ExecutionReport(new OrderID("neworderid"), new ExecID("Hehe") , new ExecTransType(ExecTransType.CORRECT), new ExecType(ExecType.NEW), new OrdStatus(OrdStatus.DONE_FOR_DAY), new Symbol("VND"), new Side(Side.BUY), new LeavesQty(1), new CumQty(2), new AvgPx(100)); bool x = Session.sendToTarget(executionReport, sessionID); } catch (Exception e) { Console.WriteLine(e.ToString()); } }
private static void ValidateIsSupportedOrderType(OrdType ordType) { switch (ordType.getValue()) { case OrdType.LIMIT: break; default: throw new IncorrectTagValue(ordType.Tag); } }
public static OrderType Convert(OrdType type) { switch (type.getValue()) { case OrdType.LIMIT: return(OrderType.Limit); default: throw new IncorrectTagValue(type.Tag); } }
public void OnMessage(QuickFix.FIX44.NewOrderSingle n, SessionID s) { Symbol symbol = n.Symbol; Side side = n.Side; OrdType ordType = n.OrdType; OrderQty orderQty = n.OrderQty; Price price = n.Price; ClOrdID clOrdID = n.ClOrdID; if (ordType.getValue() != OrdType.LIMIT) { throw new IncorrectTagValue(ordType.Tag); } QuickFix.FIX44.ExecutionReport exReport = new QuickFix.FIX44.ExecutionReport( new OrderID(GenOrderID()), new ExecID(GenExecID()), new ExecType(ExecType.FILL), new OrdStatus(OrdStatus.FILLED), symbol, //shouldn't be here? side, new LeavesQty(0), new CumQty(orderQty.getValue()), new AvgPx(price.getValue())); exReport.Set(clOrdID); exReport.Set(symbol); exReport.Set(orderQty); exReport.Set(new LastQty(orderQty.getValue())); exReport.Set(new LastPx(price.getValue())); if (n.IsSetAccount()) { exReport.SetField(n.Account); } try { Session.SendToTarget(exReport, s); } catch (SessionNotFound ex) { Console.WriteLine("==session not found exception!=="); Console.WriteLine(ex.Message); } catch (Exception ex) { Console.WriteLine("==unknown exception=="); Console.WriteLine(ex.ToString()); Console.WriteLine(ex.StackTrace); } }
public override void onMessage(QuickFix42.NewOrderSingle order, SessionID sessionID) { Symbol symbol = new Symbol(); Side side = new Side(); OrdType ordType = new OrdType(); OrderQty orderQty = new OrderQty(); Price price = new Price(); ClOrdID clOrdID = new ClOrdID(); order.get(ordType); if (ordType.getValue() != OrdType.LIMIT) { throw new IncorrectTagValue(ordType.getField()); } order.get(symbol); order.get(side); order.get(orderQty); order.get(price); order.get(clOrdID); QuickFix42.ExecutionReport executionReport = new QuickFix42.ExecutionReport (genOrderID(), genExecID(), new ExecTransType(ExecTransType.NEW), new ExecType(ExecType.FILL), new OrdStatus(OrdStatus.FILLED), symbol, side, new LeavesQty(0), new CumQty(orderQty.getValue()), new AvgPx(price.getValue())); executionReport.set(clOrdID); executionReport.set(orderQty); executionReport.set(new LastShares(orderQty.getValue())); executionReport.set(new LastPx(price.getValue())); if (order.isSetAccount()) { executionReport.set(order.getAccount()); } try { Session.sendToTarget(executionReport, sessionID); } catch (SessionNotFound) {} }
public void OnMessage(QuickFix.FIX44.NewOrderSingle n, SessionID s) { Symbol symbol = n.Symbol; Side side = n.Side; OrdType ordType = n.OrdType; OrderQty orderQty = n.OrderQty; Price price = new Price(DEFAULT_MARKET_PRICE); ClOrdID clOrdID = n.ClOrdID; switch (ordType.getValue()) { case OrdType.LIMIT: price = n.Price; if (price.Obj == 0) { throw new IncorrectTagValue(price.Tag); } break; case OrdType.MARKET: break; default: throw new IncorrectTagValue(ordType.Tag); } // Send Status New SendExecution(s, OrdStatus.NEW, ExecType.NEW, n, n.OrderQty.getValue(), 0, 0, 0, 0); Thread.Sleep(1000); // Send Status Partially Filled decimal filledQty = Math.Abs(Math.Round(n.OrderQty.getValue() / 4, 2)); decimal cumQty = filledQty; SendExecution(s, OrdStatus.PARTIALLY_FILLED, ExecType.PARTIAL_FILL, n, filledQty, filledQty, price.getValue(), filledQty, price.getValue()); Thread.Sleep(1000); // Send Status Partially Filled filledQty = Math.Abs(Math.Round(n.OrderQty.getValue() / 4, 2)); cumQty += filledQty; SendExecution(s, OrdStatus.PARTIALLY_FILLED, ExecType.PARTIAL_FILL, n, n.OrderQty.getValue() - cumQty, cumQty, price.getValue(), filledQty, price.getValue()); Thread.Sleep(1000); // Send Status Fully Filled filledQty = n.OrderQty.getValue() - cumQty; cumQty += filledQty; SendExecution(s, OrdStatus.FILLED, ExecType.FILL, n, 0, cumQty, price.getValue(), filledQty, price.getValue()); }
public override void onMessage( QuickFix40.NewOrderSingle order, SessionID sessionID ) { Symbol symbol = new Symbol(); Side side = new Side(); OrdType ordType = new OrdType(); OrderQty orderQty = new OrderQty(); Price price = new Price(); ClOrdID clOrdID = new ClOrdID(); order.get( ordType ); if ( ordType.getValue() != OrdType.LIMIT ) throw new IncorrectTagValue( ordType.getField() ); order.get( symbol ); order.get( side ); order.get( orderQty ); order.get( price ); order.get( clOrdID ); QuickFix40.ExecutionReport executionReport = new QuickFix40.ExecutionReport ( genOrderID(), genExecID(), new ExecTransType( ExecTransType.NEW ), new OrdStatus ( OrdStatus.FILLED ), symbol, side, orderQty, new LastShares ( orderQty.getValue() ), new LastPx ( price.getValue() ), new CumQty ( orderQty.getValue() ), new AvgPx ( price.getValue() ) ); executionReport.set( clOrdID ); if( order.isSetAccount() ) executionReport.set( order.getAccount() ); try { Session.sendToTarget( executionReport, sessionID ); } catch ( SessionNotFound ) {} }
private static Order Convert(MessageType commandType, Symbol symbol, Side side, OrdType ordType, OrderQty orderQty, Price price, ClOrdID clOrdId, Account account) { switch (ordType.getValue()) { case OrdType.LIMIT: if (price.Obj == 0) { throw new IncorrectTagValue(price.Tag); } break; //case OrdType.MARKET: break; default: throw new IncorrectTagValue(ordType.Tag); } var orderId = DIContainer.ResolveByName <IdGenerator>("OrderIdGenerator").GenerateId(); return(new Order { CommandType = commandType, OrderId = orderId, OrderSide = FixFieldsConverter.Convert(side), Asset = new Asset(symbol.getValue()), OrderType = FixFieldsConverter.Convert(ordType), Quantity = orderQty.getValue(), Price = price.getValue(), ClOrdId = clOrdId.getValue(), Account = account == null ? TradingAccount.None : new TradingAccount(account.getValue()) }); }
public static void Add(QuickFix42.Message msg) { ClOrdID clientId = new ClOrdID(); OrdType orderType = new OrdType(); msg.getField(clientId); Msgs.Add(clientId.getValue(), msg); if (msg.isSetField(orderType)) { msg.getField(orderType); if (orderType.getValue() == OrdType.LIMIT) { LimitOrders.Add(clientId.getValue()); LimitLib.Add(clientId.getValue()); } } }
private static OrderData TranslateOrderImpl(Symbol symbol, Side side, OrdType ordType, OrderQty orderQty, Price price, ClOrdID clOrdID, Account account) { switch (ordType.getValue()) { case OrdType.LIMIT: if (price.Obj == 0) { throw new IncorrectTagValue(price.Tag); } break; //case OrdType.MARKET: break; default: throw new IncorrectTagValue(ordType.Tag); } return(new OrderData { MarketSide = TranslateFixFields.Translate(side), Symbol = symbol.getValue(), OrderType = TranslateFixFields.Translate(ordType), Quantity = orderQty.getValue(), Price = price.getValue(), ClOrdID = clOrdID.getValue(), Account = account == null ? TradingAccount.None : new TradingAccount(account.getValue()) }); }
private void SendExecReport(NewOrderSingle newOrderSingle, IExecutionEngineSettings settings) { OrdType ordType = newOrderSingle.OrdType; Price price = new Price(10); switch (ordType.getValue()) { case OrdType.LIMIT: price = newOrderSingle.Price; if (price.Obj == 0) { throw new IncorrectTagValue(price.Tag); } break; case OrdType.MARKET: break; default: throw new IncorrectTagValue(ordType.Tag); } OrderQty orderQty = newOrderSingle.OrderQty; var exReport = new QuickFix.FIX42.ExecutionReport(); exReport.CopyFromOrder(newOrderSingle); exReport.Set(new ExecTransType(ExecTransType.NEW)); exReport.Set(new ExecType(ExecType.FILL)); exReport.Set(new LastPx(price.getValue())); exReport.Set(new AvgPx(price.getValue())); decimal qtyPerSlice = orderQty.getValue() * ((settings.EachFillPercentange ?? 100) / 100m); decimal leaves = orderQty.getValue(); decimal cumQty = 0; while (leaves != 0) { if (leaves <= qtyPerSlice) { leaves = 0; qtyPerSlice = leaves; exReport.Set(new OrdStatus(OrdStatus.FILLED)); } else { leaves -= qtyPerSlice; exReport.Set(new OrdStatus(OrdStatus.PARTIALLY_FILLED)); } cumQty += qtyPerSlice; exReport.Set(new OrderID(GenOrderID())); exReport.Set(new ExecID(GenExecID())); exReport.Set(new LeavesQty(leaves)); exReport.Set(new CumQty(cumQty)); exReport.Set(new LastShares(qtyPerSlice)); SendExecReport(exReport); Thread.Sleep(Convert.ToInt32(settings.SecondsBetweenFills * 1000)); } }