using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MoreLinq;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Logging;
using StockSharp.Quik;
using LogManager = DevExpress.Xpo.Logger.LogManager;

namespace TestData01
{
    class Program
    {
        private static QuikTrader _connector;
        private static Portfolio _portfolio;
        private static Security _security, _ri, _si, _sb;

        static AutoResetEvent _handler;
        private static DateTime _startTime;

        static void Main(string[] args)
        {
            _connector = new QuikTrader(QuikTerminal.GetDefaultPath());

            _handler = new AutoResetEvent(false);

            _connector.Connected += () =>
            {
                Console.WriteLine(@"Соединение установлено!");
            };

            _connector.Disconnected += () =>
            {
                Console.WriteLine(@"Соединение разорвано!");
            };

            _connector.NewPortfolios += portfolios =>
            {
                portfolios.ForEach(portfolio =>
                {
                    Console.WriteLine(@"Получен портфель: {0}", portfolio.Name);

                    _connector.RegisterPortfolio(portfolio);
                    
                    //вставте свой портфель
                    if (portfolio.Name == "7600v7m") _portfolio = portfolio;
                });
            };

            _connector.NewSecurities += _connector_NewSecurities;
            _connector.NewTrades += Connector_NewTrades;
            _connector.Connect();

            _handler.WaitOne();

            _startTime = DateTime.Now+TimeSpan.FromSeconds(30);

            Console.WriteLine(@"Время старта = {0} смотри окно вывода ", _startTime);

            Console.Read();

            _connector.Disconnect();

            // Ждет, пока последовательно не будут нажаты клаваши Q и Enter,
            // после чего программа завершит работу
            while (Console.ReadLine().ToUpper() != "Q") ;
        }

        private static void _connector_NewSecurities(IEnumerable<Security> securities)
        {
            securities.ForEach(s =>
            {
                if (s.Id == "SIH7@FORTS")
                {
                    Registracija(s);
                    _si = s;
                }
                if (s.Id == "RIH7@FORTS")
                {
                    Registracija(s);
                    _ri = s;
                    _security = s;
                }
                if (s.Id == "SBER@TQBR")
                {
                    Registracija(s);
                    _sb = s;
                }
            });

            if (_si!=null && _ri!=null && _sb!=null) _handler.Set();
        }

        private static void Registracija(Security security)
        {
            //Console.WriteLine(@"Получили {0}", security.Id);
            try
            {
                //_connector.RegisterMarketDepth(security);
                _connector.RegisterSecurity(security);
                _connector.RegisterTrades(security);
                Console.WriteLine(@"{0} - зарегестрирован, все ок", security);
            }
            catch (Exception ecx)
            {
                Console.WriteLine(ecx.Message, @" Ошибка регистрации ", security);
                throw;
            }

        }

        private static void Connector_NewTrades(IEnumerable<StockSharp.BusinessEntities.Trade> trades)
        {
            foreach (var trade in trades)
            {
                // пропускаем историю
                if (trade.Time.DateTime <= _startTime) return;
                // пропускаем null
                if(trade.Security.BestAsk ==null || trade.Security.BestBid==null) return;

                // если сделка за пределами спреда, то делаем вывод в окно
                if (trade.Price > trade.Security.BestAsk.Price || trade.Price < trade.Security.BestBid.Price)
                {
                    Debug.Print(
                        @"Сбой {0} время {1} price {2} ОИ {3} Пок {4} Прод {5} BestAsk={6} BestBid={7} LastTrade={8}",
                        trade.Security, trade.Time.DateTime, trade.Price,
                        trade.OpenInterest, trade.Security.AsksCount, trade.Security.BidsCount,
                        trade.Security.BestAsk, trade.Security.BestBid, trade.Security.LastTrade.Price);
                }
            }
        }

    }
}
