public static List <Order> createBracketOrder(Order parent, double profitTarget, double stopTarget, DateTime expiry, OrderTemplate profitTemplate = null, OrderTemplate stopTemplate = null, OrderTemplate expiryTemplate = null) { List <Order> orders = new List <Order>(); parent.Transmit = false; orders.Add(parent); if (expiry != DateTime.MinValue) { Order expiryOrder; if (expiryTemplate == null) { expiryOrder = new Order(); expiryOrder.OrderType = "MKT"; } else { expiryOrder = expiryTemplate.clone(); if (!expiryTemplate.isSet("OrderType")) { expiryOrder.OrderType = "MKT"; } } expiryOrder.GoodAfterTime = expiry.ToString("yyyyMMdd HH:mm:ss"); expiryOrder.Action = parent.Action.Equals("BUY") ? "SELL" : "BUY"; expiryOrder.TotalQuantity = parent.TotalQuantity; //expiryOrder.OrderId = _og.get(); expiryOrder.ParentId = parent.OrderId; expiryOrder.Transmit = false; orders.Add(expiryOrder); } if (profitTarget != 0) { Order profitOrder; if (profitTemplate == null) { profitOrder = new Order(); profitOrder.OrderType = "LMT"; } else { profitOrder = profitTemplate.clone(); if (!profitTemplate.isSet("OrderType")) { profitOrder.OrderType = "LMT"; } } profitOrder.Action = parent.Action.Equals("BUY") ? "SELL" : "BUY"; profitOrder.TotalQuantity = parent.TotalQuantity; profitOrder.LmtPrice = profitTarget; //profitOrder.OrderId = _og.get(); profitOrder.ParentId = parent.OrderId; profitOrder.Transmit = false; orders.Add(profitOrder); } if (stopTarget != 0) { Order stopOrder; if (stopTemplate == null) { stopOrder = new Order(); stopOrder.OrderType = "STP"; } else { stopOrder = stopTemplate.clone(); if (!stopTemplate.isSet("OrderType")) { stopOrder.OrderType = "STP"; } if (stopOrder.OrderType == "STP LMT" && !stopTemplate.isSet("LmtPriceOffset")) { stopOrder.LmtPriceOffset = stopTarget * 0.1; // assume offset is 10% of stop price if not set } } stopOrder.Action = parent.Action.Equals("BUY") ? "SELL" : "BUY"; stopOrder.TotalQuantity = parent.TotalQuantity; stopOrder.AuxPrice = stopTarget; if (stopOrder.OrderType == "STP LMT") { stopOrder.LmtPrice = stopTarget + stopOrder.LmtPriceOffset * (stopOrder.Action.Equals("BUY") ? 1 : -1); } //stopOrder.OrderId = _og.get(); stopOrder.ParentId = parent.OrderId; stopOrder.Transmit = false; orders.Add(stopOrder); } orders[orders.Count() - 1].Transmit = true; return(orders); }
public void sendOrder( Order ord, DateTime endTime, //bool mktOrdersOnly double profitTarget = 0, double stopTarget = 0, DateTime?expiryStartTime = null, DateTime?expiryEndTime = null, DateTime?cancelAfter = null ) { _profitTarget = profitTarget; _stopTarget = stopTarget; _expiryStartTime = expiryStartTime; _expiryEndTime = expiryEndTime; _cancelAfter = cancelAfter; //Create order schedules int qty = (int)(ord.TotalQuantity); //Test Only //_unitSize = 2; //_maxOrderSize = 4; //_maxNOrders = 12; //qty = 20; int maxNOrders = Math.Min(_maxNOrders, (int)((qty - 0.5) / (double)(_unitSize)) + 1); int minNOrders = (int)((qty - 0.5) / (double)(_maxOrderSize)) + 1; Random r = new Random(); int nOrders = minNOrders >= maxNOrders ? maxNOrders : r.Next(minNOrders, maxNOrders + 1); int minUnitSize = Math.Min(_unitSize, qty / nOrders); int remainQty = qty - minUnitSize * nOrders; int maxRemainOrderSize = _maxOrderSize - minUnitSize; List <double> qtySchedule = new List <double>(); if (remainQty == 0) { for (int i = 0; i < nOrders; ++i) { qtySchedule.Add(0); } } else { for (int i = 0; i < nOrders; ++i) { qtySchedule.Add(r.NextDouble()); } double qsum = qtySchedule.Sum(); double qsmall = 0; double qsmallnew = 0; for (int i = 0; i < nOrders; ++i) { qtySchedule[i] *= remainQty / qsum; if (qtySchedule[i] > maxRemainOrderSize) { qsmallnew += qtySchedule[i] - maxRemainOrderSize; qtySchedule[i] = maxRemainOrderSize; } else { qsmall += qtySchedule[i]; qsmallnew += qtySchedule[i]; } } if (qsmallnew != qsmall) { double qratio = qsmallnew / qsmall; for (int i = 0; i < nOrders; ++i) { if (qtySchedule[i] < maxRemainOrderSize) { qtySchedule[i] *= qratio; } } } for (int i = 1; i < nOrders; ++i) { qtySchedule[i] += qtySchedule[i - 1]; } } List <double> timeSchedule = new List <double>(); for (int i = 0; i < nOrders; ++i) { timeSchedule.Add(r.NextDouble()); } timeSchedule.Sort(); _orderSchedule = new List <Tuple <Order, DateTime> >(); DateTime tstart = Strategy.getExchangeTime(_socket.getCurrentLocalTime(), _zone); long remainTicks = (endTime - tstart).Ticks; int prerq = 0; for (int i = 0; i < nOrders; ++i) { int rq = (int)(Math.Round(qtySchedule[i], 0)); int q = minUnitSize + rq - prerq; prerq = rq; long ticks = (long)(timeSchedule[i] * remainTicks); Order o = _entryTemplate.clone(); o.Action = ord.Action; o.TotalQuantity = q; if (!_entryTemplate.isSet("OrderType")) { o.OrderType = "MKT"; } //o.LmtPrice = 0; o.Transmit = false; //o.TrailStopPrice = 0; //o.TrailingPercent = 0; //o.SmartComboRoutingParams = new List<TagValue>(); //o.SmartComboRoutingParams.Add(new TagValue("NonGuaranteed", "1")); DateTime t = tstart.AddTicks(ticks); _orderSchedule.Add(new Tuple <Order, DateTime>(o, t)); _msg.logMessage(t, 1, "Information", "BlockOrder", _con.ConId, _stg_id, "Scheduled " + o.OrderType + " " + o.Action + " " + o.TotalQuantity.ToString()); } _placeOrderEvent.Reset(); _mktDataEvents[1].Reset(); _mktDataEvents[2].Reset(); _mktDataEvents[4].Reset(); ThreadPool.QueueUserWorkItem(new WaitCallback(placeOrders)); }