static void Main(string[] args) { _logManager = new LogManager(); _logManager.Listeners.Add(new FileLogListener("log.log") { LogDirectory = "Logs" }); BasketMessageAdapter realAdapter = new BasketMessageAdapter(new MillisecondIncrementalIdGenerator()); // Можно использовать два варианта создания коннектора // 1 вариант. Из файла настроек connection.xml. Чтобы создать файл настроек запустите пример // SampleRealTimeEmulation из поставочного комплекта s# и создайте соединение для коннектора // Quik. Обратите внимание, что нужно добавлять только MarketDataAdapter, т.к. в нашем случае // используется специальный эмуляционный TransactionAdapter, который создает сам RealTimeEmulationTrader. // 2 вариант. Самостоятельно создаем адаптер // В этом примере показаны два варианта. if (File.Exists(_settingsFile)) { // Создаем адаптер из файла настроек realAdapter.Load(new XmlSerializer <SettingsStorage>().Deserialize(_settingsFile)); realAdapter.InnerAdapters.ForEach(a => a.RemoveTransactionalSupport()); } else { // Создаем адаптер "вручную realAdapter.AssociatedBoardCode = "ALL"; realAdapter.LogLevel = LogLevels.Inherit; realAdapter.InnerAdapters.Add(new LuaFixMarketDataMessageAdapter(realAdapter.TransactionIdGenerator) { Dialect = StockSharp.Fix.FixDialects.Default, SenderCompId = "quik", TargetCompId = "StockSharpMD", Login = "******", Password = "******".To <SecureString>(), Address = "localhost:5001".To <EndPoint>(), RequestAllPortfolios = false, RequestAllSecurities = true, IsResetCounter = true, ReadTimeout = TimeSpan.Zero, WriteTimeout = TimeSpan.Zero, HeartbeatInterval = TimeSpan.Zero, SupportedMessages = new MessageTypes[] { MessageTypes.MarketData, MessageTypes.SecurityLookup, MessageTypes.ChangePassword }, AssociatedBoardCode = "ALL", LogLevel = LogLevels.Inherit }); } // Добавляем адаптер к коннектору _connector = new RealTimeEmulationTrader <IMessageAdapter>(realAdapter); _connector.EmulationAdapter.Emulator.Settings.TimeZone = TimeHelper.Est; _connector.EmulationAdapter.Emulator.Settings.ConvertTime = true; _logManager.Sources.Add(_connector); _logManager.Sources.Add(_connector); _handler = new AutoResetEvent(false); bool isHandlerSet = false; var _sendCancelOrders = new List <Order>(); _connector.Connected += () => { Console.WriteLine("Соединение установлено!"); }; _connector.Disconnected += () => { Console.WriteLine("Соединение разорвано!"); Console.WriteLine("Для выхода нажмите Q и Enter."); }; _connector.NewPortfolios += portfolios => { portfolios.ForEach(portfolio => { Console.WriteLine("Получен портфель: {0}", portfolio.Name); _connector.RegisterPortfolio(portfolio); _portfolio = portfolio; }); }; _connector.NewSecurities += securities => { securities.ForEach(s => { if (s.Id == _securityId) { _security = s; _connector.RegisterSecurity(s); _handler.Set(); } }); }; _connector.ValuesChanged += (security, values, stime, ltime) => { //TODO }; _connector.PortfoliosChanged += portfolios => { Debug.WriteLine("Изменение состояния портфелей."); var sb = new StringBuilder(); portfolios.ForEach(p => { sb.AppendFormat("Name: {0}{1}", p.Name, Environment.NewLine); sb.AppendFormat("AveragePrice: {0}{1}", p.AveragePrice, Environment.NewLine); sb.AppendFormat("BeginValue: {0}{1}", p.BeginValue, Environment.NewLine); sb.AppendFormat("BlockedValue: {0}{1}", p.BlockedValue, Environment.NewLine); sb.AppendFormat("Board: {0}{1}", p.Board, Environment.NewLine); sb.AppendFormat("Commission: {0}{1}", p.Commission, Environment.NewLine); sb.AppendFormat("CurrentPrice: {0}{1}", p.CurrentPrice, Environment.NewLine); sb.AppendFormat("CurrentValue: {0}{1}", p.CurrentValue, Environment.NewLine); sb.AppendFormat("Leverage: {0}{1}", p.Leverage, Environment.NewLine); sb.AppendFormat("RealizedPnL: {0}{1}", p.RealizedPnL, Environment.NewLine); sb.AppendFormat("UnrealizedPnL: {0}{1}", p.UnrealizedPnL, Environment.NewLine); sb.AppendFormat("VariationMargin: {0}{1}", p.VariationMargin, Environment.NewLine); Debug.WriteLine(sb.ToString()); sb.Clear(); }); }; _connector.NewPositions += positions => { Debug.WriteLine("Новые позиции."); PrintPositions(positions); }; _connector.PositionsChanged += positions => { Debug.WriteLine("Изменение позиций."); PrintPositions(positions); }; _connector.NewOrders += orders => { orders.ForEach(o => Debug.WriteLine(string.Format("NewOrders. {0}", o))); }; _connector.OrdersChanged += orders => { orders.ForEach(o => { Debug.WriteLine(string.Format("OrdersChanged. {0}. IsMatched: {1}, IsCanceled : {2}", o, o.IsMatched().ToString(), o.IsCanceled().ToString())); }); }; _connector.OrdersRegisterFailed += fails => { fails.ForEach(f => Debug.WriteLine(string.Format("OrdersRegisterFailed. {0}", f.Error.Message))); }; _connector.OrdersCancelFailed += fails => { fails.ForEach(f => Debug.WriteLine(string.Format("OrdersCancelFailed. {0}", f.Error.Message))); }; _connector.NewMyTrades += trades => { trades.ForEach(t => Debug.WriteLine(string.Format("NewMyTrades. {0}", t.ToString()))); }; _connector.Connect(); _handler.WaitOne(); Console.WriteLine("Инструмент и портфель получены"); var order = new Order() { Security = _security, Portfolio = _portfolio, Type = OrderTypes.Market, Direction = Sides.Buy, Volume = 1 }; _connector.RegisterOrder(order); Console.WriteLine("ПОСЛАНА ЗАЯВКА"); Console.Read(); _connector.Disconnect(); // Ждет, пока последовательно не будут нажаты клаваши Q и Enter, // после чего программа завершит работу while (Console.ReadLine().ToUpper() != "Q") { ; } }