/// <summary> /// Создать <see cref="RealTimeEmulationTrader{TUnderlyingTrader}"/>. /// </summary> /// <param name="underlyingConnector">Реальное подключение к торговой системе.</param> /// <param name="portfolio">Портфель, который будет использоваться для выставления заявок. Если значение не задано, то будет создан портфель по умолчанию с названием Симулятор.</param> /// <param name="ownTrader">Контролировать время жизни подключения <paramref name="underlyingConnector"/>.</param> public RealTimeEmulationTrader(TUnderlyingConnector underlyingConnector, Portfolio portfolio, bool ownTrader = true) { if (underlyingConnector == null) { throw new ArgumentNullException("underlyingConnector"); } if (portfolio == null) { throw new ArgumentNullException("portfolio"); } UnderlyingConnector = underlyingConnector; UpdateSecurityByLevel1 = false; UpdateSecurityLastQuotes = false; _portfolio = portfolio; EntityFactory = new EmulationEntityFactory(_portfolio, underlyingConnector); _ownTrader = ownTrader; //MarketEmulator.Settings.UseMarketDepth = true; Adapter.InnerAdapters.Add(UnderlyingConnector.MarketDataAdapter); if (_ownTrader) { UnderlyingConnector.Log += RaiseLog; } }
/// <summary> /// Initializes a new instance of the <see cref="RealTimeEmulationTrader{T}"/>. /// </summary> /// <param name="underlyngMarketDataAdapter"><see cref="IMessageAdapter"/>, through which market data will be got.</param> /// <param name="portfolio">The portfolio to be used to register orders. If value is not given, the portfolio with default name Simulator will be created.</param> /// <param name="ownAdapter">Track the connection <paramref name="underlyngMarketDataAdapter" /> lifetime.</param> public RealTimeEmulationTrader(TUnderlyingMarketDataAdapter underlyngMarketDataAdapter, Portfolio portfolio, bool ownAdapter = true) { if (underlyngMarketDataAdapter == null) { throw new ArgumentNullException(nameof(underlyngMarketDataAdapter)); } if (portfolio == null) { throw new ArgumentNullException(nameof(portfolio)); } UnderlyngMarketDataAdapter = underlyngMarketDataAdapter; UnderlyngMarketDataAdapter.RemoveTransactionalSupport(); UpdateSecurityByLevel1 = false; UpdateSecurityLastQuotes = false; _portfolio = portfolio; EntityFactory = new EmulationEntityFactory(_portfolio); _ownAdapter = ownAdapter; //MarketEmulator.Settings.UseMarketDepth = true; Adapter.InnerAdapters.Add(underlyngMarketDataAdapter); if (_ownAdapter) { UnderlyngMarketDataAdapter.Log += RaiseLog; } Adapter.InnerAdapters.Add(EmulationAdapter); }
/// <summary> /// Initializes a new instance of the <see cref="HistoryEmulationConnector"/>. /// </summary> /// <param name="securityProvider">The provider of information about instruments.</param> /// <param name="portfolios">Portfolios, the operation will be performed with.</param> /// <param name="storageRegistry">Market data storage.</param> public HistoryEmulationConnector(ISecurityProvider securityProvider, IEnumerable <Portfolio> portfolios, IStorageRegistry storageRegistry) { if (securityProvider == null) { throw new ArgumentNullException(nameof(securityProvider)); } if (portfolios == null) { throw new ArgumentNullException(nameof(portfolios)); } if (storageRegistry == null) { throw new ArgumentNullException(nameof(storageRegistry)); } // чтобы каждый раз при повторной эмуляции получать одинаковые номера транзакций TransactionIdGenerator = new IncrementalIdGenerator(); EntityFactory = new EmulationEntityFactory(securityProvider, portfolios); RiskManager = null; SupportBasketSecurities = true; InMessageChannel = new HistoryEmulationMessageChannel(this); OutMessageChannel = new PassThroughMessageChannel(); Adapter = new HistoryBasketMessageAdapter(this); Adapter.InnerAdapters.Add(EmulationAdapter); Adapter.InnerAdapters.Add(new HistoryMessageAdapter(TransactionIdGenerator, securityProvider) { StorageRegistry = storageRegistry }); Adapter.LatencyManager = null; Adapter.CommissionManager = null; Adapter.PnLManager = null; Adapter.SlippageManager = null; // при тестировании по свечкам, время меняется быстрее и таймаут должен быть больше 30с. //ReConnectionSettings.TimeOutInterval = TimeSpan.MaxValue; //MaxMessageCount = 1000; TradesKeepCount = 0; Adapter.SupportCandlesCompression = false; Adapter.SupportBuildingFromOrderLog = false; Adapter.SupportPartialDownload = false; Adapter.SupportLookupTracking = false; Adapter.SupportOrderBookTruncate = false; Adapter.ConnectDisconnectEventOnFirstAdapter = false; }
/// <summary> /// Initializes a new instance of the <see cref="HistoryEmulationConnector"/>. /// </summary> /// <param name="securityProvider">The provider of information about instruments.</param> /// <param name="portfolios">Portfolios, the operation will be performed with.</param> /// <param name="storageRegistry">Market data storage.</param> public HistoryEmulationConnector(ISecurityProvider securityProvider, IEnumerable <Portfolio> portfolios, IStorageRegistry storageRegistry) { if (securityProvider == null) { throw new ArgumentNullException(nameof(securityProvider)); } if (portfolios == null) { throw new ArgumentNullException(nameof(portfolios)); } if (storageRegistry == null) { throw new ArgumentNullException(nameof(storageRegistry)); } // чтобы каждый раз при повторной эмуляции получать одинаковые номера транзакций TransactionIdGenerator = new IncrementalIdGenerator(); _initialMoney = portfolios.ToDictionary(pf => pf, pf => pf.BeginValue); EntityFactory = new EmulationEntityFactory(securityProvider, _initialMoney.Keys); RiskManager = null; SupportSubscriptionTracking = true; SupportBasketSecurities = true; HistoryMessageAdapter = new HistoryMessageAdapter(TransactionIdGenerator, securityProvider) { StorageRegistry = storageRegistry }; InMessageChannel = new HistoryEmulationMessageChannel(HistoryMessageAdapter, SendOutError); OutMessageChannel = new PassThroughMessageChannel(); Adapter = new HistoryBasketMessageAdapter(this); Adapter.InnerAdapters.Add(EmulationAdapter); Adapter.InnerAdapters.Add(HistoryMessageAdapter); Adapter.LatencyManager = null; Adapter.CommissionManager = null; Adapter.PnLManager = null; Adapter.SlippageManager = null; // при тестировании по свечкам, время меняется быстрее и таймаут должен быть больше 30с. ReConnectionSettings.TimeOutInterval = TimeSpan.MaxValue; //MaxMessageCount = 1000; TradesKeepCount = 0; RaiseConnectedOnFirstAdapter = false; }
/// <summary> /// Initializes a new instance of the <see cref="HistoryEmulationConnector"/>. /// </summary> /// <param name="securityProvider">The provider of information about instruments.</param> /// <param name="portfolios">Portfolios, the operation will be performed with.</param> /// <param name="storageRegistry">Market data storage.</param> public HistoryEmulationConnector(ISecurityProvider securityProvider, IEnumerable <Portfolio> portfolios, IStorageRegistry storageRegistry) { if (securityProvider == null) { throw new ArgumentNullException("securityProvider"); } if (portfolios == null) { throw new ArgumentNullException("portfolios"); } if (storageRegistry == null) { throw new ArgumentNullException("storageRegistry"); } // чтобы каждый раз при повторной эмуляции получать одинаковые номера транзакций TransactionIdGenerator = new IncrementalIdGenerator(); _initialMoney = portfolios.ToDictionary(pf => pf, pf => pf.BeginValue); EntityFactory = new EmulationEntityFactory(securityProvider, _initialMoney.Keys); InMessageChannel = new PassThroughMessageChannel(); OutMessageChannel = new PassThroughMessageChannel(); LatencyManager = null; RiskManager = null; CommissionManager = null; PnLManager = null; SlippageManager = null; _historyAdapter = new HistoryMessageAdapter(TransactionIdGenerator, securityProvider) { StorageRegistry = storageRegistry }; _historyChannel = new InMemoryMessageChannel("History Out", SendOutError); Adapter = new HistoryBasketMessageAdapter(this); Adapter.InnerAdapters.Add(EmulationAdapter); Adapter.InnerAdapters.Add(new ChannelMessageAdapter(_historyAdapter, new InMemoryMessageChannel("History In", SendOutError), _historyChannel)); // при тестировании по свечкам, время меняется быстрее и таймаут должен быть больше 30с. ReConnectionSettings.TimeOutInterval = TimeSpan.MaxValue; MaxMessageCount = 1000; TradesKeepCount = 0; }
/// <summary> /// Создать <see cref="HistoryEmulationConnector"/>. /// </summary> /// <param name="securityProvider">Поставщик информации об инструментах.</param> /// <param name="portfolios">Портфели, с которыми будет вестись работа.</param> /// <param name="storageRegistry">Хранилище данных.</param> public HistoryEmulationConnector(ISecurityProvider securityProvider, IEnumerable <Portfolio> portfolios, IStorageRegistry storageRegistry) { if (securityProvider == null) { throw new ArgumentNullException("securityProvider"); } if (portfolios == null) { throw new ArgumentNullException("portfolios"); } if (storageRegistry == null) { throw new ArgumentNullException("storageRegistry"); } // чтобы каждый раз при повторной эмуляции получать одинаковые номера транзакций TransactionIdGenerator = new IncrementalIdGenerator(); _initialMoney = portfolios.ToDictionary(pf => pf, pf => pf.BeginValue); EntityFactory = new EmulationEntityFactory(securityProvider, _initialMoney.Keys); _sessionHolder = new HistorySessionHolder(TransactionIdGenerator, securityProvider); MarketDataAdapter = _marketDataAdapter = new HistoryMessageAdapter(_sessionHolder) { StorageRegistry = storageRegistry }; _sessionHolder.MarketTimeChangedInterval = TimeSpan.FromSeconds(1); // при тестировании по свечкам, время меняется быстрее и таймаут должен быть больше 30с. _sessionHolder.ReConnectionSettings.TimeOutInterval = TimeSpan.MaxValue; ApplyMessageProcessor(MessageDirections.In, true, true); ApplyMessageProcessor(MessageDirections.Out, true, true, new NonThreadMessageProcessor(TransactionAdapter.InMessageProcessor)); ((MessageAdapter <IMessageSessionHolder>)TransactionAdapter).SessionHolder = _sessionHolder; }
/// <summary> /// Initializes a new instance of the <see cref="HistoryEmulationConnector"/>. /// </summary> /// <param name="securityProvider">The provider of information about instruments.</param> /// <param name="portfolios">Portfolios, the operation will be performed with.</param> /// <param name="storageRegistry">Market data storage.</param> public HistoryEmulationConnector(ISecurityProvider securityProvider, IEnumerable<Portfolio> portfolios, IStorageRegistry storageRegistry) { if (securityProvider == null) throw new ArgumentNullException(nameof(securityProvider)); if (portfolios == null) throw new ArgumentNullException(nameof(portfolios)); if (storageRegistry == null) throw new ArgumentNullException(nameof(storageRegistry)); // чтобы каждый раз при повторной эмуляции получать одинаковые номера транзакций TransactionIdGenerator = new IncrementalIdGenerator(); _initialMoney = portfolios.ToDictionary(pf => pf, pf => pf.BeginValue); EntityFactory = new EmulationEntityFactory(securityProvider, _initialMoney.Keys); InMessageChannel = new PassThroughMessageChannel(); OutMessageChannel = new PassThroughMessageChannel(); LatencyManager = null; RiskManager = null; CommissionManager = null; PnLManager = null; SlippageManager = null; HistoryMessageAdapter = new HistoryMessageAdapter(TransactionIdGenerator, securityProvider) { StorageRegistry = storageRegistry }; _historyChannel = new InMemoryMessageChannel("History Out", SendOutError); Adapter = new HistoryBasketMessageAdapter(this); Adapter.InnerAdapters.Add(EmulationAdapter); Adapter.InnerAdapters.Add(new ChannelMessageAdapter(HistoryMessageAdapter, new InMemoryMessageChannel("History In", SendOutError), _historyChannel)); // при тестировании по свечкам, время меняется быстрее и таймаут должен быть больше 30с. ReConnectionSettings.TimeOutInterval = TimeSpan.MaxValue; MaxMessageCount = 1000; TradesKeepCount = 0; }