/// <summary>
        /// Attempts to exactly match the specified positions to this strategy definition with as much quantity as possible.
        /// </summary>
        public bool TryMatch(IReadOnlyList <OptionPosition> positions, out OptionStrategy strategy)
        {
            if (positions.Count == 0 || Legs.Count != positions.Count)
            {
                strategy = null;
                return(false);
            }

            var underlying = positions[0].Symbol;

            if (underlying.SecurityType == SecurityType.Option)
            {
                underlying = underlying.Underlying;
            }

            var quantityMultiplier = int.MaxValue;
            var matches            = new List <OptionStrategy.LegData>();

            for (int i = 0; i < Legs.Count; i++)
            {
                var leg      = Legs[i];
                var position = positions[i];
                OptionStrategy.LegData match;
                if (!leg.TryMatch(position, out match))
                {
                    strategy = null;
                    return(false);
                }

                matches.Add(match);
                var multiple = match.Quantity / leg.Quantity;
                quantityMultiplier = Math.Min(multiple, quantityMultiplier);
            }

            // separate matches into option/underlying legs and resize according to smallest quantity multipler
            var optionLegs     = new List <OptionStrategy.OptionLegData>();
            var underlyingLegs = new List <OptionStrategy.UnderlyingLegData>();

            for (var i = 0; i < matches.Count; i++)
            {
                var match = matches[i];
                match.Invoke(underlyingLegs.Add, optionLegs.Add);
                match.Quantity = Legs[i].Quantity * quantityMultiplier;
            }

            strategy = new OptionStrategy
            {
                Name           = Name,
                OptionLegs     = optionLegs,
                Underlying     = underlying,
                UnderlyingLegs = underlyingLegs
            };

            return(true);
        }
Example #2
0
        /// <summary>
        /// Creates the <see cref="OptionStrategy"/> instance this match represents
        /// </summary>
        public OptionStrategy CreateStrategy()
        {
            var legs     = Legs.Select(leg => leg.CreateOptionStrategyLeg(Multiplier));
            var strategy = new OptionStrategy {
                Name = Definition.Name, Underlying = Legs[0].Position.Underlying
            };

            foreach (var leg in legs)
            {
                leg.Invoke(strategy.UnderlyingLegs.Add, strategy.OptionLegs.Add);
            }

            return(strategy);
        }
