Example #1
0
 // ****************
 public GridWindow(Option StartUpOptions)
 {
     _startUpOption = StartUpOptions;
     _exe = new NewExecution( StartUpOptions );
     _exe.TaskCompleted += ProgressChanged;
     OwnPacketReceiver.EndOfScan += ScanEnded;
     InitializeComponent();
     InitializeComboBox();
     InitializeDataGridView();
 }
Example #2
0
        public void TryMatch(ILimitOrder buyLimitOrder, ILimitOrder sellLimitOrder)
        {
            /*if (buyLimitOrder.ClientId == sellLimitOrder.ClientId)
             *  return;*/

            if (buyLimitOrder.Symbol != sellLimitOrder.Symbol)
            {
                return;
            }

            if (buyLimitOrder.Price < sellLimitOrder.Price)
            {
                return;
            }

            if (buyLimitOrder.Quantity == 0 || sellLimitOrder.Quantity == 0)
            {
                return;
            }

            double matchPrice = FindMatchPrice(buyLimitOrder, sellLimitOrder);

            int matchQuantity = FindMatchQuantity(buyLimitOrder, sellLimitOrder);

            if (matchQuantity == 0)
            {
                return;
            }

            buyLimitOrder.Modify(buyLimitOrder.Quantity - matchQuantity);
            sellLimitOrder.Modify(sellLimitOrder.Quantity - matchQuantity);

            var execution = new NewExecution(buyLimitOrder, sellLimitOrder, matchQuantity, matchPrice, dateService.UtcNow());

            for (int i = 0; i < executionHandlers.Count; i++)
            {
                executionHandlers[i].Invoke(execution);
            }
        }
