using System;
using System.Linq;
using System.Security;
using System.Windows;
using Ecng.Common;
using Ecng.Xaml;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Testing;
using StockSharp.BusinessEntities;
using StockSharp.Fix;
using StockSharp.Messages;
using StockSharp.Quik;
using StockSharp.Quik.Lua;

namespace TestBag01
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public Connector _trader;
        private Portfolio _portfolio;
        private Strategy _strategy;
        private Security _ri;

        public MainWindow()
        {
            InitializeComponent();
            _portfolio = new Portfolio { Name = "test", BeginValue = 1000000 };

            //var quikMd = new FixMessageAdapter(new MillisecondIncrementalIdGenerator())
            var quikMd = new LuaFixMarketDataMessageAdapter(new MillisecondIncrementalIdGenerator())
            {
                Login = "quik",
                Password = "quik".To<SecureString>(),
                Address = QuikTrader.DefaultLuaAddress,
                TargetCompId = "StockSharpMD",
                SenderCompId = "quik",
                Dialect = FixDialects.QuikServer,
                RequestAllSecurities = true,
            };

            _trader = new RealTimeEmulationTrader<IMessageAdapter>(quikMd, _portfolio);

            _trader.Connected += () =>
            {
                // передаем первоначальное значение размера портфеля в эмулятор
                ((BaseEmulationConnector)_trader).TransactionAdapter.SendInMessage(_portfolio.ToMessage());
                ((BaseEmulationConnector)_trader).TransactionAdapter.SendInMessage(new PortfolioChangeMessage
                {
                    PortfolioName = _portfolio.Name
                }.Add(PositionChangeTypes.BeginValue, _portfolio.BeginValue));
            };

            _trader.NewSecurities += _trader_NewSecurities;

            _trader.Connect();
        }

        private void _trader_NewSecurities(System.Collections.Generic.IEnumerable<Security> obj)
        {
            Console.WriteLine(@"Получили инструмент {0}", obj);
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            _ri = _trader.Securities.FirstOrDefault(security => security.Id == "RIH7@FORTS");
            if (_ri != null)
            {
                _trader.RegisterMarketDepth(_ri); _trader.RegisterSecurity(_ri); _trader.RegisterTrades(_ri);
            }
            else
            {
                Console.WriteLine("Инструмент не найден");
            }
            // запускаем стратегию
            try
            {
                _strategy = new Strategy02()
                {
                    Connector = _trader,
                    Portfolio = _portfolio,
                    Security = _ri,
                    Volume = 1
                };

                //Событие изменения позиции
                _strategy.PositionChanged += () => this.GuiAsync(() =>
                {
                    Console.WriteLine(@"Изменение позы " + _strategy.Position);
                });

                //Событие появления новых сделок, по нашим заявкам
                _strategy.NewMyTrade += trade => this.GuiAsync(() =>
                {
                    Console.WriteLine(@"Событие появления новых сделок, по нашим заявкам" + _strategy.MyTrades.Count());
                });
                //Событие регистрации заявки
                _strategy.OrderRegistered += order => this.GuiAsync(() =>
                {
                    Console.WriteLine(@"Событие регистрации заявки " + _strategy.Orders.Count());
                });
                // Событие об ошибке регистрации заявки
                _strategy.OrderRegisterFailed += orderFail => Console.WriteLine(orderFail.Error.Message);
                _strategy.Start();
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.Message, "Ошибка запуска стратегии");
                throw;
            }
        }
    }
}
