Beispiel #1
0
        public static void HedgeStrategiesAgainstDelta(MySqlConnection conn, DataTable priceTable)
        {
            List <string> HedgeStrategyList   = HedgeStrategies.GetStrategyList2Hedge(conn: conn);
            List <string> DeltaStrategyList   = HedgeStrategies.GetDeltaStrategyList(conn: conn);
            string        ActiveDeltaStrategy = DeltaStrategyList[DeltaStrategyList.Count - 1];

            Console.WriteLine("Calculating hedges for strategies...");

            foreach (string item in HedgeStrategyList)
            {
                Console.WriteLine(item);
                HedgeStrategies.HedgeStrategyAgainstDelta(alias: item, deltaAlias: ActiveDeltaStrategy, conn: conn, priceTable: priceTable);
            }
        }
Beispiel #2
0
        public HedgeTTAPI(string u, string p)
        {
            m_username = u;
            m_password = p;

            PricesReceivedQ = false;

            connection = new mysql();
            conn       = connection.conn;

            UnderlyingTickerTable = Underlying.GetUnderlying2QueryTable(conn: conn);

            List <string> TickerHeadList = DataAnalysis.DataTableFunctions.GetColumnAsList <string>(dataTableInput: UnderlyingTickerTable, columnName: "TickerHead", uniqueQ: true);

            DateTo = CalendarUtilities.BusinessDays.GetBusinessDayShifted(shiftInDays: -1);
            DateTime TodayDate = DateTime.Now.Date;
            DateTime DateFrom  = CalendarUtilities.BusinessDays.GetBusinessDayShifted(shiftInDays: -10);

            DataTable HistoricPriceTable = GetPrice.GetFuturesPrice.getFuturesPrice4Ticker(tickerHeadList: TickerHeadList, dateTimeFrom: DateFrom, dateTimeTo: DateTo, conn: conn);

            SortedHistoricPriceTable = HistoricPriceTable.AsEnumerable()
                                       .OrderBy(r => r.Field <string>("ticker"))
                                       .ThenBy(r => r.Field <DateTime>("price_date"))
                                       .CopyToDataTable();

            TTAPISubs             = new ttapiUtils.Subscription(m_username, m_password);
            IlsDictionary         = TTAPISubs.IlsDictionary;
            TTAPISubs.TickerTable = UnderlyingTickerTable;
            ilsUpdateList         = new List <EventHandler <InstrumentLookupSubscriptionEventArgs> > {
                TTAPISubs.startPriceSubscriptions, TTAPISubs.startTradeSubscriptions
            };
            TTAPISubs.ilsUpdateList = ilsUpdateList;
            TTAPISubs.AsuUpdateList = new List <EventHandler <AuthenticationStatusUpdateEventArgs> > {
                TTAPISubs.startInstrumentLookupSubscriptionsFromDataTable, TTAPISubs.Subscribe2OrderFills
            };
            TTAPISubs.priceUpdatedEventHandler = GetBidAsk;
            TTAPISubs.FillAddedEventHandler    = OrderFilledEventHandler;

            PriceData = new DataTable();
            PriceData.Columns.Add("Ticker", typeof(string));
            PriceData.Columns.Add("TickerHead", typeof(string));
            PriceData.Columns.Add("TickerClass", typeof(string));
            PriceData.Columns.Add("ContINDX", typeof(int));
            PriceData.Columns.Add("IsSpreadQ", typeof(bool));

            PriceData.Columns.Add("BidPrice", typeof(decimal));
            PriceData.Columns.Add("AskPrice", typeof(decimal));
            PriceData.Columns.Add("MidPrice", typeof(decimal));
            PriceData.Columns.Add("SpreadCost", typeof(decimal));

            foreach (DataRow item in UnderlyingTickerTable.Rows)
            {
                DataRow Row = PriceData.NewRow();
                Row["Ticker"]      = item.Field <string>("Ticker");
                Row["TickerHead"]  = item.Field <string>("TickerHead");
                Row["TickerClass"] = item.Field <string>("TickerClass");
                Row["ContINDX"]    = item.Field <int>("ContINDX");
                Row["IsSpreadQ"]   = item.Field <bool>("IsSpreadQ");
                PriceData.Rows.Add(Row);
            }

            PriceData            = DataAnalysis.DataTableFunctions.Sort(dataTableInput: PriceData, columnList: new string[] { "TickerHead", "ContINDX" });
            UnderlyingTickerList = DataAnalysis.DataTableFunctions.GetColumnAsList <string>(dataTableInput: PriceData, columnName: "Ticker", uniqueQ: true);

            string       OutputFolder = TA.DirectoryNames.GetDirectoryName("daily");
            StreamWriter LogFile      = new StreamWriter(OutputFolder + "/Delta.txt", true);

            DeltaLogger = new Logger(LogFile);

            DeltaLogger.SW.WriteLine();
            DeltaLogger.Log("NOTES FOR " + TodayDate.ToString("MM/dd/yyyy"));
            DeltaLogger.Log(new String('-', 20));

            DeltaStrategyAlias = HedgeStrategies.GetActiveDeltaStrategy(conn: conn);
        }