Example #3
0
        /// <summary>
        /// New Tick Arrived from Simulated Market Data Exchange
        /// </summary>
        /// <param name="tick"></param>
        public void NewTickArrived(Tick tick)
        {
            try
            {
                lock (_marketOrders)
                {
                    var selectedlist = _marketOrders.Where(x => x.Security.Symbol == tick.Security.Symbol);
                    foreach (var marketOrder in selectedlist)
                    {
                        _marketOrders.Remove(marketOrder);

                        var newExecution =
                            new Execution(
                                new Fill(marketOrder.Security, marketOrder.OrderExecutionProvider,
                                         marketOrder.OrderID)
                        {
                            ExecutionDateTime      = tick.DateTime,
                            ExecutionPrice         = tick.LastPrice,
                            ExecutionSize          = marketOrder.OrderSize,
                            AverageExecutionPrice  = tick.LastPrice,
                            ExecutionId            = Guid.NewGuid().ToString(),
                            ExecutionSide          = marketOrder.OrderSide,
                            ExecutionType          = ExecutionType.Fill,
                            LeavesQuantity         = 0,
                            OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                            CummalativeQuantity    = marketOrder.OrderSize
                        }, marketOrder);
                        if (NewExecution != null)
                        {
                            NewExecution.Invoke(newExecution);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "NewTickArrived");
            }
        }
Example #4
0
        public void TryMatch(ILimitOrder buyLimitOrder, IMarketOrder sellMarketOrder)
        {
            if (sellMarketOrder.Way != WayEnum.Sell || buyLimitOrder.Way != WayEnum.Buy)
            {
                return;
            }

            if (sellMarketOrder.Symbol != buyLimitOrder.Symbol)
            {
                return;
            }

            if (sellMarketOrder.Quantity == 0 || buyLimitOrder.Quantity == 0)
            {
                return;
            }

            int matchQuantity = FindMatchQuantity(sellMarketOrder, buyLimitOrder);

            if (matchQuantity == 0)
            {
                return;
            }

            double matchPrice = buyLimitOrder.Price;

            sellMarketOrder.Modify(sellMarketOrder.Quantity - matchQuantity);
            buyLimitOrder.Modify(buyLimitOrder.Quantity - matchQuantity);

            var execution = new NewExecution(buyLimitOrder, sellMarketOrder, matchQuantity, matchPrice, dateService.UtcNow());

            for (int i = 0; i < executionHandlers.Count; i++)
            {
                executionHandlers[i].Invoke(execution);
            }
        }
        /// <summary>
        /// Executes accepted market order
        /// </summary>
        /// <param name="limitOrder">TradeHub Limit Order</param>
        private void ExecuteLimitOrder(LimitOrder limitOrder)
        {
            try
            {
                DateTime[] ticksCollectionKeys;
                lock (_ticksCollection)
                {
                    ticksCollectionKeys = _ticksCollection.Keys.ToArray();
                }

                foreach (DateTime key in ticksCollectionKeys)
                {
                    if (key > limitOrder.OrderDateTime)
                    {
                        Tick tick;
                        if (_ticksCollection.TryGetValue(key, out tick))
                        {
                            #region BUY Order

                            if (limitOrder.OrderSide == OrderSide.BUY &&
                                tick.LastPrice <= limitOrder.LimitPrice)
                            {
                                var newExecution =
                                    new Execution(
                                        new Fill(limitOrder.Security, limitOrder.OrderExecutionProvider,
                                                 limitOrder.OrderID)
                                {
                                    ExecutionDateTime      = tick.DateTime,
                                    ExecutionPrice         = limitOrder.LimitPrice,
                                    ExecutionSize          = limitOrder.OrderSize,
                                    AverageExecutionPrice  = tick.LastPrice,
                                    ExecutionId            = Guid.NewGuid().ToString(),
                                    ExecutionSide          = limitOrder.OrderSide,
                                    ExecutionType          = ExecutionType.Fill,
                                    LeavesQuantity         = 0,
                                    OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                                    CummalativeQuantity    = limitOrder.OrderSize
                                }, limitOrder);
                                if (NewExecution != null)
                                {
                                    NewExecution.Invoke(newExecution);
                                }

                                if (Logger.IsDebugEnabled)
                                {
                                    Logger.Debug("Limit Order Executed using:" + tick, _type.FullName, "ExecuteLimitOrder");
                                }

                                return;
                            }

                            #endregion

                            #region SELL Order

                            if (limitOrder.OrderSide == OrderSide.SELL &&
                                tick.LastPrice > limitOrder.LimitPrice)
                            {
                                var newExecution =
                                    new Execution(
                                        new Fill(limitOrder.Security, limitOrder.OrderExecutionProvider,
                                                 limitOrder.OrderID)
                                {
                                    ExecutionDateTime      = tick.DateTime,
                                    ExecutionPrice         = limitOrder.LimitPrice,
                                    ExecutionSize          = limitOrder.OrderSize,
                                    AverageExecutionPrice  = tick.LastPrice,
                                    ExecutionId            = Guid.NewGuid().ToString(),
                                    ExecutionSide          = limitOrder.OrderSide,
                                    ExecutionType          = ExecutionType.Fill,
                                    LeavesQuantity         = 0,
                                    OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                                    CummalativeQuantity    = limitOrder.OrderSize
                                }, limitOrder);
                                if (NewExecution != null)
                                {
                                    NewExecution.Invoke(newExecution);
                                }

                                if (Logger.IsDebugEnabled)
                                {
                                    Logger.Debug("Limit Order Executed using:" + tick, _type.FullName, "ExecuteLimitOrder");
                                }

                                return;
                            }

                            #endregion
                        }
                    }
                }

                //foreach (KeyValuePair<DateTime, Tick> keyValuePair in _ticksCollection)
                //{
                //    if (keyValuePair.Key > limitOrder.OrderDateTime)
                //    {
                //        #region BUY Order

                //        if (limitOrder.OrderSide == OrderSide.BUY &&
                //            keyValuePair.Value.LastPrice <= limitOrder.LimitPrice)
                //        {
                //            var newExecution =
                //                new Execution(
                //                    new Fill(limitOrder.Security, limitOrder.OrderExecutionProvider,
                //                             limitOrder.OrderID)
                //                        {
                //                            ExecutionDateTime = keyValuePair.Value.DateTime,
                //                            ExecutionPrice = limitOrder.LimitPrice,
                //                            ExecutionSize = limitOrder.OrderSize,
                //                            AverageExecutionPrice = keyValuePair.Value.LastPrice,
                //                            ExecutionId = Guid.NewGuid().ToString(),
                //                            ExecutionSide = limitOrder.OrderSide,
                //                            ExecutionType = ExecutionType.Fill,
                //                            LeavesQuantity = 0,
                //                            OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                //                            CummalativeQuantity = limitOrder.OrderSize
                //                        }, limitOrder);
                //            if (NewExecution != null)
                //            {
                //                NewExecution.Invoke(newExecution);
                //            }

                //            if (Logger.IsDebugEnabled)
                //            {
                //                Logger.Debug("Limit Order Executed using:" + keyValuePair.Value, _type.FullName,
                //                             "ExecuteLimitOrder");
                //            }

                //            return;
                //        }

                //        #endregion

                //        #region SELL Order

                //        if (limitOrder.OrderSide == OrderSide.SELL &&
                //            keyValuePair.Value.LastPrice > limitOrder.LimitPrice)
                //        {
                //            var newExecution =
                //                new Execution(
                //                    new Fill(limitOrder.Security, limitOrder.OrderExecutionProvider,
                //                             limitOrder.OrderID)
                //                        {
                //                            ExecutionDateTime = keyValuePair.Value.DateTime,
                //                            ExecutionPrice = limitOrder.LimitPrice,
                //                            ExecutionSize = limitOrder.OrderSize,
                //                            AverageExecutionPrice = keyValuePair.Value.LastPrice,
                //                            ExecutionId = Guid.NewGuid().ToString(),
                //                            ExecutionSide = limitOrder.OrderSide,
                //                            ExecutionType = ExecutionType.Fill,
                //                            LeavesQuantity = 0,
                //                            OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                //                            CummalativeQuantity = limitOrder.OrderSize
                //                        }, limitOrder);
                //            if (NewExecution != null)
                //            {
                //                NewExecution.Invoke(newExecution);
                //            }

                //            if (Logger.IsDebugEnabled)
                //            {
                //                Logger.Debug("Limit Order Executed using:" + keyValuePair.Value, _type.FullName,
                //                             "ExecuteLimitOrder");
                //            }

                //            return;
                //        }

                //        #endregion
                //    }
                //}

                // Add to List
                _limitOrders.Add(limitOrder);
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "ExecuteLimitOrder");
            }
        }
        /// <summary>
        /// New Are Arrived From Simulated data service.
        /// </summary>
        /// <param name="bar"></param>
        public void NewBarArrived(Bar bar)
        {
            try
            {
                lock (_limitOrders)
                {
                    var selectedlist = _limitOrders.Where(x => x.Security.Symbol == bar.Security.Symbol);
                    foreach (var limitOrder in selectedlist.ToList())
                    {
                        if (limitOrder.Security.Symbol == bar.Security.Symbol)
                        {
                            if (limitOrder.OrderSide == OrderSide.BUY && bar.Low <= limitOrder.LimitPrice)
                            {
                                var newExecution =
                                    new Execution(
                                        new Fill(limitOrder.Security, limitOrder.OrderExecutionProvider,
                                                 limitOrder.OrderID)
                                {
                                    DateTime               = bar.DateTime,
                                    ExecutionPrice         = limitOrder.LimitPrice,
                                    ExecutionSize          = limitOrder.OrderSize,
                                    AverageExecutionPrice  = bar.Close,
                                    ExecutionId            = Guid.NewGuid().ToString(),
                                    ExecutionSide          = limitOrder.OrderSide,
                                    ExecutionType          = ExecutionType.Fill,
                                    LeavesQuantity         = 0,
                                    OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                                    CummalativeQuantity    = limitOrder.OrderSize
                                }, limitOrder);
                                if (NewExecution != null)
                                {
                                    NewExecution.Invoke(newExecution);
                                }
                                _limitOrders.Remove(limitOrder);
                            }

                            if (limitOrder.OrderSide == OrderSide.SELL && bar.Low > limitOrder.LimitPrice)
                            {
                                var newExecution =
                                    new Execution(
                                        new Fill(limitOrder.Security, limitOrder.OrderExecutionProvider,
                                                 limitOrder.OrderID)
                                {
                                    DateTime               = bar.DateTime,
                                    ExecutionPrice         = limitOrder.LimitPrice,
                                    ExecutionSize          = limitOrder.OrderSize,
                                    AverageExecutionPrice  = bar.Close,
                                    ExecutionId            = Guid.NewGuid().ToString(),
                                    ExecutionSide          = limitOrder.OrderSide,
                                    ExecutionType          = ExecutionType.Fill,
                                    LeavesQuantity         = 0,
                                    OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                                    CummalativeQuantity    = limitOrder.OrderSize
                                }, limitOrder);
                                if (NewExecution != null)
                                {
                                    NewExecution.Invoke(newExecution);
                                }
                                _limitOrders.Remove(limitOrder);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "NewBarArrived");
            }
        }
Example #7
0
        public static void ConsoleMain( string[] startupArgs, Option StartupOptions )
        {
            Arguments args = new Arguments( startupArgs );
            Console.Title = "GridMapper";

            if ( StartupOptions.CmdConsole )
            {
                ConsoleHelper.DeletePath();
            }

            bool console = StartupOptions.CmdConsole;
            int maxTasks;
            //help message get priority over everything
            if ( args.IsTrue( "h" ) || args.IsTrue( "?" ) || args.IsTrue( "help" ) ||
                 args.Exists( "h" ) || args.Exists( "?" ) || args.Exists( "help" ) )
            {
                ConsoleHelper.PrintHelp();
            }
            else
            {
                Repository.OnRepositoryUpdated += DoNothing;
                OwnPacketReceiver.EndOfScan += ScanEnded;
                t.Interval = 50;
                t.Elapsed += timer_Tick;
                StartupOptions.CmdConsole = true;
                if ( args.IsTrue( "auto" ) || args.Exists( "auto" ) )
                {
                    _exe = new NewExecution( StartupOptions );
                    _exe.TaskCompleted += ProgressChanged;
                    LaunchScan();
                }
                else
                {
                    if ( args.Exists( "IP" ) )
                    {
                        IPParserResult Ips = IPParser.TryParse( args.Single( "IP" ) );
                        if ( Ips.HasError == true )
                        {
                            Console.WriteLine( "Not a valid input for IP" );
                        }
                        else
                        {
                            StartupOptions.IpToTest = Ips;
                        }
                    }
                    //if ( args.Exists( "p" ) )
                    //{
                    //PortsParserResult PortsToHandle = PortsParser.MainPortsParser(args.Single("p"));
                    //IEnumerator enumerator = PortsToHandle.Result.GetEnumerator();
                    //}
                    //if ( args.Exists( "t" ) || args.Exists( "tasks" ) )
                    //{
                    //    if ( int.TryParse( args.Single( "t" ), out maxTasks ) || int.TryParse( args.Single( "tasks" ), out maxTasks ) )
                    //    {
                    //        if ( maxTasks >= 1 && maxTasks <= 2000 )
                    //        {
                    //            StartupOptions.MaximumTasks = maxTasks;
                    //        }
                    //        else
                    //        {
                    //            Console.WriteLine( "The number of tasks must be between 1 and 2000, reasonnable limit is around 4" );
                    //        }
                    //    }
                    //    else
                    //    {
                    //        Console.WriteLine( "Invalid argument for -t" );
                    //    }
                    //}
                    _exe = new NewExecution( StartupOptions );
                    _exe.TaskCompleted += ProgressChanged;
                    LaunchScan();
                }

            }

            if ( console )
            {
                ConsoleHelper.ShowPath();
            }
            else
            {
                ConsoleHelper.EndOfProgram();
            }
        }
Example #8
0
        /// <summary>
        /// Executes accepted market order
        /// </summary>
        /// <param name="marketOrder">TradeHub Market Order</param>
        private void ExecuteMarketOrder(MarketOrder marketOrder)
        {
            try
            {
                Tick     tick = null;
                DateTime key;

                if (marketOrder.OrderDateTime.Hour.Equals(15) && marketOrder.OrderDateTime.Minute.Equals(58) && marketOrder.OrderDateTime.Second.Equals(56))
                {
                    key = marketOrder.OrderDateTime.AddHours(17);
                    key = key.AddMinutes(32);
                    key = key.AddSeconds(-42);
                }
                else if (marketOrder.OrderDateTime.Second == 56 || marketOrder.OrderDateTime.Second == 11)
                {
                    key = marketOrder.OrderDateTime.AddSeconds(18);
                }
                else
                {
                    key = marketOrder.OrderDateTime.AddSeconds(14);
                }

                #region Create Execution Message

                while (true)
                {
                    if (_ticksCollection.TryGetValue(key, out tick))
                    {
                        var newExecution =
                            new Execution(
                                new Fill(marketOrder.Security, marketOrder.OrderExecutionProvider,
                                         marketOrder.OrderID)
                        {
                            ExecutionDateTime      = tick.DateTime,
                            ExecutionPrice         = tick.LastPrice,
                            ExecutionSize          = marketOrder.OrderSize,
                            AverageExecutionPrice  = tick.LastPrice,
                            ExecutionId            = Guid.NewGuid().ToString(),
                            ExecutionSide          = marketOrder.OrderSide,
                            ExecutionType          = ExecutionType.Fill,
                            LeavesQuantity         = 0,
                            OrderExecutionProvider = OrderExecutionProvider.SimulatedExchange,
                            CummalativeQuantity    = marketOrder.OrderSize
                        }, marketOrder);
                        if (NewExecution != null)
                        {
                            NewExecution.Invoke(newExecution);
                        }

                        if (Logger.IsDebugEnabled)
                        {
                            Logger.Debug("Market Order Executed using:" + tick, _type.FullName, "ExecuteMarketOrder");
                        }
                        break;
                    }

                    // Try to get the tick from next minute if the key is not found
                    key = key.AddMinutes(1);
                }

                #endregion
            }
            catch (Exception exception)
            {
                Logger.Error(exception, _type.FullName, "ExecuteMarketOrder");
            }
        }