/// <summary> /// To process the message, containing market data. /// </summary> /// <param name="message">The message, containing market data.</param> protected override void OnProcessMessage(Message message) { if (message.Type == MessageTypes.Connect && message.Adapter == TransactionAdapter) { // передаем первоначальное значение размера портфеля в эмулятор TransactionAdapter.SendInMessage(_portfolio.ToMessage()); TransactionAdapter.SendInMessage(new PortfolioChangeMessage { PortfolioName = _portfolio.Name }.TryAdd(PositionChangeTypes.BeginValue, _portfolio.BeginValue)); } else if (message.Adapter == MarketDataAdapter) { switch (message.Type) { case MessageTypes.Connect: case MessageTypes.Disconnect: case MessageTypes.MarketData: case MessageTypes.SecurityLookupResult: break; default: TransactionAdapter.SendInMessage(message); break; } } base.OnProcessMessage(message); }
public void AddTransactionRow_WithParameter_Test() { foreach (var xml in goodXmlExamples) { var x2o = new GranitXmlToAdapterBinder(xml, true); int origCount = x2o.TransactionCount; var newTa = new TransactionAdapter(); Assert.AreEqual(x2o.History.UndoCount, 0); x2o.AddTransactionRow(newTa); Assert.AreEqual(x2o.History.UndoCount, 1); Assert.AreEqual(x2o.GranitXDocument.Root.Elements().ToList().Count, origCount + 1); foreach (var ta in x2o.HUFTransactionsAdapter.TransactionAdapters) { Assert.IsTrue(newTa.TransactionId >= ta.TransactionId); } Assert.AreEqual(x2o.GranitXDocument.Root.Elements(Constants.Transaction) .Where(t => t.Attribute(Constants.TransactionIdAttribute).Value == newTa.TransactionId.ToString()).Count(), 1); } }
/// <summary> /// Подключиться к торговой системе. /// </summary> protected override void OnConnect() { if (Address == null) { throw new InvalidOperationException(LocalizedStrings.Str1895); } if (Login == null) { throw new InvalidOperationException(LocalizedStrings.Str1896); } if (Password == null) { throw new InvalidOperationException(LocalizedStrings.Str1897); } try { // SmartCOM 3 не является сервисом и не требует перезапуска if (RestartService && Version == SmartComVersions.V2) { SmartComService.RestartSmartComService(RestartServiceTimeOut); } } catch (Exception ex) { TransactionAdapter.SendOutMessage(new ErrorMessage { Error = ex }); } base.OnConnect(); }
void Init() { _repository = new TransactionRepository(); _transactions = new List<Transaction>(); _adapter = new TransactionAdapter(this, _transactions); }
/// <summary> /// Остановить получение новой информации по портфелю. /// </summary> /// <param name="portfolio">Портфель, по которому необходимо остановить получение новой информации.</param> protected virtual void OnUnRegisterPortfolio(Portfolio portfolio) { TransactionAdapter.SendInMessage(new PortfolioMessage { PortfolioName = portfolio.Name, TransactionId = TransactionIdGenerator.GetNextId(), IsSubscribe = false }); }
public void Clone_Test() { FillTransactionAdapter(); TransactionAdapter clone = (TransactionAdapter)TestAdapter.Clone(); Assert.IsTrue(clone.CompareTo(TestAdapter) == 0); Assert.IsTrue(TestAdapter.CompareTo(clone) == 0); }
public void CompareTo_Test() { FillTransactionAdapter(); TransactionAdapter clone = (TransactionAdapter)TestAdapter.Clone(); Assert.IsTrue(clone.CompareTo(TestAdapter) == 0); clone.Amount = TestAdapter.Amount + 1; Assert.IsFalse(clone.CompareTo(TestAdapter) == 0); }
protected override void OnProcess(FixSession session, string client, string msgStr, bool isMarketData) { var msgType = QuickFix.Message.GetMsgType(msgStr); switch (msgType) { case QuikFixMessages.NewStopOrderSingle: { this.AddInfoLog("From client {0}: NewStopOrderSingle", client); var fixMsg = session.ToMessage <NewStopOrderSingle>(msgStr); var regMsg = fixMsg.ToRegisterMessage(); regMsg.TransactionId = CreateTransactionId(client, regMsg.TransactionId); var condition = new QuikOrderCondition { Type = (QuikOrderConditionTypes)fixMsg.Type.Obj, Result = fixMsg.IsSetResult() ? (QuikOrderConditionResults?)fixMsg.Result.Obj : null, StopPriceCondition = (QuikStopPriceConditions)fixMsg.StopPriceCondition.Obj, StopPrice = fixMsg.IsSetStopPx() ? fixMsg.StopPx.Obj : (decimal?)null, StopLimitPrice = fixMsg.IsSetStopLimitPrice() ? fixMsg.StopLimitPrice.Obj : (decimal?)null, IsMarketStopLimit = fixMsg.IsSetIsMarketStopLimit() ? fixMsg.IsMarketStopLimit.Obj : (bool?)null, ConditionOrderId = fixMsg.IsSetConditionOrderId() ? fixMsg.ConditionOrderId.Obj : (long?)null, ConditionOrderSide = (Sides)fixMsg.ConditionOrderSide.Obj, ConditionOrderPartiallyMatched = fixMsg.IsSetConditionOrderPartiallyMatched() ? fixMsg.ConditionOrderPartiallyMatched.Obj : (bool?)null, ConditionOrderUseMatchedBalance = fixMsg.IsSetConditionOrderUseMatchedBalance() ? fixMsg.ConditionOrderUseMatchedBalance.Obj : (bool?)null, LinkedOrderPrice = fixMsg.IsSetLinkedOrderPrice() ? fixMsg.LinkedOrderPrice.Obj : (decimal?)null, LinkedOrderCancel = fixMsg.LinkedOrderCancel.Obj, Offset = fixMsg.IsSetOffset() ? fixMsg.Offset.Obj.ToUnit() : null, Spread = fixMsg.IsSetStopSpread() ? fixMsg.StopSpread.Obj.ToUnit() : null, IsMarketTakeProfit = fixMsg.IsSetIsMarketTakeProfit() ? fixMsg.IsMarketTakeProfit.Obj : (bool?)null, }; if (fixMsg.IsSetOtherSecurityCode()) { condition.OtherSecurityId = new SecurityId { SecurityCode = fixMsg.OtherSecurityCode.Obj } } ; if (fixMsg.IsSetActiveTimeFrom() && fixMsg.IsSetActiveTimeTo()) { condition.ActiveTime = new Range <DateTimeOffset>(fixMsg.ActiveTimeFrom.Obj.ApplyTimeZone(TimeHelper.Moscow), fixMsg.ActiveTimeTo.Obj.ApplyTimeZone(TimeHelper.Moscow)); } regMsg.Condition = condition; TransactionAdapter.SendInMessage(regMsg); return; } } base.OnProcess(session, client, msgStr, isMarketData); }
public void TransactionAdapter_can_create_and_commit_a_transaction() { var tran = _session.BeginTransaction(); using (var sut = new TransactionAdapter(tran)) { sut.Commit(); Assert.That(tran.WasCommitted, Is.True); } tran?.Dispose(); }
static Program() { _rpcSettings = new RpcSettings { User = "******", Password = "******", Url = "http://*****:*****@127.0.0.1:8332/" }; var options = new UserOptions <RpcSettings>() { Value = _rpcSettings }; _txAdapter = new TransactionAdapter(options); }
private void OnEmulationStarting() { IsFinished = false; // подписчики StateChanged запускают стратегии, которые интересуются MarketTime в OnRunning TransactionAdapter.SendInMessage(new ResetMessage()); _sessionHolder.SecurityProvider.LookupAll().ForEach(SendSecurity); _initialMoney.ForEach(p => SendPortfolio(p.Key)); SetEmulationState(EmulationStates.Started); }
public static void FillTransactionAdapter(out System.Xml.Linq.XDocument xdoc, out TransactionAdapter ta) { xdoc = System.Xml.Linq.XDocument.Parse(TestConstants.HUFTransactionXml); XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = Constants.HUFTransactions; // xRoot.Namespace = "http://www.cpandl.com"; xRoot.IsNullable = true; var ser = new XmlSerializer(typeof(HUFTransaction), xRoot); HUFTransaction t = (HUFTransaction)ser.Deserialize(xdoc.CreateReader()); ta = new TransactionAdapter(t.Transactions[0], xdoc); }
/// <summary> /// Обработать сообщение, содержащее рыночные данные. /// </summary> /// <param name="message">Сообщение, содержащее рыночные данные.</param> /// <param name="direction">Направление сообщения.</param> protected override void OnProcessMessage(Message message, MessageDirections direction) { if (message.Type == MessageTypes.Connect && message.Adapter == TransactionAdapter && direction == MessageDirections.Out) { // передаем первоначальное значение размера портфеля в эмулятор TransactionAdapter.SendInMessage(_portfolio.ToMessage()); TransactionAdapter.SendInMessage(new PortfolioChangeMessage { PortfolioName = _portfolio.Name }.Add(PositionChangeTypes.BeginValue, _portfolio.BeginValue)); } base.OnProcessMessage(message, direction); }
public void IsBindedWith_Test() { FillTransactionAdapter(); var arr = TestXDoc.Root.Elements(GranitXml.Constants.Transaction).ToArray(); for (int i = 0; i < arr.Count(); i++) { TestAdapter = GetTransactionAdapter(TestHUFTransaction, i); Assert.IsTrue(TestAdapter.IsBindedWith(arr[i])); } Assert.IsFalse(TestAdapter.IsBindedWith(arr[0])); Assert.IsFalse(TestAdapter.IsBindedWith(arr[1])); }
/// <summary> /// Перерегистрировать заявку на бирже. /// </summary> /// <param name="oldOrder">Старая заявка, которую нужно перерегистрировать.</param> /// <param name="newOrder">Информация о новой заявке.</param> protected override void OnReRegisterOrder(Order oldOrder, Order newOrder) { if (IsSupportAtomicReRegister && oldOrder.Security.Board.IsSupportAtomicReRegister // http://www.itinvest.ru/forum/index.php?showtopic=63720&view=findpost&p=262059 && oldOrder.Balance == newOrder.Volume) { TransactionAdapter.SendInMessage(oldOrder.CreateReplaceMessage(newOrder, GetSecurityId(newOrder.Security))); } else { base.OnReRegisterOrder(oldOrder, newOrder); } }
/// <summary> /// Перерегистрировать заявку на бирже. /// </summary> /// <param name="oldOrder">Заявка, которую нужно снять.</param> /// <param name="newOrder">Новая заявка, которую нужно зарегистрировать.</param> protected override void OnReRegisterOrder(Order oldOrder, Order newOrder) { //Quik не поддерживает Move с MODE=1 для Единой Денежной Позиции. //http://quik.ru/forum/import/57855/57855/ //Поэтому делаем Cancel, потом Register if (IsSupportAtomicReRegister && oldOrder.Security.Board.IsSupportAtomicReRegister && !IsCommonMonetaryPosition) { TransactionAdapter.SendInMessage(oldOrder.CreateReplaceMessage(newOrder, GetSecurityId(newOrder.Security))); } else { base.OnReRegisterOrder(oldOrder, newOrder); } }
public void AddEmptyTransactionRow_ReturnsWithTheLargestId_Test() { foreach (var xml in goodXmlExamples) { var x2o = new GranitXmlToAdapterBinder(xml, true); TransactionAdapter newTa = x2o.AddEmptyTransactionRow(); foreach (var ta in x2o.HUFTransactionsAdapter.TransactionAdapters) { Assert.IsTrue(newTa.TransactionId >= ta.TransactionId); } Assert.AreEqual(x2o.GranitXDocument.Root.Elements(Constants.Transaction) .Where(t => t.Attribute(Constants.TransactionIdAttribute).Value == newTa.TransactionId.ToString()).Count(), 1); } }
/// <summary> /// ќбработать сообщение, содержащее рыночные данные. /// </summary> /// <param name="message">—ообщение, содержащее рыночные данные.</param> /// <param name="adapterType">“ип адаптера, от которого пришло сообщение.</param> /// <param name="direction">Ќаправление сообщени¤.</param> protected override void OnProcessMessage(Message message, MessageAdapterTypes adapterType, MessageDirections direction) { if (adapterType == MessageAdapterTypes.MarketData && direction == MessageDirections.Out) { switch (message.Type) { case MessageTypes.Connect: case MessageTypes.Disconnect: case MessageTypes.MarketData: case MessageTypes.Error: case MessageTypes.SecurityLookupResult: case MessageTypes.PortfolioLookupResult: base.OnProcessMessage(message, adapterType, direction); break; case MessageTypes.Execution: { var execMsg = (ExecutionMessage)message; if (execMsg.ExecutionType != ExecutionTypes.Trade) { TransactionAdapter.SendInMessage(message); } else { base.OnProcessMessage(message, adapterType, direction); } break; } default: TransactionAdapter.SendInMessage(message); break; } } else { base.OnProcessMessage(message, adapterType, direction); } }
/// <summary> /// Начать эмуляцию. /// </summary> /// <param name="startDate">Дата в истории, с которой необходимо начать эмуляцию.</param> /// <param name="stopDate">Дата в истории, на которой необходимо закончить эмуляцию (дата включается).</param> public void Start(DateTime startDate, DateTime stopDate) { if (stopDate < startDate) { throw new ArgumentOutOfRangeException("startDate", startDate, LocalizedStrings.Str1119Params.Put(startDate, stopDate)); } //f (stopDate == startDate) //throw new ArgumentOutOfRangeException("startDate", startDate, "Дата начала {0} равна дате окончания.".Put(startDate)); if (!CheckState(EmulationStates.Stopped)) { throw new InvalidOperationException(LocalizedStrings.Str1120Params.Put(State)); } //_sessionHolder.StartDate = startDate; //_sessionHolder.StopDate = stopDate; ClearCache(); ((IncrementalIdGenerator)TransactionIdGenerator).Current = MarketEmulator.Settings.InitialTransactionId; TransactionAdapter.SendInMessage(new TimeMessage { ServerTime = startDate, LocalTime = startDate, }); //base.OnProcessMessage(new TimeMessage { LocalTime = startDate }, MessageAdapterTypes.Transaction, MessageDirections.In); ProcessedEventCount = 0; //SetEmulationState(EmulationStates.Starting); MarketDataAdapter.SendInMessage(new EmulationStateMessage { //OldState = State, NewState = EmulationStates.Starting, StartDate = startDate, StopDate = stopDate, LocalTime = startDate, }); }
/// <summary> /// Сменить пароль. /// </summary> /// <param name="adapterType">Тип адаптера, в который необходимо отправить сообщение о смене пароля.</param> /// <param name="newPassword">Новый пароль.</param> public void ChangePassword(MessageAdapterTypes adapterType, string newPassword) { var msg = new ChangePasswordMessage { NewPassword = newPassword.To <SecureString>(), TransactionId = TransactionIdGenerator.GetNextId() }; switch (adapterType) { case MessageAdapterTypes.Transaction: TransactionAdapter.SendInMessage(msg); break; case MessageAdapterTypes.MarketData: MarketDataAdapter.SendInMessage(msg); break; default: throw new ArgumentOutOfRangeException("adapterType"); } }
/// <summary> /// To process the message, containing market data. /// </summary> /// <param name="message">The message, containing market data.</param> protected override void OnProcessMessage(Message message) { try { switch (message.Type) { case MessageTypes.Connect: { base.OnProcessMessage(message); if (message.Adapter == TransactionAdapter) { _initialMoney.ForEach(p => SendPortfolio(p.Key)); } break; } case ExtendedMessageTypes.Last: { var lastMsg = (LastMessage)message; if (State == EmulationStates.Started) { IsFinished = !lastMsg.IsError; // все данных пришли без ошибок или в процессе чтения произошла ошибка - начинаем остановку SendEmulationState(EmulationStates.Stopping); SendEmulationState(EmulationStates.Stopped); } if (State == EmulationStates.Stopping) { // тестирование было отменено и пришли все ранее прочитанные данные SendEmulationState(EmulationStates.Stopped); } break; } case ExtendedMessageTypes.Clearing: break; case ExtendedMessageTypes.EmulationState: ProcessEmulationStateMessage(((EmulationStateMessage)message).State); break; case MessageTypes.Security: case MessageTypes.Board: case MessageTypes.Level1Change: case MessageTypes.QuoteChange: case MessageTypes.Time: case MessageTypes.CandlePnF: case MessageTypes.CandleRange: case MessageTypes.CandleRenko: case MessageTypes.CandleTick: case MessageTypes.CandleTimeFrame: case MessageTypes.CandleVolume: case MessageTypes.Execution: { if (message.Adapter == MarketDataAdapter) { TransactionAdapter.SendInMessage(message); } else if (message.Adapter == TransactionAdapter) { var candleMsg = message as CandleMessage; if (candleMsg != null) { if (!UseExternalCandleSource) { break; } var series = _series.TryGetValue(Tuple.Create(candleMsg.SecurityId, candleMsg.Type.ToCandleMarketDataType(), candleMsg.Arg)); if (series != null) { _newCandles.SafeInvoke(series, new[] { candleMsg.ToCandle(series) }); if (candleMsg.IsFinished) { _stopped.SafeInvoke(series); } } break; } } base.OnProcessMessage(message); break; } default: { if (State == EmulationStates.Stopping && message.Type != MessageTypes.Disconnect) { break; } base.OnProcessMessage(message); break; } } } catch (Exception ex) { SendOutError(ex); SendEmulationState(EmulationStates.Stopping); } }
public static void FillTransactionAdapter(int transactionIndex = 0) { TestXDoc = XDocument.Parse(TestConstants.HUFTransactionXml); TestHUFTransaction = HUFTransaction.Load(TestXDoc); TestAdapter = GetTransactionAdapter(TestHUFTransaction, transactionIndex); }
internal TransactionHook(TransactionAdapter adapter) : base(adapter) { }