Example #3
0
        public string GetStrategyControl(OptionStrategy strategy)
        {
            string controlID = string.Empty;

            switch (strategy)
            {
                case OptionStrategy.CallPut:
                    controlID = "OptionTicket_code_1";
                    break;
                case OptionStrategy.Butterfly:
                    controlID = "OptionTicket_code_2";
                    break;
                case OptionStrategy.Calendar:
                    controlID = "OptionTicket_code_3";
                    break;
                case OptionStrategy.Collar:
                    controlID = "OptionTicket_code_13";
                    break;
                case OptionStrategy.Condor:
                    controlID = "OptionTicket_code_4";
                    break;
                case OptionStrategy.Covered:
                    controlID = "OptionTicket_code_5";
                    break;
                case OptionStrategy.IronButterfly:
                    controlID = "OptionTicket_code_6";
                    break;
                case OptionStrategy.IronCondor:
                    controlID = "OptionTicket_code_7";
                    break;
                case OptionStrategy.Ratio:
                    controlID = "OptionTicket_code_9";
                    break;
                case OptionStrategy.Spread:
                    controlID = "OptionTicket_code_10";
                    break;
                case OptionStrategy.Straddle:
                    controlID = "OptionTicket_code_11";
                    break;
                case OptionStrategy.Strangle:
                    controlID = "OptionTicket_code_12";
                    break;
                default:
                    break;
            }

            return controlID;
        }
        /// <summary>
        /// Creates the <see cref="OptionStrategy"/> instance using this definition and the provided leg matches
        /// </summary>
        public OptionStrategy CreateStrategy(IReadOnlyList <OptionStrategyLegDefinitionMatch> legs)
        {
            var underlying = legs[0].Position.Symbol;

            if (underlying.HasUnderlying)
            {
                underlying = underlying.Underlying;
            }

            var strategy = new OptionStrategy {
                Name = Name, Underlying = underlying
            };

            for (int i = 0; i < Math.Min(Legs.Count, legs.Count); i++)
            {
                var leg = Legs[i].CreateLegData(legs[i]);
                leg.Invoke(strategy.UnderlyingLegs.Add, strategy.OptionLegs.Add);
            }

            return(strategy);
        }
        /// <summary>
        /// Creates the <see cref="OptionStrategy"/> instance this match represents
        /// </summary>
        public OptionStrategy CreateStrategy()
        {
            var legs     = Legs.Select(leg => leg.CreateOptionStrategyLeg(Multiplier));
            var strategy = new OptionStrategy {
                Name       = Definition.Name,
                Underlying = Legs[0].Position.Underlying
            };

            foreach (var optionLeg in legs)
            {
                optionLeg.Invoke(strategy.UnderlyingLegs.Add, strategy.OptionLegs.Add);
            }

            if (Definition.UnderlyingLots != 0)
            {
                strategy.UnderlyingLegs = new List <OptionStrategy.UnderlyingLegData>
                {
                    OptionStrategy.UnderlyingLegData.Create(Definition.UnderlyingLots * Multiplier, Legs[0].Position.Underlying)
                };
            }

            return(strategy);
        }
        private IEnumerable <OrderTicket> GenerateOrders(OptionStrategy strategy, int strategyQuantity)
        {
            var orders = new List <OrderTicket>();

            // setting up the tag text for all orders of one strategy
            var strategyTag = strategy.Name + " (" + strategyQuantity.ToString() + ")";

            // walking through all option legs and issuing orders
            if (strategy.OptionLegs != null)
            {
                foreach (var optionLeg in strategy.OptionLegs)
                {
                    var optionSeq = Securities.Where(kv => kv.Key.Underlying == strategy.Underlying &&
                                                     kv.Key.ID.OptionRight == optionLeg.Right &&
                                                     kv.Key.ID.Date == optionLeg.Expiration &&
                                                     kv.Key.ID.StrikePrice == optionLeg.Strike);

                    if (optionSeq.Count() != 1)
                    {
                        var error = string.Format("Couldn't find the option contract in algorithm securities list. Underlying: {0}, option {1}, strike {2}, expiration: {3}",
                                                  strategy.Underlying.ToString(), optionLeg.Right.ToString(), optionLeg.Strike.ToString(), optionLeg.Expiration.ToString());
                        throw new InvalidOperationException(error);
                    }

                    var option = optionSeq.First().Key;

                    switch (optionLeg.OrderType)
                    {
                    case OrderType.Market:
                        var marketOrder = MarketOrder(option, optionLeg.Quantity * strategyQuantity, tag: strategyTag);
                        orders.Add(marketOrder);
                        break;

                    case OrderType.Limit:
                        var limitOrder = LimitOrder(option, optionLeg.Quantity * strategyQuantity, optionLeg.OrderPrice, tag: strategyTag);
                        orders.Add(limitOrder);
                        break;

                    default:
                        throw new InvalidOperationException("Order type is not supported in option strategy: " + optionLeg.OrderType.ToString());
                    }
                }
            }

            // walking through all underlying legs and issuing orders
            if (strategy.UnderlyingLegs != null)
            {
                foreach (var underlyingLeg in strategy.UnderlyingLegs)
                {
                    if (!Securities.ContainsKey(strategy.Underlying))
                    {
                        var error = string.Format("Couldn't find the option contract underlying in algorithm securities list. Underlying: {0}", strategy.Underlying.ToString());
                        throw new InvalidOperationException(error);
                    }

                    switch (underlyingLeg.OrderType)
                    {
                    case OrderType.Market:
                        var marketOrder = MarketOrder(strategy.Underlying, underlyingLeg.Quantity * strategyQuantity, tag: strategyTag);
                        orders.Add(marketOrder);
                        break;

                    case OrderType.Limit:
                        var limitOrder = LimitOrder(strategy.Underlying, underlyingLeg.Quantity * strategyQuantity, underlyingLeg.OrderPrice, tag: strategyTag);
                        orders.Add(limitOrder);
                        break;

                    default:
                        throw new InvalidOperationException("Order type is not supported in option strategy: " + underlyingLeg.OrderType.ToString());
                    }
                }
            }
            return(orders);
        }
 /// <summary>
 ///  Issue an order/trade for buying/selling an option strategy
 /// </summary>
 /// <param name="strategy">Specification of the strategy to trade</param>
 /// <param name="quantity">Quantity of the strategy to trade</param>
 /// <returns>Sequence of order ids</returns>
 public IEnumerable <OrderTicket> Order(OptionStrategy strategy, int quantity)
 {
     return(GenerateOrders(strategy, quantity));
 }
 /// <summary>
 /// Sell Option Strategy (alias of Order)
 /// </summary>
 /// <param name="strategy">Specification of the strategy to trade</param>
 /// <param name="quantity">Quantity of the strategy to trade</param>
 /// <returns>Sequence of order ids</returns>
 public IEnumerable <OrderTicket> Sell(OptionStrategy strategy, int quantity)
 {
     return(Order(strategy, Math.Abs(quantity) * -1));
 }
