/// <summary> /// Configure connection using <see cref="ConnectorWindow"/>. /// </summary> /// <param name="adapter">The connection.</param> /// <param name="owner">UI thread owner.</param> /// <param name="autoConnect">Auto connect.</param> /// <returns><see langword="true"/> if the specified connection was configured, otherwise, <see langword="false"/>.</returns> public static bool Configure(this BasketMessageAdapter adapter, Window owner, ref bool autoConnect) { if (adapter == null) { throw new ArgumentNullException(nameof(adapter)); } if (owner == null) { throw new ArgumentNullException(nameof(owner)); } var wnd = new ConnectorWindow(); foreach (var a in Adapters) { AddConnectorInfo(wnd, a); } wnd.Adapter = (BasketMessageAdapter)adapter.Clone(); wnd.AutoConnect = autoConnect; if (!wnd.ShowModal(owner)) { return(false); } adapter.Load(wnd.Adapter.Save()); autoConnect = wnd.AutoConnect; return(true); }
/// <summary> /// Configure connection using <see cref="ConnectorWindow"/>. /// </summary> /// <param name="adapter">The connection.</param> /// <param name="owner">UI thread owner.</param> /// <returns><see langword="true"/> if the specified connection was configured, otherwise, <see langword="false"/>.</returns> public static bool Configure(this BasketMessageAdapter adapter, Window owner) { var autoConnect = false; SettingsStorage settings = null; return(adapter.Configure(owner, ref autoConnect, ref settings)); }
/// <summary> /// Configure connection using <see cref="ConnectorWindow"/>. /// </summary> /// <param name="adapter">The connection.</param> /// <param name="owner">UI thread owner.</param> /// <param name="autoConnect">Auto connect.</param> /// <returns><see langword="true"/> if the specified connection was configured, otherwise, <see langword="false"/>.</returns> public static bool Configure(this BasketMessageAdapter adapter, Window owner, ref bool autoConnect) { if (adapter == null) { throw new ArgumentNullException(nameof(adapter)); } if (owner == null) { throw new ArgumentNullException(nameof(owner)); } var wnd = new ConnectorWindow(); wnd.ConnectorsInfo.AddRange(_customConnections); AddConnectorInfo <AlfaDirectMessageAdapter>(wnd); AddConnectorInfo <BarChartMessageAdapter>(wnd); AddConnectorInfo <BitStampMessageAdapter>(wnd); AddConnectorInfo <BlackwoodMessageAdapter>(wnd); AddConnectorInfo <BtceMessageAdapter>(wnd); AddConnectorInfo <CqgComMessageAdapter>(wnd); AddConnectorInfo <CqgContinuumMessageAdapter>(wnd); AddConnectorInfo <ETradeMessageAdapter>(wnd); AddConnectorInfo <FixMessageAdapter>(wnd); AddConnectorInfo <InteractiveBrokersMessageAdapter>(wnd); AddConnectorInfo <IQFeedMarketDataMessageAdapter>(wnd); AddConnectorInfo <ItchMessageAdapter>(wnd); AddConnectorInfo <LmaxMessageAdapter>(wnd); AddConnectorInfo <MicexMessageAdapter>(wnd); AddConnectorInfo <OandaMessageAdapter>(wnd); AddConnectorInfo <OpenECryMessageAdapter>(wnd); AddConnectorInfo <PlazaMessageAdapter>(wnd); AddConnectorInfo <LuaFixTransactionMessageAdapter>(wnd); AddConnectorInfo <LuaFixMarketDataMessageAdapter>(wnd); AddConnectorInfo <QuikTrans2QuikAdapter>(wnd); AddConnectorInfo <QuikDdeAdapter>(wnd); AddConnectorInfo <RithmicMessageAdapter>(wnd); AddConnectorInfo <RssMarketDataMessageAdapter>(wnd); AddConnectorInfo <SmartComMessageAdapter>(wnd); AddConnectorInfo <SterlingMessageAdapter>(wnd); AddConnectorInfo <TransaqMessageAdapter>(wnd); AddConnectorInfo <TwimeMessageAdapter>(wnd); AddConnectorInfo <SpbExMessageAdapter>(wnd); wnd.Adapter = (BasketMessageAdapter)adapter.Clone(); wnd.AutoConnect = autoConnect; if (!wnd.ShowModal(owner)) { return(false); } adapter.Load(wnd.Adapter.Save()); autoConnect = wnd.AutoConnect; return(true); }
/// <summary> /// Configure connection using <see cref="ConnectorWindow"/>. /// </summary> /// <param name="adapter">The connection.</param> /// <param name="owner">UI thread owner.</param> /// <param name="autoConnect">Auto connect.</param> /// <returns><see langword="true"/> if the specified connection was configured, otherwise, <see langword="false"/>.</returns> public static bool Configure(this BasketMessageAdapter adapter, Window owner, ref bool autoConnect) { if (adapter == null) { throw new ArgumentNullException(nameof(adapter)); } if (owner == null) { throw new ArgumentNullException(nameof(owner)); } var wnd = new ConnectorWindow(); wnd.ConnectorsInfo.AddRange(_customConnections); AddConnectorInfo(wnd, typeof(AlfaDirectMessageAdapter)); AddConnectorInfo(wnd, typeof(BarChartMessageAdapter)); AddConnectorInfo(wnd, typeof(BitStampMessageAdapter)); AddConnectorInfo(wnd, typeof(BlackwoodMessageAdapter)); AddConnectorInfo(wnd, typeof(BtceMessageAdapter)); AddConnectorInfo(wnd, typeof(CQGMessageAdapter)); AddConnectorInfo(wnd, typeof(ETradeMessageAdapter)); AddConnectorInfo(wnd, typeof(FixMessageAdapter)); AddConnectorInfo(wnd, typeof(InteractiveBrokersMessageAdapter)); AddConnectorInfo(wnd, typeof(IQFeedMarketDataMessageAdapter)); AddConnectorInfo(wnd, typeof(ItchMessageAdapter)); AddConnectorInfo(wnd, typeof(LmaxMessageAdapter)); AddConnectorInfo(wnd, typeof(MicexMessageAdapter)); AddConnectorInfo(wnd, typeof(OandaMessageAdapter)); AddConnectorInfo(wnd, typeof(OpenECryMessageAdapter)); AddConnectorInfo(wnd, typeof(PlazaMessageAdapter)); AddConnectorInfo(wnd, typeof(LuaFixTransactionMessageAdapter)); AddConnectorInfo(wnd, typeof(LuaFixMarketDataMessageAdapter)); AddConnectorInfo(wnd, typeof(QuikTrans2QuikAdapter)); AddConnectorInfo(wnd, typeof(QuikDdeAdapter)); AddConnectorInfo(wnd, typeof(RithmicMessageAdapter)); AddConnectorInfo(wnd, typeof(RssMarketDataMessageAdapter)); AddConnectorInfo(wnd, typeof(SmartComMessageAdapter)); AddConnectorInfo(wnd, typeof(SterlingMessageAdapter)); AddConnectorInfo(wnd, typeof(TransaqMessageAdapter)); AddConnectorInfo(wnd, typeof(TwimeMessageAdapter)); wnd.Adapter = (BasketMessageAdapter)adapter.Clone(); wnd.AutoConnect = autoConnect; if (!wnd.ShowModal(owner)) { return(false); } adapter.Load(wnd.Adapter.Save()); autoConnect = wnd.AutoConnect; return(true); }
public StrategyConnector() { EntityFactory = _entityFactory = new StrategyEntityFactory(); SessionHolder = BasketSessionHolder = new BasketSessionHolder(TransactionIdGenerator); TransactionAdapter = new BasketMessageAdapter(MessageAdapterTypes.Transaction, BasketSessionHolder); MarketDataAdapter = new BasketMessageAdapter(MessageAdapterTypes.MarketData, BasketSessionHolder); ApplyMessageProcessor(MessageDirections.In, true, true); ApplyMessageProcessor(MessageDirections.Out, true, true); }
public StudioConnector() { EntityFactory = new StudioEntityFactory(this); SessionHolder = _sessionHolder = new BasketSessionHolder(TransactionIdGenerator); MarketDataAdapter = _marketDataAdapter = new StudioMarketDataAdapter(_sessionHolder); TransactionAdapter = _transactionAdapter = new BasketMessageAdapter(MessageAdapterTypes.Transaction, _sessionHolder); ApplyMessageProcessor(MessageDirections.In, true, false); ApplyMessageProcessor(MessageDirections.In, false, true); ApplyMessageProcessor(MessageDirections.Out, true, true); _transactionAdapter.NewOutMessage += TransactionAdapterNewOutMessage; CreateEmulationSessionHolder(); var cmdSvc = ConfigManager.GetService <IStudioCommandService>(); cmdSvc.Register <LookupSecuritiesCommand>(this, false, cmd => LookupSecurities(cmd.Criteria)); cmdSvc.Register <RequestTradesCommand>(this, false, cmd => new NewTradesCommand(Trades).Process(this)); //cmdSvc.Register<RequestPortfoliosCommand>(this, cmd => Portfolios.ForEach(pf => new PortfolioCommand(pf, true).Process(this))); cmdSvc.Register <RequestPositionsCommand>(this, false, cmd => Positions.ForEach(pos => new PositionCommand(CurrentTime, pos, true).Process(this))); cmdSvc.Register <RequestMarketDataCommand>(this, false, cmd => AddExport(cmd.Security, cmd.Type)); cmdSvc.Register <RefuseMarketDataCommand>(this, false, cmd => RemoveExport(cmd.Security, cmd.Type)); //NewPortfolios += portfolios => portfolios.ForEach(pf => new PortfolioCommand(pf, true).Process(this)); PortfoliosChanged += portfolios => portfolios.ForEach(pf => new PortfolioCommand(pf, false).Process(this)); NewPositions += positions => positions.ForEach(pos => new PositionCommand(CurrentTime, pos, true).Process(this)); PositionsChanged += positions => positions.ForEach(pos => new PositionCommand(CurrentTime, pos, false).Process(this)); NewTrades += trades => new NewTradesCommand(trades).Process(this); NewNews += news => new NewNewsCommand(news).Process(this); LookupSecuritiesResult += securities => new LookupSecuritiesResultCommand(securities).Process(this); //LookupPortfoliosResult += portfolios => new LookupPortfoliosResultCommand(portfolios).Process(this); UpdateSecurityLastQuotes = false; UpdateSecurityByLevel1 = false; }
/// <summary> /// Configure connection using <see cref="ConnectorWindow"/>. /// </summary> /// <param name="adapter">The connection.</param> /// <param name="owner">UI thread owner.</param> /// <returns><see langword="true"/> if the specified connection was configured, otherwise, <see langword="false"/>.</returns> public static bool Configure(this BasketMessageAdapter adapter, Window owner) { var autoConnect = false; return(adapter.Configure(owner, ref autoConnect)); }
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") { ; } }