/// <summary> /// Create an debt working order. /// </summary> void CreateDebt() { // All orders get a unique identifier. Guid workingOrderId = Guid.NewGuid(); // These records provide the starting point for generating the orders. DataModel.BlotterRow blotterRow = DataModel.Blotter.BlotterKey.Find(generatorInfo.BlotterId); DataModel.UserRow userRow = DataModel.User.UserKey.Find(generatorInfo.UserId); DataModel.CountryRow unitedStatesRow = DataModel.Country.CountryKeyExternalId0.Find("US"); DataModel.StatusRow statusRow = DataModel.Status.StatusKey.Find(StatusCode.New); // Generate the settlement currency DataModel.EntityRow usdEntityRow = DataModel.Entity.EntityKeyExternalId0.Find("USD"); DataModel.SecurityRow settlementCurrencyRow = DataModel.Security.SecurityKey.Find(usdEntityRow.EntityId); // The orders are an even mix of Buys and Sells. Most positions are long. Boolean isBuy = random.Next(2) == 0; Boolean isLong = random.Next(4) != 0; SideCode sideCode = isBuy && isLong ? SideCode.Buy : !isBuy && isLong ? SideCode.Sell : isBuy && !isLong ? SideCode.BuyCover : SideCode.SellShort; DataModel.SideRow sideRow = DataModel.Side.SideKey.Find(sideCode); // Find a random debt position that is unique to this blotter. DataModel.SecurityRow securityRow = null; while (securityRow == null) { // Select a random debt instrument for the next order. DataModel.DebtRow debtRow = DataModel.Debt[random.Next(DataModel.Debt.Count - 1)]; // Only generate orders for positions that are unique to this blotter. Position position = new Position(debtRow.DebtId, sideCode); if (!positionSet.Contains(position)) { securityRow = debtRow.SecurityRowByFK_Security_Debt_DebtId; positionSet.Add(position); } } // These orders will not match by default. We need to turn them on manually. DataModel.CrossingRow crossingRow = DataModel.Crossing.CrossingKey.Find(CrossingCode.NeverMatch); // Select a random Time In Force for this order. Most orders are Day orders but occationally we'll generate a GTC just to keep it interesting. TimeInForceCode timeInForce = random.Next(4) == 0 ? TimeInForceCode.GoodTillCancel : TimeInForceCode.Day; DataModel.TimeInForceRow timeInForceRow = DataModel.TimeInForce.TimeInForceKey.Find(timeInForce); // Generate the trade and settlement dates based on the current time and make sure it doesn't fall on a weekend. DateTime tradeDate = DateTime.Now; DateTime settlementDate = DateTime.Now; TimeSpan oneDay = TimeSpan.FromDays(1.0); for (Int32 dayIndex = 0; dayIndex < 3; dayIndex++) { settlementDate += oneDay; if (settlementDate.DayOfWeek == DayOfWeek.Saturday) { settlementDate += oneDay; } if (settlementDate.DayOfWeek == DayOfWeek.Sunday) { settlementDate += oneDay; } } // This will generate random matching preferences for the orders for demonstrating the matching box capabilities. Boolean isBrokerMatch = random.Next(20) == 0; Boolean isHedgeMatch = random.Next(15) == 0; Boolean isInstitutionMatch = true; // This randomizes the random matching patterns. Every now and then, don't match with anyone. if (random.Next(5) == 0) { isBrokerMatch = false; isHedgeMatch = false; isInstitutionMatch = false; } // <transaction> XElement elementTransaction = new XElement("transaction"); this.xDocument.Root.Add(elementTransaction); // <method name="StoreWorkingOrder"> XElement elementWorkingOrder = new XElement("method", new XAttribute("name", "StoreWorkingOrder")); elementTransaction.Add(elementWorkingOrder); // <parameter name="blotterKey" value="EMERGING MARKETS BLOTTER" /> elementWorkingOrder.Add( new XElement("parameter", new XAttribute("name", "blotterKey"), new XAttribute("value", blotterRow.EntityRow.ExternalId0))); // <parameter name="configurationId" value="US TICKER" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "configurationId"), new XAttribute("value", "CUSIP"))); // <parameter name="createdTime" value="5/6/2012 5:27:56 PM" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "createdTime"), new XAttribute("value", DateTime.Now.ToString("G")))); // <parameter name="crossingKey" value="NEVER MATCH" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "crossingKey"), new XAttribute("value", crossingRow.ExternalId0))); // <parameter name="externalId0" value="{bab88942-5c4e-440a-a352-c8e9b00fec12}" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "externalId0"), new XAttribute("value", workingOrderId.ToString("B")))); // <parameter name="isBrokerMatch" value="false" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "isBrokerMatch"), new XAttribute("value", isBrokerMatch))); // <parameter name="isHedgeMatch" value="false" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "isHedgeMatch"), new XAttribute("value", isHedgeMatch))); // <parameter name="isInstitutionMatch" value="true" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "isInstitutionMatch"), new XAttribute("value", isInstitutionMatch))); // <parameter name="modifiedTime" value="5/6/2012 5:27:56 PM" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "modifiedTime"), new XAttribute("value", DateTime.Now.ToString("G")))); // <parameter name="orderTypeKey" value="MKT" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "orderTypeKey"), new XAttribute("value", "MKT"))); // <parameter name="securityKeyBySecurityId" value="ODP" /> elementWorkingOrder.Add( new XElement("parameter", new XAttribute("name", "securityKeyBySecurityId"), new XAttribute("value", securityRow.EntityRow.ExternalId4))); // <parameter name="securityKeyBySettlementId" value="USD" /> elementWorkingOrder.Add( new XElement("parameter", new XAttribute("name", "securityKeyBySettlementId"), new XAttribute("value", settlementCurrencyRow.EntityRow.ExternalId0))); // <parameter name="settlementDate" value="5/9/2012 5:27:56 PM" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "settlementDate"), new XAttribute("value", settlementDate.ToString("G")))); // <parameter name="sideKey" value="SELL" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "sideKey"), new XAttribute("value", sideRow.ExternalId0))); // <parameter name="statusKey" value="NEW" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "statusKey"), new XAttribute("value", statusRow.ExternalId0))); // <parameter name="timeInForceKey" value="DAY" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "timeInForceKey"), new XAttribute("value", timeInForceRow.ExternalId0))); // <parameter name="tradeDate" value="5/6/2012 5:27:56 PM" /> elementWorkingOrder.Add(new XElement("parameter", new XAttribute("name", "tradeDate"), new XAttribute("value", tradeDate.ToString("G")))); // <parameter name="userKeyByCreatedUserId" value="DEV KAPOOR" /> elementWorkingOrder.Add( new XElement("parameter", new XAttribute("name", "userKeyByCreatedUserId"), new XAttribute("value", userRow.EntityRow.ExternalId0))); // <parameter name="userKeyByModifiedUserId" value="DEV KAPOOR" /> elementWorkingOrder.Add( new XElement("parameter", new XAttribute("name", "userKeyByModifiedUserId"), new XAttribute("value", userRow.EntityRow.ExternalId0))); // This will generate between one and three source orders for the working order. Source orders are a blocking concept. You can get several orders for // the same security on the same side for the same price. When this happens, it is much more efficient to block them as a single order and execute them // as a single order and allocate them back to the original orders when the order is done. Int32 sourceOrderCount = random.Next(1, 3); for (Int32 sourceOrderIndex = 0; sourceOrderIndex < sourceOrderCount; sourceOrderIndex++) { // This creates a unique identifier for the source order. Guid sourceOrderId = Guid.NewGuid(); // This generates a random quantity for the order between 100 and 10,000 shares. Decimal orderedQuantity = Convert.ToDecimal(random.Next(1, 100)) * 100.0M; // <method name="StoreSourceOrder"> XElement elementSourceOrder = new XElement("method", new XAttribute("name", "StoreSourceOrder")); elementTransaction.Add(elementSourceOrder); // <parameter name="configurationId" value="US TICKER" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "configurationId"), new XAttribute("value", "CUSIP"))); // <parameter name="createdTime" value="2012-05-06T17:27:56.2658093-04:00" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "createdTime"), new XAttribute("value", DateTime.Now))); // <parameter name="externalId0" value="{3c69e0a0-3316-4499-a7b1-6dda5a058837}" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "externalId0"), new XAttribute("value", sourceOrderId.ToString("B")))); // <parameter name="modifiedTime" value="5/6/2012 5:27:56 PM" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "modifiedTime"), new XAttribute("value", DateTime.Now.ToString("G")))); // <parameter name="orderedQuantity" value="4300.0" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "orderedQuantity"), new XAttribute("value", orderedQuantity))); // <parameter name="orderTypeKey" value="MKT" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "orderTypeKey"), new XAttribute("value", "MKT"))); // <parameter name="securityKeyBySecurityId" value="ODP" /> elementSourceOrder.Add( new XElement("parameter", new XAttribute("name", "securityKeyBySecurityId"), new XAttribute("value", securityRow.EntityRow.ExternalId4))); // <parameter name="securityKeyBySettlementId" value="USD" /> elementSourceOrder.Add( new XElement("parameter", new XAttribute("name", "securityKeyBySettlementId"), new XAttribute("value", settlementCurrencyRow.EntityRow.ExternalId0))); // <parameter name="settlementDate" value="2012-05-09T17:27:56.2528086-04:00" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "settlementDate"), new XAttribute("value", settlementDate))); // <parameter name="sideKey" value="SELL" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "sideKey"), new XAttribute("value", sideRow.ExternalId0))); // <parameter name="statusKey" value="NEW" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "statusKey"), new XAttribute("value", statusRow.ExternalId0))); // <parameter name="timeInForceKey" value="DAY" /> elementSourceOrder.Add( new XElement("parameter", new XAttribute("name", "timeInForceKey"), new XAttribute("value", timeInForceRow.ExternalId0))); // <parameter name="tradeDate" value="5/6/2012 5:27:56 PM" /> elementSourceOrder.Add(new XElement("parameter", new XAttribute("name", "tradeDate"), new XAttribute("value", tradeDate.ToString("G")))); // <parameter name="userKeyByCreatedUserId" value="DEV KAPOOR" /> elementSourceOrder.Add( new XElement("parameter", new XAttribute("name", "userKeyByCreatedUserId"), new XAttribute("value", userRow.EntityRow.ExternalId0))); // <parameter name="userKeyByModifiedUserId" value="DEV KAPOOR" /> elementSourceOrder.Add( new XElement("parameter", new XAttribute("name", "userKeyByModifiedUserId"), new XAttribute("value", userRow.EntityRow.ExternalId0))); // <parameter name="workingOrderKey" value="{bab88942-5c4e-440a-a352-c8e9b00fec12}" /> elementSourceOrder.Add( new XElement("parameter", new XAttribute("name", "workingOrderKey"), new XAttribute("value", workingOrderId.ToString("B")))); } }
/// <summary> /// Initialize a new instance of the Position class. /// </summary> /// <param name="securityId">The security id.</param> /// <param name="sideCode">The side code.</param> public Position(Guid securityId, SideCode sideCode) { // Initialize the object. this.securityId = securityId; this.sideCode = sideCode; }
/// <summary> /// Gets an internal database identifier based on the Enumerated value. /// </summary> /// <param name="key">The strongly typed enumerated value.</param> /// <returns>The equivalent record identifier from the database.</returns> public static Guid FromCode(SideCode key) { return(SideMap.enumDictionary[key]); }
private void GenerateTilingForLevel() { // Determine the width of the tiles // Random.Range is inclusive // Random.InitState(levelManager.randomSeed); int tn = Random.Range(0, tiles.Count - 1); GameObject t = tiles[tn]; tileWidth = t.GetComponent <Renderer>().bounds.size.x - 0.01f; // Populate an array with the numbers of the tiles for (int i = 0; i < levelSize; i++) { // Initialize the level by placing a random tile at position 0 and then build off of it. if (i == 0) { int r = (int)Random.Range(0, numTiles - 1); levelLayout[i] = r; } else if (i == levelSize - 1) { // The last tile should match the first tile and the tile before it GameObject previousTile = tileLookup[levelLayout[i - 1]]; SideCode lCode = previousTile.GetComponent <TileData>().RightCode; GameObject firstTile = tileLookup[levelLayout[0]]; SideCode rCode = firstTile.GetComponent <TileData>().LeftCode; if (lCode == SideCode.Low) { foreach (GameObject candidate in tilesLeftLow) { SideCode candidateRight = candidate.GetComponent <TileData>().RightCode; if (candidateRight == rCode) { TileData tiledata = candidate.GetComponent <TileData>(); int nextTileCode = tiledata.tileNumber; levelLayout[i] = nextTileCode; break; } } } else if (lCode == SideCode.High) { foreach (GameObject candidate in tilesLeftHigh) { SideCode candidateRight = candidate.GetComponent <TileData>().RightCode; if (candidateRight == rCode) { TileData tiledata = candidate.GetComponent <TileData>(); int nextTileCode = tiledata.tileNumber; levelLayout[i] = nextTileCode; break; } } } } else { GameObject previousTile = tileLookup[levelLayout[i - 1]]; SideCode lCode = previousTile.GetComponent <TileData>().RightCode; if (lCode == SideCode.Low) { int r = (int)Random.Range(0, tilesLeftLow.Count); GameObject nexttile = tilesLeftLow[r]; TileData tiledata = nexttile.GetComponent <TileData>(); int nextTileCode = tiledata.tileNumber; levelLayout[i] = nextTileCode; } else if (lCode == SideCode.High) { int r = (int)Random.Range(0, tilesLeftHigh.Count); GameObject nexttile = tilesLeftHigh[r]; TileData tiledata = nexttile.GetComponent <TileData>(); int nextTileCode = tiledata.tileNumber; levelLayout[i] = nextTileCode; } } } }
/// <summary> /// Simulates the execution of an order. /// </summary> /// <param name="orderRow">The order to be executed.</param> static void ExecuteOrder(BrokerContext brokerContext, MarketDataModel.OrderRow orderRow) { // Create an execution. MarketDataModel.ExecutionRow executionRow = MarketData.Execution.NewExecutionRow(); executionRow.ExecutionId = Guid.NewGuid(); executionRow.OrderId = orderRow.OrderId; // This execution needs a random number of shares to fill. We can't overcommit the order, so first we need to count up how many shares have already // been executed on this order. Then we can calculated the 'leaves' quantity (the amount remaining to be executed). Decimal executedQuantity = 0.0m; foreach (MarketDataModel.ExecutionRow childExecutionRow in orderRow.GetExecutionRows()) { executedQuantity += childExecutionRow.Quantity; } Decimal leavesQuantity = orderRow.QuantityOrdered - executedQuantity; // This will generate either a random fill or finish the order with an odd lot. executionRow.Quantity = Math.Min(leavesQuantity, brokerContext.Random.Next(1, 100) * 100); // The execution requires a price. The price simulator will provide a bid price or ask price depending on the side of the order. MarketDataModel.PriceRow priceRow = MarketData.Price.FindByFeedSymbol("US TICKER", orderRow.Symbol); SideCode sideCode = (SideCode)orderRow.SideCode; executionRow.Price = 0.0m; if (priceRow != null) { executionRow.Price = sideCode == SideCode.Buy || sideCode == SideCode.BuyCover ? priceRow.BidPrice : priceRow.AskPrice; } // We're record this execution in the broker's book. MarketData.Execution.AddExecutionRow(executionRow); // Now that the order is recorded, we can update the 'leaves' to reflect the execution. leavesQuantity -= executionRow.Quantity; // This message is sent back to the customer to record the execution. Note that we pick the web service to use from a mapping table. This table // associates the name of the firm with a preconfigured web service to communicate with that firm. Message message = new Message(); message.ExecBroker = brokerContext.Symbol; message.Symbol = orderRow.Symbol; message.SenderCompID = orderRow.Source; message.Price = executionRow.Price; message.OrderID = orderRow.OrderId.ToString(); message.OrderStatusCode = leavesQuantity == 0.0M ? OrderStatusCode.Filled : OrderStatusCode.PartiallyFilled; message.CumQty = executionRow.Quantity; message.ClOrdID = orderRow.CustomerOrderId; message.LeavesQty = leavesQuantity; // If this order is filled then remove it from the simulated order book. If the order book is empty, then put the broker threads to sleep. if (leavesQuantity == 0) { MarketData.Order.RemoveOrderRow(orderRow); if (MarketData.Order.Count == 0) { BrokerSimulator.orderEvent.Reset(); } } // This places the message in a queue of messages owned by the current broker that will route the message back to the source of the order. brokerContext.SendReport(message.SenderCompID, message); }
public Fill(string price, string quantity, string side) { this.price = System.Convert.ToDouble(price); this.quantity = System.Convert.ToDouble(quantity); this.side = System.Convert.ToInt32(side) == 1 ? SideCode.BUY : SideCode.SELL; }
// Given a side, returns the state of affairs between this side and the given one public diplomacyState GetDiplomacyState(SideCode side) { return diplomacy[(int)side]; }
public void SetSideDiplomacy(SideCode side, diplomacyState state) { diplomacy[(int)side] = state; }
public static void SetDiplomacyState(SideCode caller, SideCode target, diplomacyState state) { sides[(int)caller].SetSideDiplomacy(target, state); }
public static void RemoveSide(SideCode side) { sides[(int)side].active = false; }
//What is my diplomacy with this group? public static diplomacyState GetDiplomacyState(SideCode asker, SideCode inQuestion) { return sides[(int)asker].GetDiplomacyState(inQuestion); }
public static void AddSide(SideCode side) { sides[(int)side].active = true; }
/// <summary> /// Converts a Side to a string. /// </summary> /// <returns>A Side value.</returns> /// <param name="value">The FIX string representation of a Side.</param> public static string ConvertTo(SideCode messageType) { return((string)SideConverter.toTable[messageType]); }