Example #9
0
 public void GetOptionInfo(OptionStrategy optionStrategy)
 {
     throw new NotImplementedException();
 }
Example #10
0
        // Support for option strategies trading

        /// <summary>
        /// Buy Option Strategy (Alias of Order)
        /// </summary>
        /// <param name="strategy">Specification of the strategy to trade</param>
        /// <param name="quantity">Quantity of the strategy to trade</param>
        /// <returns>Sequence of order ids</returns>
        public IEnumerable<OrderTicket> Buy(OptionStrategy strategy, int quantity)
        {
            return Order(strategy, Math.Abs(quantity));
        }
        private void getRealtimeSystemResultsFromDatabase()
        {
            try
            {
                eodConflictList.Clear();

                eodConflictList.Columns.Add("Rule Type", 75, HorizontalAlignment.Left);

                eodConflictList.Columns.Add("Realtime Rule", 200, HorizontalAlignment.Left);
                eodConflictList.Columns.Add("EOD Rule", 200, HorizontalAlignment.Left);

                eodConflictList.Columns.Add("strategy", 50, HorizontalAlignment.Left);

                eodConflictList.Columns.Add("instrument", 50, HorizontalAlignment.Left);



                int stratListOfIds = 0;
                int realtime       = 1;
                int eod            = 2;

                DataRow[][] systemResultsComparison = optionSpreadManager.readRealtimeSystemResultsFromDatabase();

                Dictionary <int, DataRow> intradayRows = new Dictionary <int, DataRow>();
                for (int i = 0; i < systemResultsComparison[realtime].Length; i++)
                {
                    if (!intradayRows.ContainsKey(Convert.ToInt32(systemResultsComparison[realtime][i]["idstrategy"])))
                    {
                        intradayRows.Add(Convert.ToInt32(systemResultsComparison[realtime][i]["idstrategy"]),
                                         systemResultsComparison[realtime][i]);
                    }
                }

                Dictionary <int, DataRow> eodRows = new Dictionary <int, DataRow>();
                for (int i = 0; i < systemResultsComparison[eod].Length; i++)
                {
                    if (!eodRows.ContainsKey(Convert.ToInt32(systemResultsComparison[eod][i]["idstrategy"])))
                    {
                        eodRows.Add(Convert.ToInt32(systemResultsComparison[eod][i]["idstrategy"]),
                                    systemResultsComparison[eod][i]);
                    }
                }

                OptionStrategy[] optionStrategies = optionSpreadManager.getOptionStrategies;
                Dictionary <int, OptionStrategy> optionStrategiesHashTable = new Dictionary <int, OptionStrategy>();
                for (int i = 0; i < optionStrategies.Length; i++)
                {
                    if (!optionStrategiesHashTable.ContainsKey(optionStrategies[i].idStrategy))
                    {
                        optionStrategiesHashTable.Add(optionStrategies[i].idStrategy,
                                                      optionStrategies[i]);
                    }
                }

                for (int i = 0; i < systemResultsComparison[stratListOfIds].Length; i++)
                {
                    int idstrategy = Convert.ToInt32(systemResultsComparison[stratListOfIds][i]["idstrategy"]);

                    if (intradayRows.ContainsKey(idstrategy) && eodRows.ContainsKey(idstrategy))
                    {
                        DataRow realtimeRow = intradayRows[idstrategy];

                        DataRow eod_1_Row = eodRows[idstrategy];

                        OptionStrategy optionStrategy = optionStrategiesHashTable[idstrategy];

                        //TSErrorCatch.debugWriteOut(realtimeRow["entryrule"].ToString());
                        //TSErrorCatch.debugWriteOut(eod_1_Row["entryrule"].ToString());

                        string realtimeEntry = realtimeRow["entryrule"].ToString();
                        string eodEntry      = eod_1_Row["entryrule"].ToString();

                        string realtimeExit = realtimeRow["exitrule"].ToString();
                        string eodExit      = eod_1_Row["exitrule"].ToString();

                        bool entryConflict = true;
                        if (realtimeEntry.Length > 4 && eodEntry.Length > 4 &&
                            realtimeEntry.Substring(realtimeEntry.Length - 4).CompareTo(
                                eodEntry.Substring(eodEntry.Length - 4)) == 0)
                        {
                            entryConflict = false;
                        }

                        if (entryConflict)
                        {
                            //StringBuilder entry = new StringBuilder();
                            //entry.Append(realtimeEntry);
                            //entry.Append("\n");
                            //entry.Append(eodEntry);

                            ListViewItem item = new ListViewItem("Entry Conflict");
                            item.BackColor = Color.LawnGreen;
                            item.ForeColor = Color.Black;
                            item.UseItemStyleForSubItems = false;

                            eodConflictList.Items.Add(item);



                            item.SubItems.Add(realtimeEntry,
                                              Color.Black, Color.LightGreen, item.Font);
                            item.SubItems.Add(eodEntry,
                                              Color.Black, Color.LightGreen, item.Font);

                            item.SubItems.Add(idstrategy.ToString(),
                                              Color.Black, Color.LightGreen, item.Font);

                            item.SubItems.Add(optionStrategy.instrument.exchangeSymbol,
                                              Color.Black, Color.LightGreen, item.Font);

                            //item.SubItems.Add(instrumentAcct.Value,
                            //            Color.Black, Color.LawnGreen, item.Font);

                            //item.SubItems.Add(optionSpreadManager.portfolioGroupAllocation[groupAllocCnt].multiple.ToString(),
                            //            Color.Black, Color.LawnGreen, item.Font);
                        }

                        bool exitConflict = true;
                        if (realtimeExit.Length > 4 && eodExit.Length > 4 &&
                            realtimeExit.Substring(realtimeExit.Length - 4).CompareTo(
                                eodExit.Substring(eodExit.Length - 4)) == 0)
                        {
                            exitConflict = false;
                        }

                        if (exitConflict)
                        {
                            //StringBuilder entry = new StringBuilder();
                            //entry.Append(realtimeEntry);
                            //entry.Append("\n");
                            //entry.Append(eodEntry);

                            ListViewItem item = new ListViewItem("Exit Conflict");
                            item.BackColor = Color.Red;
                            item.ForeColor = Color.White;
                            item.UseItemStyleForSubItems = false;

                            eodConflictList.Items.Add(item);



                            item.SubItems.Add(realtimeExit,
                                              Color.Black, Color.LightPink, item.Font);
                            item.SubItems.Add(eodExit,
                                              Color.Black, Color.LightPink, item.Font);

                            item.SubItems.Add(idstrategy.ToString(),
                                              Color.Black, Color.LightPink, item.Font);

                            item.SubItems.Add(optionStrategy.instrument.exchangeSymbol,
                                              Color.Black, Color.LightPink, item.Font);

                            //item.SubItems.Add(instrumentAcct.Value,
                            //            Color.Black, Color.LawnGreen, item.Font);

                            //item.SubItems.Add(optionSpreadManager.portfolioGroupAllocation[groupAllocCnt].multiple.ToString(),
                            //            Color.Black, Color.LawnGreen, item.Font);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                TSErrorCatch.errorCatchOut(Convert.ToString(this), ex);
            }
        }