예제 #1
0
        /// <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"))));
            }
        }
예제 #2
0
 /// <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;
 }
예제 #3
0
 /// <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]);
 }
예제 #4
0
    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;
                }
            }
        }
    }
예제 #5
0
        /// <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);
        }
예제 #6
0
 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;
 }
예제 #7
0
 // Given a side, returns the state of affairs between this side and the given one
 public diplomacyState GetDiplomacyState(SideCode side)
 {
     return diplomacy[(int)side];
 }
예제 #8
0
 public void SetSideDiplomacy(SideCode side, diplomacyState state)
 {
     diplomacy[(int)side] = state;
 }
예제 #9
0
 public static void SetDiplomacyState(SideCode caller, SideCode target, diplomacyState state)
 {
     sides[(int)caller].SetSideDiplomacy(target, state);
 }
예제 #10
0
 public static void RemoveSide(SideCode side)
 {
     sides[(int)side].active = false;
 }
예제 #11
0
 //What is my diplomacy with this group?
 public static diplomacyState GetDiplomacyState(SideCode asker, SideCode inQuestion)
 {
     return sides[(int)asker].GetDiplomacyState(inQuestion);
 }
예제 #12
0
 public static void AddSide(SideCode side)
 {
     sides[(int)side].active = true;
 }
예제 #13
0
 /// <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]);
 }