namespace SampleConsole
{
	using System;
	using System.Linq;
	using System.Threading;
	using Ecng.Common;
        using StockSharp.BusinessEntities;
	using StockSharp.Quik;
	using StockSharp.Algo;
	class Program
	{
		private static Security _SRH2;
		private static Portfolio _portfolio;
		private static MarketDepth _depth;
        static void Main()
		{
			try
			{
				// для теста выбираем бумагу SRH2
				const string secCode = "SRH2";
				var quikPath = QuikTerminal.GetDefaultPath();
				if (quikPath.IsEmpty())
				{
					Console.WriteLine("Не найден ни один запущенный Quik");
					return;
				}
				Console.WriteLine("Запущенный Quik найден по пути " + quikPath);
				Console.Write("Введите код клиента, через который будет выставлена заявка: ");
				var account = Console.ReadLine();
				using (var waitHandle = new AutoResetEvent(false))
				{
					// создаем шлюз к Quik-у
					using (var trader = new QuikTrader(quikPath))
					{
						// необходимо раскомментировать, если идет работа с РТС Стандарт
						//trader.FormatTransaction += builder => builder.RemoveInstruction(TransactionBuilder.ExecutionCondition);
						// подписываемся на событие успешного подключения
						// все действия необходимо производить только после подключения
						trader.Connected += () =>
						{
							Console.WriteLine("Подключение было произведено успешно.");
							// извещаем об успешном соединени
							waitHandle.Set();
						};
						Console.WriteLine("Производим подключение...");
						trader.Connect();
						// дожидаемся события об успешном соединении
						waitHandle.WaitOne();
						trader.NewPortfolios += portfolios =>
						{
							if (_portfolio == null)
							{
								// находим Лукойл и присваиваем ее переменной Srh2
								_portfolio = portfolios.FirstOrDefault(p => p.Name == account);
								if (_portfolio != null)
								{
									Console.WriteLine("Портфель {0} появился.", account);
									// если инструмент и стакан уже появились,
									// то извещаем об этом основной поток для выставления заявки
									if (_SRH2 != null && _depth != null)
										waitHandle.Set();
								}
							}
						};
						// подписываемся на событие появление инструментов
						trader.NewSecurities += securities =>
						{
                            if (_SRH2 == null)
							{
								// находим Лукойл и присваиваем ее переменной Srh2
                                _SRH2 = securities.FirstOrDefault(sec => sec.Code == secCode);
                                if (_SRH2 != null)
								{
									Console.WriteLine("Инструмент SRH2 появился.");
									// запускаем экспорт стакана
                                    trader.RegisterQuotes(_SRH2);
									if (_portfolio != null && _depth != null)
										waitHandle.Set();
								}
							}
						};
						// подписываемся на событие появления моих новых сделок
						trader.NewMyTrades += myTrades =>
						{
							foreach (var myTrade in myTrades)
							{
								var trade = myTrade.Trade;
								Console.WriteLine("Сделка {0} по цене {1} по бумаге {2} по объему {3} в {4}.", trade.Id, trade.Price, trade.Security.Code, trade.Volume, trade.Time);
							}
						};
						// подписываемся на событие обновления стакана
						trader.QuotesChanged += depths =>
						{
                            if (_depth == null && _SRH2 != null)
							{
                                _depth = depths.FirstOrDefault(d => d.Security == _SRH2);
								if (_depth != null)
								{
									Console.WriteLine("Стакан SRH2 появился.");
									// если портфель и инструмент уже появился, то извещаем об этом основной поток для выставления заявки
                                    if (_portfolio != null && _SRH2 != null)
										waitHandle.Set();
								}
							}
						};
						Console.WriteLine("Дожидаемся появления в программе инструмента SRH2 и портфеля {0}...".Put(account));
                       // запускаем экспорт по DDE
					//trader.StartExport();     
                    trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
           trader.EquityPortfoliosTable, trader.OrdersTable, trader.DerivativePositionsTable, trader.DerivativePortfoliosTable);
						// дожидаемся появления портфеля и инструмента
						waitHandle.WaitOne();
						// 0.1% от изменения цены
						const decimal delta = 0.001m;
						// запоминаем первоначальное значение середины спреда
                        var firstMid = _SRH2.BestPair.SpreadPrice / 2;
                        if (_SRH2.BestBid == null)
							throw new Exception("Нет лучшего бида для котировки.");
                        Console.WriteLine("Первоначальное значение середины спреда {0:0.##}", _SRH2.BestBid.Price + firstMid);
						while (true)
						{
                            var mid = _SRH2.BestPair.SpreadPrice / 2;
							// если спред вышел за пределы нашего диапазона
							if	(
									((firstMid + firstMid * delta) <= mid) ||
									((firstMid - firstMid * delta) >= mid)
								)
							{
								var order = new Order
								{
									Portfolio = _portfolio,
                                    Price = _SRH2.ShrinkPrice(_SRH2.BestBid.Price + mid),
                                    Security = _SRH2,
									Volume = 1,
									Direction = OrderDirections.Buy,
								};
								trader.RegisterOrder(order);
								Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
								break;
							}
							else
                                Console.WriteLine("Текущее значение середины спреда {0:0.##}", _SRH2.BestBid.Price + mid);
							// ждем 1 секунду
							Thread.Sleep(1000);
						}
						// останавливаем экспорт по DDE
                   // trader.StopExport();
                
                        trader.StopExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable,
              trader.EquityPortfoliosTable, trader.OrdersTable, trader.DerivativePositionsTable, trader.DerivativePortfoliosTable);
                    
                
                      }
                    
                      
				}
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex);
			}
		}
	}
}