Beispiel #3
0
        DataTable GenerateHedgeTable(MySqlConnection conn)
        {
            string DeltaStrategy = HedgeStrategies.GetDeltaStrategyList(conn: conn).Last();
            //string DeltaStrategy = HedgeStrategies.GetDeltaStrategyList(conn: conn).First();

            DataTable DeltaNetPosition = TA.Strategy.GetNetPosition(alias: DeltaStrategy, conn: conn);

            DeltaNetPosition.Columns.Add("TickerHead", typeof(string));
            DeltaNetPosition.Columns.Add("TickerClass", typeof(string));
            DeltaNetPosition.Columns.Add("ContINDX", typeof(int));

            for (int i = 0; i < DeltaNetPosition.Rows.Count; i++)
            {
                ContractUtilities.ContractSpecs Cs = ContractUtilities.ContractMetaInfo.GetContractSpecs(ticker: DeltaNetPosition.Rows[i].Field <string>("Ticker"));
                DeltaNetPosition.Rows[i]["TickerHead"]  = Cs.tickerHead;
                DeltaNetPosition.Rows[i]["TickerClass"] = Cs.tickerClass;
                DeltaNetPosition.Rows[i]["ContINDX"]    = Cs.contINDX;
            }


            DataRow[] FlatCurvePositions = (from x in DeltaNetPosition.AsEnumerable()
                                            where Underlying.FlatCurveTickerClassList.Any(b => x.Field <string>("TickerClass").Contains(b))
                                            select x).ToArray();

            DataRow[] NonFlatCurvePositions = (from x in DeltaNetPosition.AsEnumerable()
                                               where !Underlying.FlatCurveTickerClassList.Any(b => x.Field <string>("TickerClass").Contains(b))
                                               select x).ToArray();

            DataTable FlatCurveHedgeTable = new DataTable();

            FlatCurveHedgeTable.Columns.Add("Ticker", typeof(string));
            FlatCurveHedgeTable.Columns.Add("TickerHead", typeof(string));
            FlatCurveHedgeTable.Columns.Add("IsSpreadQ", typeof(bool));
            FlatCurveHedgeTable.Columns.Add("Hedge", typeof(int));

            DataTable NonFlatCurveHedgeTable = new DataTable();

            NonFlatCurveHedgeTable.Columns.Add("Ticker", typeof(string));
            NonFlatCurveHedgeTable.Columns.Add("TickerHead", typeof(string));
            NonFlatCurveHedgeTable.Columns.Add("IsSpreadQ", typeof(bool));
            NonFlatCurveHedgeTable.Columns.Add("Hedge", typeof(int));

            if (FlatCurvePositions.Count() > 0)
            {
                DataTable FlatCurveTable = FlatCurvePositions.CopyToDataTable();

                ContractUtilities.ContractList liquidContractList = new ContractUtilities.ContractList(FlatCurveTable.AsEnumerable().Select(s => s.Field <string>("TickerHead")).Distinct().ToArray());

                Dictionary <string, string> LiquidContractDictionary = new Dictionary <string, string>();

                foreach (string item in liquidContractList.dbTickerList)
                {
                    LiquidContractDictionary.Add(ContractUtilities.ContractMetaInfo.GetContractSpecs(item).tickerHead, item);
                }

                var grouped = FlatCurveTable.AsEnumerable().GroupBy(r => r["TickerHead"]).Select(w => new
                {
                    TickerHead = w.Key.ToString(),
                    Qty        = w.Sum(r => decimal.Parse(r["Qty"].ToString())),
                }).ToList();


                for (int i = 0; i < grouped.Count; i++)
                {
                    FlatCurveHedgeTable.Rows.Add();
                    FlatCurveHedgeTable.Rows[i]["Ticker"]     = LiquidContractDictionary[grouped[i].TickerHead];
                    FlatCurveHedgeTable.Rows[i]["TickerHead"] = grouped[i].TickerHead;
                    FlatCurveHedgeTable.Rows[i]["IsSpreadQ"]  = false;
                    FlatCurveHedgeTable.Rows[i]["Hedge"]      = Math.Round(-grouped[i].Qty);
                }
            }

            if (NonFlatCurvePositions.Count() > 0)
            {
                DataTable SortedNonFlatCurvePositions = NonFlatCurvePositions.AsEnumerable()
                                                        .OrderBy(r => r.Field <string>("TickerHead"))
                                                        .ThenBy(r => r.Field <int>("contINDX"))
                                                        .CopyToDataTable();

                List <string> TickerHeadList = SortedNonFlatCurvePositions.AsEnumerable().Select(s => s.Field <string>("TickerHead")).Distinct().ToList();

                for (int i = 0; i < TickerHeadList.Count(); i++)
                {
                    DataTable TickerHeadPositions = SortedNonFlatCurvePositions.Select("TickerHead='" + TickerHeadList[i] + "'").CopyToDataTable();

                    if (TickerHeadPositions.Rows.Count == 1)
                    {
                        DataRow Row = NonFlatCurveHedgeTable.NewRow();
                        NonFlatCurveHedgeTable.Rows.Add();
                        Row["Ticker"]     = TickerHeadPositions.Rows[0].Field <string>("Ticker");
                        Row["TickerHead"] = TickerHeadList[i];
                        Row["IsSpreadQ"]  = false;
                        Row["Hedge"]      = Math.Round(-TickerHeadPositions.Rows[0].Field <double>("Qty"));
                        NonFlatCurveHedgeTable.Rows.Add(Row);
                        continue;
                    }

                    int sum = (int)Math.Round(-TickerHeadPositions.AsEnumerable().Sum(x => x.Field <double>("Qty")));

                    int MaxIndex = TickerHeadPositions.Rows.IndexOf(TickerHeadPositions.Select("Qty = MAX(Qty)")[0]);
                    int MinIndex = TickerHeadPositions.Rows.IndexOf(TickerHeadPositions.Select("Qty = MIN(Qty)")[0]);

                    if (sum > 0)
                    {
                        DataRow Row = NonFlatCurveHedgeTable.NewRow();
                        Row["Ticker"]     = TickerHeadPositions.Rows[MinIndex].Field <string>("Ticker");
                        Row["TickerHead"] = TickerHeadList[i];
                        Row["IsSpreadQ"]  = false;
                        Row["Hedge"]      = sum;
                        NonFlatCurveHedgeTable.Rows.Add(Row);
                        TickerHeadPositions.Rows[MinIndex]["Qty"] = TickerHeadPositions.Rows[MinIndex].Field <double>("Qty") + sum;
                    }
                    else if (sum < 0)
                    {
                        DataRow Row = NonFlatCurveHedgeTable.NewRow();
                        Row["Ticker"]     = TickerHeadPositions.Rows[MaxIndex].Field <string>("Ticker");
                        Row["TickerHead"] = TickerHeadList[i];
                        Row["IsSpreadQ"]  = false;
                        Row["Hedge"]      = sum;
                        NonFlatCurveHedgeTable.Rows.Add(Row);
                        TickerHeadPositions.Rows[MaxIndex]["Qty"] = TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty") + sum;
                    }

                    bool PositionCleanedQ = false;

                    while (!PositionCleanedQ)
                    {
                        var OrderedRows = TickerHeadPositions.AsEnumerable().OrderByDescending(x => x["Qty"]);

                        MaxIndex = TickerHeadPositions.Rows.IndexOf(OrderedRows.First());
                        MinIndex = TickerHeadPositions.Rows.IndexOf(OrderedRows.Last());

                        PositionCleanedQ = !((TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty") > 0.5) & (TickerHeadPositions.Rows[MinIndex].Field <double>("Qty") < -0.5));

                        if (PositionCleanedQ)
                        {
                            break;
                        }
                        int qty = -(int)Math.Round(Math.Min(TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty"), -TickerHeadPositions.Rows[MinIndex].Field <double>("Qty")));

                        string SpreadTicker;
                        int    HedgeQty;

                        if (TickerHeadPositions.Rows[MaxIndex].Field <int>("ContINDX") < TickerHeadPositions.Rows[MinIndex].Field <int>("ContINDX"))
                        {
                            SpreadTicker = TickerHeadPositions.Rows[MaxIndex].Field <string>("Ticker") + "-" + TickerHeadPositions.Rows[MinIndex].Field <string>("Ticker");
                            HedgeQty     = qty;
                        }
                        else
                        {
                            HedgeQty     = -qty;
                            SpreadTicker = TickerHeadPositions.Rows[MinIndex].Field <string>("Ticker") + "-" + TickerHeadPositions.Rows[MaxIndex].Field <string>("Ticker");
                        }

                        DataRow Row = NonFlatCurveHedgeTable.NewRow();
                        Row["Ticker"]     = SpreadTicker;
                        Row["TickerHead"] = TickerHeadList[i];
                        Row["IsSpreadQ"]  = true;
                        Row["Hedge"]      = HedgeQty;
                        NonFlatCurveHedgeTable.Rows.Add(Row);

                        TickerHeadPositions.Rows[MaxIndex]["Qty"] = TickerHeadPositions.Rows[MaxIndex].Field <double>("Qty") + qty;
                        TickerHeadPositions.Rows[MinIndex]["Qty"] = TickerHeadPositions.Rows[MinIndex].Field <double>("Qty") - qty;
                    }
                }
            }

            FlatCurveHedgeTable.Merge(NonFlatCurveHedgeTable);
            return(FlatCurveHedgeTable);
        }
Beispiel #4
0
        void GetBidAsk(object sender, FieldsUpdatedEventArgs e)
        {
            if (e.Error == null)
            {
                if ((string.IsNullOrEmpty(e.Fields.GetDirectBidPriceField().FormattedValue)) || (string.IsNullOrEmpty(e.Fields.GetDirectAskPriceField().FormattedValue)))
                {
                    return;
                }

                string InstrumentName = e.Fields.Instrument.Name.ToString();

                TickerDB = TA.TickerConverters.ConvertFromTTAPIFields2DB(e.Fields.Instrument.Product.ToString(), e.Fields.Instrument.Name.ToString());
                string TickerHead = TA.TickerheadConverters.ConvertFromTT2DB(e.Fields.Instrument.Product.ToString());

                UpdatePriceData(ticker: TickerDB, tickerHead: TickerHead, e: e);

                TA.ttapiTicker TTAPITicker = TA.TickerConverters.ConvertFromDbTicker2ttapiTicker(dbTicker: TickerDB, productType: e.Fields.Instrument.Product.Type.ToString());

                InstrumentKey IKey = new InstrumentKey(new ProductKey(e.Fields.Instrument.Product.Market.Key, e.Fields.Instrument.Product.Type, e.Fields.Instrument.Product.Name), TTAPITicker.SeriesKey);
                Ts = TTAPISubs.TsDictionary[e.Fields.Instrument.Key];

                if (IlsDictionary.ContainsKey(IKey))
                {
                    for (int i = 0; i < ilsUpdateList.Count; i++)
                    {
                        IlsDictionary[IKey].Update -= ilsUpdateList[i];
                    }

                    IlsDictionary[IKey].Dispose();
                    IlsDictionary[IKey] = null;
                    IlsDictionary.Remove(IKey);
                    TTAPISubs.IlsDictionary = IlsDictionary;
                }


                if ((IlsDictionary.Count == 0) & (!PricesReceivedQ))
                {
                    PricesReceivedQ = true;

                    HedgeStrategies.HedgeStrategiesAgainstDelta(conn: conn, priceTable: PriceData);

                    DataTable StdMoves   = CalculateStdMoves(priceData: PriceData);
                    DataTable HedgeTable = GenerateHedgeTable(conn: conn);
                    NetHedgeTable = CalculateUrgency(hedgeTable: HedgeTable);
                    //NetHedgeTable = NetHedgeTable.Select("IsSpreadQ=true").CopyToDataTable();

                    List <string> TickerHeads2Report = DataAnalysis.DataTableFunctions.GetColumnAsList <string>(dataTableInput: StdMoves, columnName: "TickerHead", uniqueQ: true);



                    foreach (string TickerHead2Report in TickerHeads2Report)
                    {
                        DeltaLogger.Log(new String('-', 20));
                        DataRow[] SelectedRows = StdMoves.Select("TickerHead='" + TickerHead2Report + "'");

                        foreach (DataRow Row in SelectedRows)
                        {
                            DeltaLogger.Log(Row.Field <string>("Ticker") + " std change: " + Row.Field <double>("StdChange"));
                        }

                        DataRow[] SelectedHedgeRows = NetHedgeTable.Select("TickerHead='" + TickerHead2Report + "'");

                        foreach (DataRow Row in SelectedHedgeRows)
                        {
                            DeltaLogger.Log(Row.Field <int>("Hedge") + "  " + Row.Field <string>("Ticker") + " with urgency " + Row.Field <decimal>("Urgency"));
                        }
                    }

                    Console.Write("Do you agree? (Y/N): ");
                    Decision = Console.ReadLine();
                    Decision = Decision.ToUpper();


                    DataColumn WorkingOrdersColumn = new DataColumn("WorkingOrders", typeof(int));
                    WorkingOrdersColumn.DefaultValue = 0;
                    NetHedgeTable.Columns.Add(WorkingOrdersColumn);
                    NetHedgeTickerList = DataAnalysis.DataTableFunctions.GetColumnAsList <string>(dataTableInput: NetHedgeTable, columnName: "Ticker");
                }

                if ((PricesReceivedQ) && (Decision == "Y"))
                {
                    int RowIndex = NetHedgeTickerList.IndexOf(TickerDB);

                    if ((RowIndex < 0) || (NetHedgeTable.Rows[RowIndex].Field <int>("WorkingOrders") != 0))
                    {
                        return;
                    }

                    Price BidPrice = e.Fields.GetDirectBidPriceField().Value;
                    Price AskPrice = e.Fields.GetDirectAskPriceField().Value;

                    Price MidPrice = (AskPrice + BidPrice) / 2;

                    Price TradePrice;

                    NetHedgeTable.Rows[RowIndex]["WorkingOrders"] = NetHedgeTable.Rows[RowIndex].Field <int>("Hedge");

                    if (NetHedgeTable.Rows[RowIndex].Field <int>("Hedge") > 0)
                    {
                        if (NetHedgeTable.Rows[RowIndex].Field <decimal>("Urgency") > 5)
                        {
                            TradePrice = MidPrice.Round(Rounding.Up);
                        }
                        else
                        {
                            TradePrice = BidPrice;
                        }
                    }
                    else if (NetHedgeTable.Rows[RowIndex].Field <int>("Hedge") < 0)
                    {
                        if (NetHedgeTable.Rows[RowIndex].Field <decimal>("Urgency") > 5)
                        {
                            TradePrice = MidPrice.Round(Rounding.Down);
                        }
                        else
                        {
                            TradePrice = AskPrice;
                        }
                    }
                    else
                    {
                        return;
                    }

                    DeltaLogger.Log(NetHedgeTable.Rows[RowIndex].Field <int>("Hedge") + " " + TickerDB + " for " + TradePrice +
                                    ", Bid: " + e.Fields.GetDirectBidPriceField().FormattedValue +
                                    ", Ask: " + e.Fields.GetDirectAskPriceField().FormattedValue);
                    ttapiUtils.Trade.SendLimitOrder(instrument: e.Fields.Instrument, price: TradePrice,
                                                    qty: NetHedgeTable.Rows[RowIndex].Field <int>("Hedge"), ttapisubs: TTAPISubs, orderTag: "DeltaHedge");
                }
            }
            else
            {
                if (e.Error.IsRecoverableError == false)
                {
                    Console.WriteLine("Unrecoverable price subscription error: {0}", e.Error.Message);
                    //Dispose();
                }
            }
        }
        public static DataTable GetUnderlying2QueryTable(MySqlConnection conn)
        {
            List <string> StrategyList = HedgeStrategies.GetStrategyList2Hedge(conn: conn);

            StrategyList.Add(HedgeStrategies.GetActiveDeltaStrategy(conn: conn));
            DataTable MergedPosition = null;

            for (int i = 0; i < StrategyList.Count; i++)
            {
                if (i == 0)
                {
                    MergedPosition = TA.Strategy.GetNetPosition(alias: StrategyList[i], conn: conn);
                }
                else
                {
                    MergedPosition.Merge(TA.Strategy.GetNetPosition(alias: StrategyList[i], conn: conn));
                }
            }

            DataTable FuturesPosition = MergedPosition.Select("Instrument='F'").CopyToDataTable();
            DataTable OptionsPosition = MergedPosition.Select("Instrument='O'").CopyToDataTable();

            List <string> OptionTickerList = OptionsPosition.AsEnumerable()
                                             .Select(r => r.Field <string>("Ticker")).Distinct()
                                             .ToList();

            List <string> FuturesTickerList = FuturesPosition.AsEnumerable()
                                              .Select(r => r.Field <string>("Ticker")).Distinct()
                                              .ToList();

            List <string> UnderlyingTickerList = new List <string>();

            foreach (string item in OptionTickerList)
            {
                UnderlyingTickerList.Add(OptionModels.Utils.GetOptionUnderlying(ticker: item));
            }

            List <string> UniqueList = UnderlyingTickerList.Union(FuturesTickerList).ToList();

            DataTable UnderlyingTable = new DataTable();

            UnderlyingTable.Columns.Add("Ticker", typeof(string));
            UnderlyingTable.Columns.Add("TickerHead", typeof(string));
            UnderlyingTable.Columns.Add("TickerClass", typeof(string));
            UnderlyingTable.Columns.Add("ContINDX", typeof(int));

            for (int i = 0; i < UniqueList.Count; i++)
            {
                DataRow UnderlyingRow = UnderlyingTable.NewRow();
                UnderlyingRow["Ticker"] = UniqueList[i];
                ContractUtilities.ContractSpecs Cs = ContractUtilities.ContractMetaInfo.GetContractSpecs(ticker: UniqueList[i]);
                UnderlyingRow["TickerHead"]  = Cs.tickerHead;
                UnderlyingRow["TickerClass"] = Cs.tickerClass;
                UnderlyingRow["ContINDX"]    = Cs.contINDX;
                UnderlyingTable.Rows.Add(UnderlyingRow);
            }

            DataRow[] FlatCurveUnderlyings = (from x in UnderlyingTable.AsEnumerable()
                                              where FlatCurveTickerClassList.Any(b => x.Field <string>("TickerClass").Contains(b))
                                              select x).ToArray();

            DataRow[] NonFlatCurveUnderlyings = (from x in UnderlyingTable.AsEnumerable()
                                                 where !FlatCurveTickerClassList.Any(b => x.Field <string>("TickerClass").Contains(b))
                                                 select x).ToArray();

            DataTable FlatCurveQueryTable = new DataTable();

            FlatCurveQueryTable.Columns.Add("Ticker", typeof(string));
            FlatCurveQueryTable.Columns.Add("TickerHead", typeof(string));
            FlatCurveQueryTable.Columns.Add("TickerClass", typeof(string));
            FlatCurveQueryTable.Columns.Add("ContINDX", typeof(int));
            FlatCurveQueryTable.Columns.Add("IsSpreadQ", typeof(bool));

            DataTable NonFlatCurveQueryTable = new DataTable();

            NonFlatCurveQueryTable.Columns.Add("Ticker", typeof(string));
            NonFlatCurveQueryTable.Columns.Add("TickerHead", typeof(string));
            NonFlatCurveQueryTable.Columns.Add("TickerClass", typeof(string));
            NonFlatCurveQueryTable.Columns.Add("ContINDX", typeof(int));
            NonFlatCurveQueryTable.Columns.Add("IsSpreadQ", typeof(bool));

            if (FlatCurveUnderlyings.Count() > 0)
            {
                DataTable FlatCurveUnderlyingTable = FlatCurveUnderlyings.CopyToDataTable();
                ContractUtilities.ContractList liquidContractList = new ContractUtilities.ContractList(FlatCurveUnderlyingTable.AsEnumerable().Select(s => s.Field <string>("TickerHead")).Distinct().ToArray());

                for (int i = 0; i < liquidContractList.dbTickerList.Count; i++)
                {
                    if (!(FlatCurveUnderlyingTable.AsEnumerable().Any(row => liquidContractList.dbTickerList[i] == row.Field <String>("Ticker"))))
                    {
                        DataRow UnderlyingRow = FlatCurveUnderlyingTable.NewRow();
                        UnderlyingRow["Ticker"] = liquidContractList.dbTickerList[i];
                        ContractUtilities.ContractSpecs Cs = ContractUtilities.ContractMetaInfo.GetContractSpecs(ticker: liquidContractList.dbTickerList[i]);
                        UnderlyingRow["TickerHead"]  = Cs.tickerHead;
                        UnderlyingRow["TickerClass"] = Cs.tickerClass;
                        UnderlyingRow["ContINDX"]    = Cs.contINDX;
                        FlatCurveUnderlyingTable.Rows.Add(UnderlyingRow);
                    }
                }

                for (int i = 0; i < FlatCurveUnderlyingTable.Rows.Count; i++)
                {
                    DataRow Row = FlatCurveQueryTable.NewRow();
                    Row["Ticker"]      = FlatCurveUnderlyingTable.Rows[i].Field <string>("Ticker");
                    Row["TickerHead"]  = FlatCurveUnderlyingTable.Rows[i].Field <string>("TickerHead");
                    Row["TickerClass"] = FlatCurveUnderlyingTable.Rows[i].Field <string>("TickerClass");
                    Row["ContINDX"]    = FlatCurveUnderlyingTable.Rows[i].Field <int>("ContINDX");
                    Row["IsSpreadQ"]   = false;
                    FlatCurveQueryTable.Rows.Add(Row);
                }
            }

            if (NonFlatCurveUnderlyings.Count() > 0)
            {
                DataTable SortedNonFlatCurveUnderlyings = NonFlatCurveUnderlyings.AsEnumerable()
                                                          .OrderBy(r => r.Field <string>("TickerHead"))
                                                          .ThenBy(r => r.Field <int>("contINDX"))
                                                          .CopyToDataTable();

                List <string> TickerHeadList = SortedNonFlatCurveUnderlyings.AsEnumerable().Select(s => s.Field <string>("TickerHead")).Distinct().ToList();

                for (int i = 0; i < TickerHeadList.Count(); i++)
                {
                    DataTable TickerHeadPositions = SortedNonFlatCurveUnderlyings.Select("TickerHead='" + TickerHeadList[i] + "'").CopyToDataTable();

                    for (int j = 0; j < TickerHeadPositions.Rows.Count; j++)
                    {
                        DataRow Row = NonFlatCurveQueryTable.NewRow();
                        Row["Ticker"]      = TickerHeadPositions.Rows[j].Field <string>("Ticker");
                        Row["TickerHead"]  = TickerHeadPositions.Rows[j].Field <string>("TickerHead");
                        Row["TickerClass"] = TickerHeadPositions.Rows[j].Field <string>("TickerClass");
                        Row["ContINDX"]    = TickerHeadPositions.Rows[j].Field <int>("ContINDX");
                        Row["IsSpreadQ"]   = false;
                        NonFlatCurveQueryTable.Rows.Add(Row);
                    }

                    for (int j = 0; j < TickerHeadPositions.Rows.Count - 1; j++)
                    {
                        for (int k = j + 1; k < TickerHeadPositions.Rows.Count; k++)
                        {
                            DataRow Row2 = NonFlatCurveQueryTable.NewRow();
                            Row2["Ticker"]      = TickerHeadPositions.Rows[j].Field <string>("Ticker") + "-" + TickerHeadPositions.Rows[k].Field <string>("Ticker");
                            Row2["TickerHead"]  = TickerHeadPositions.Rows[j].Field <string>("TickerHead");
                            Row2["TickerClass"] = TickerHeadPositions.Rows[j].Field <string>("TickerClass");
                            Row2["ContINDX"]    = TickerHeadPositions.Rows[j].Field <int>("ContINDX");
                            Row2["IsSpreadQ"]   = true;
                            NonFlatCurveQueryTable.Rows.Add(Row2);
                        }
                    }
                }
            }
            FlatCurveQueryTable.Merge(NonFlatCurveQueryTable);
            return(FlatCurveQueryTable);
        }
Beispiel #6
0
 public static string GetActiveDeltaStrategy(MySqlConnection conn)
 {
     return(HedgeStrategies.GetDeltaStrategyList(conn: conn).Last());
 }