示例#1
0
 private static Transaction SetSecurity(this Transaction transaction, IMessageSessionHolder sessionHolder, OrderMessage message)
 {
     return
         (transaction
          .SetClassCode(sessionHolder.GetSecurityClass(message.SecurityId))
          .SetSecurityCode(message.SecurityId.SecurityCode));
 }
示例#2
0
        public static Transaction CreateMoveTransaction(this IMessageSessionHolder sessionHolder, OrderReplaceMessage message)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (message.OrderType == OrderTypes.ExtRepo || message.OrderType == OrderTypes.Repo || message.OrderType == OrderTypes.Rps)
            {
                throw new ArgumentOutOfRangeException("message", message.Type, LocalizedStrings.Str1847);
            }

            return
                (new Transaction(TransactionTypes.ReRegister, message)
                 .SetAction(TransactionActions.MoveOrders)
                 .SetSecurity(sessionHolder, message)
                 .SetFortsMode(message.Volume == 0 ? 0 : 1)
                 .SetFirstOrderId(message.OldOrderId)
                 .SetFirstOrderPrice(message.Price)
                 .SetFirstVolume((int)message.Volume));
        }
示例#3
0
 private void SetPortfolioSessionHolder(string portfolio, IMessageSessionHolder sessionHolder)
 {
     if (!SessionHolder.Portfolios.ContainsKey(portfolio))
     {
         SessionHolder.Portfolios[portfolio] = sessionHolder;
     }
 }
示例#4
0
        public AdaptersHolder(IMessageSessionHolder session, Action <Exception> errorHandler)
        {
            _errorHandler = errorHandler;

            var transaction = session.IsTransactionEnabled;
            var marketData  = session.IsMarketDataEnabled;

            if (marketData)
            {
                MarketDataAdapter = session.CreateMarketDataAdapter();
            }

            if (transaction)
            {
                TransactionAdapter = session.CreateTransactionAdapter();
            }

            var type        = session.GetType();
            var displayName = type.GetDisplayName();

            if (!session.JoinInProcessors)
            {
                if (transaction)
                {
                    ApplyMessageProcessor(displayName, MessageDirections.In, true, false);
                }

                if (marketData)
                {
                    ApplyMessageProcessor(displayName, MessageDirections.In, false, true);
                }
            }
            else
            {
                ApplyMessageProcessor(displayName, MessageDirections.In, transaction, marketData);
            }

            if (!session.JoinOutProcessors)
            {
                if (transaction)
                {
                    ApplyMessageProcessor(displayName, MessageDirections.Out, true, false);
                }

                if (marketData)
                {
                    ApplyMessageProcessor(displayName, MessageDirections.Out, false, true);
                }
            }
            else
            {
                ApplyMessageProcessor(displayName, MessageDirections.Out, transaction, marketData);
            }
        }
示例#5
0
        public static Transaction CreateCancelFuturesTransaction(this IMessageSessionHolder sessionHolder, OrderGroupCancelMessage message)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (message.PortfolioName.IsEmpty())
            {
                throw new ArgumentException("message");
            }

            if (message.SecurityId.SecurityCode.IsEmpty())
            {
                throw new ArgumentException("message");
            }

            var underlyingSecurityCode = message.GetValue <string>("UnderlyingSecurityCode");

            if (underlyingSecurityCode.IsEmpty())
            {
                throw new ArgumentException(LocalizedStrings.Str1850, "message");
            }

            var secType = message.SecurityId.SecurityType;

            if (secType != SecurityTypes.Future)
            {
                throw new ArgumentException(LocalizedStrings.Str1851Params.Put(secType), "message");
            }

            var transaction = new Transaction(TransactionTypes.CancelGroup, message);

            transaction
            .SetAccount(message.PortfolioName)
            .SetBaseContract(underlyingSecurityCode)
            .SetAction(TransactionActions.KillAllFuturesOrders)
            .SetClassCode(sessionHolder.GetSecurityClass(message.SecurityId));

            if (message.Side != null)
            {
                transaction.SetSide(message.Side.Value);
            }

            return(transaction);
        }
            public ConnectorRow(ConnectorInfo info, IMessageSessionHolder sessionHolder)
            {
                if (info == null)
                {
                    throw new ArgumentNullException("info");
                }

                if (sessionHolder == null)
                {
                    throw new ArgumentNullException("sessionHolder");
                }

                Info          = info;
                SessionHolder = sessionHolder;
            }
示例#7
0
        /// <summary>
        /// Создать <see cref="PortfolioChangeMessage"/>.
        /// </summary>
        /// <param name="sessionHolder">Контейнер для сессии.</param>
        /// <param name="pfName">Название портфеля.</param>
        /// <returns>Сообщение об изменении портфеля.</returns>
        public static PortfolioChangeMessage CreatePortfolioChangeMessage(this IMessageSessionHolder sessionHolder, string pfName)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            var time = sessionHolder.CurrentTime;

            return(new PortfolioChangeMessage
            {
                PortfolioName = pfName,
                LocalTime = time.LocalDateTime,
                ServerTime = time,
            });
        }
        private ConnectorInfo GetInfo(IMessageSessionHolder sessionHolder)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            var info = ConnectorsInfo.FirstOrDefault(i => i.SessionHolderType.IsInstanceOfType(sessionHolder));

            if (info == null)
            {
                throw new ArgumentException(LocalizedStrings.Str1553Params.Put(sessionHolder.GetType()), "sessionHolder");
            }

            return(info);
        }
示例#9
0
        public static Transaction CreateCancelTransaction(this IMessageSessionHolder sessionHolder, OrderCancelMessage message)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            var transaction = new Transaction(TransactionTypes.Cancel, message);

            transaction.SetSecurity(sessionHolder, message);

            string action;
            Func <long, Transaction> idSetterFunc = transaction.SetOrderId;

            switch (message.OrderType)
            {
            case OrderTypes.Limit:
            case OrderTypes.Market:
                action = TransactionActions.KillOrder;
                break;

            case OrderTypes.Conditional:
                action       = TransactionActions.KillStopOrder;
                idSetterFunc = transaction.SetStopOrderId;
                break;

            case OrderTypes.Repo:
            case OrderTypes.ExtRepo:
            case OrderTypes.Rps:
                action = TransactionActions.KillNegDeal;
                break;

            default:
                throw new ArgumentOutOfRangeException("message", message.Type, LocalizedStrings.Str1600);
            }

            idSetterFunc(message.OrderId).SetAction(action);

            return(transaction);
        }
示例#10
0
        public static string GetSecurityClass(this IMessageSessionHolder sessionHolder, SecurityId securityId)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            var pairs = sessionHolder.SecurityClassInfo
                        .Where(p =>
                               (securityId.SecurityType == null || p.Value.First == securityId.SecurityType) &&
                               p.Value.Second.CompareIgnoreCase(securityId.BoardCode)
                               ).ToArray();

            switch (pairs.Length)
            {
            case 0:
                return(securityId.BoardCode);

            //case 1:
            //	return pairs[0].Key;
            default:
                return(pairs[0].Key);
            }
        }
示例#11
0
        private static Transaction SetOtherSecurity(this Transaction transaction, IMessageSessionHolder sessionHolder, SecurityId securityId)
        {
            var secClass = sessionHolder.GetSecurityClass(securityId);

            return(transaction.SetOtherSecurity(securityId.SecurityCode, secClass));
        }
示例#12
0
        public static Transaction CreateRegisterTransaction(this IMessageSessionHolder sessionHolder, OrderRegisterMessage message, string orderAccount)
        {
            if (sessionHolder == null)
            {
                throw new ArgumentNullException("sessionHolder");
            }

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            var board           = ExchangeBoard.GetOrCreateBoard(message.SecurityId.BoardCode);
            var needDepoAccount = board.IsMicex || board.IsUxStock;

            if (needDepoAccount)
            {
                if (orderAccount.IsEmpty())
                {
                    throw new ArgumentException(LocalizedStrings.Str1848Params.Put(message.PortfolioName));
                }
            }
            else
            {
                orderAccount = message.PortfolioName;
            }

            var transaction = new Transaction(TransactionTypes.Register, message);

            transaction
            .SetAccount(orderAccount)
            .SetSecurity(sessionHolder, message)
            .SetVolume((int)message.Volume);

            //20-ти символьное составное поле, может содержать код клиента и текстовый комментарий с тем же разделителем, что и при вводе заявки вручную.
            //для ртс код клиента не обязателен
            var clientCode = needDepoAccount ? message.PortfolioName : string.Empty;

            if (!message.Comment.IsEmpty())
            {
                // http://www.quik.ru/forum/import/24383
                var splitter = message.PortfolioName.Contains("/") ? "//" : "/";
                clientCode = clientCode.IsEmpty() ? message.Comment : "{0}{1}{2}".Put(clientCode, splitter, message.Comment);

                if (clientCode.Length > 20)
                {
                    clientCode = clientCode.Remove(20);
                }
            }

            if (!clientCode.IsEmpty())
            {
                transaction.SetClientCode(clientCode);
            }

            transaction.SetExpiryDate(message.TillDate);

            if (message.VisibleVolume != null && message.VisibleVolume != message.Volume)
            {
                return(transaction
                       .SetAction(TransactionActions.Iceberg)
                       .SetVisibleVolume((int)message.VisibleVolume)

                       .SetInstruction("Цена", transaction.GetInstruction(Transaction.Price))
                       .SetInstruction("К/П", message.Side == Sides.Buy ? "Купля" : "Продажа")
                       .SetInstruction("Тип", "Лимитная")
                       .SetInstruction("Тип по цене", "по разным ценам")
                       .SetInstruction("Тип по остатку", "поставить в очередь")
                       .SetInstruction("Тип ввода значения цены", "По цене")

                       .SetInstruction("Торговый счет", transaction.GetInstruction(Transaction.Account))
                       .RemoveInstruction(Transaction.Account)

                       .SetInstruction("Инструмент", transaction.GetInstruction(Transaction.SecurityCode))
                       .RemoveInstruction(Transaction.SecurityCode)

                       .SetInstruction("Лоты", transaction.GetInstruction(Transaction.Volume))
                       .RemoveInstruction(Transaction.Volume)

                       .SetInstruction("Примечание", transaction.GetInstruction(Transaction.ClientCode))
                       .RemoveInstruction(Transaction.ClientCode));
            }

            switch (message.OrderType)
            {
            case OrderTypes.Market:
            case OrderTypes.Limit:
                transaction
                .SetSide(message.Side)
                .SetType(message.OrderType)
                .SetAction(TransactionActions.NewOrder)
                .SetPrice(message.Price);

                var tif = message.TimeInForce ?? TimeInForce.PutInQueue;

                if (!(message.SecurityId.SecurityType == SecurityTypes.Future && tif == TimeInForce.PutInQueue))
                {
                    transaction.SetTimeInForce(tif);
                }

                break;

            case OrderTypes.Conditional:
            {
                var condition = (QuikOrderCondition)message.Condition;

                if (condition.ConditionOrderId != null && condition.ConditionOrderSide != null)
                {
                    message.Side = condition.ConditionOrderSide.Value.Invert();
                }

                transaction
                .SetSide(message.Side)
                .SetAction(TransactionActions.NewStopOrder)
                .SetStopPrice(condition.StopPrice ?? 0);

                if (message.Price != 0)
                {
                    transaction.SetPrice(message.Price);
                }

                string stopOrderKind;
                string stopPriceCondition;

                switch (condition.Type)
                {
                case QuikOrderConditionTypes.LinkedOrder:
                    stopOrderKind = TransactionStopOrderKinds.WithLinkedLimitOrder;
                    transaction
                    .SetLinkedOrderPrice(condition.LinkedOrderPrice ?? 0)
                    .SetLinkedOrderCancel(condition.LinkedOrderCancel ?? false);

                    stopPriceCondition = message.Side == Sides.Buy ? ">=" : "<=";
                    break;

                case QuikOrderConditionTypes.OtherSecurity:
                    var otherSec = condition.OtherSecurityId;

                    if (otherSec == null)
                    {
                        throw new ArgumentException();
                    }

                    stopOrderKind = TransactionStopOrderKinds.ConditionPriceByOtherSecurity;
                    transaction.SetOtherSecurity(sessionHolder, (SecurityId)otherSec);

                    stopPriceCondition = condition.StopPriceCondition == QuikStopPriceConditions.MoreOrEqual ? ">=" : "<=";
                    break;

                case QuikOrderConditionTypes.StopLimit:
                    stopPriceCondition = null;
                    stopOrderKind      = null;
                    break;

                case QuikOrderConditionTypes.TakeProfit:
                    stopPriceCondition = null;
                    stopOrderKind      = TransactionStopOrderKinds.TakeProfit;
                    break;

                case QuikOrderConditionTypes.TakeProfitStopLimit:
                    stopPriceCondition = null;
                    stopOrderKind      = TransactionStopOrderKinds.TakeProfitAndStopLimit;

                    if (condition.ActiveTime != null)
                    {
                        transaction
                        .SetIsActiveInTime(true)
                        .SetActiveFrom(condition.ActiveTime.Min.UtcDateTime)
                        .SetActiveTo(condition.ActiveTime.Max.UtcDateTime);
                    }
                    else
                    {
                        // http://stocksharp.com/forum/yaf_postsm25524_Nie-rabotaiet-razmieshchieniie-ordierov-po-ispolnieniiu.aspx
                        // IS_ACTIVE_IN_TIME	Признак действия заявки типа «Тэйк-профит и стоп-лимит»
                        if (condition.ConditionOrderId == null)
                        {
                            transaction.SetIsActiveInTime(false);
                        }
                    }

                    if (condition.IsMarketTakeProfit != null)
                    {
                        transaction.SetMarketTakeProfit((bool)condition.IsMarketTakeProfit);
                    }

                    if (condition.IsMarketStopLimit != null)
                    {
                        transaction.SetMarketStopLimit((bool)condition.IsMarketStopLimit);
                    }

                    if (condition.StopLimitPrice != null)
                    {
                        transaction.SetStopLimitPrice((decimal)condition.StopLimitPrice);
                    }

                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (condition.ConditionOrderId != null)
                {
                    if (stopOrderKind.IsEmpty())
                    {
                        stopOrderKind = TransactionStopOrderKinds.SimpleStopLimit;
                    }

                    stopOrderKind = TransactionStopOrderKinds.ActivatedByOrder + stopOrderKind;

                    transaction
                    .SetConditionOrderId((long)condition.ConditionOrderId)
                    .SetConditionOrderUseMatchedBalance(condition.ConditionOrderUseMatchedBalance ?? false)
                    .SetConditionOrderPartiallyMatched(condition.ConditionOrderPartiallyMatched ?? false);
                }

                if (condition.Type == QuikOrderConditionTypes.TakeProfit || condition.Type == QuikOrderConditionTypes.TakeProfitStopLimit)
                {
                    if (condition.Offset != null)
                    {
                        transaction.SetOffset(condition.Offset);
                    }

                    if (condition.Spread != null)
                    {
                        transaction.SetSpread(condition.Spread);
                    }
                }

                if (!stopOrderKind.IsEmpty())
                {
                    transaction.SetStopOrderKind(stopOrderKind);
                }

                if (!stopPriceCondition.IsEmpty())
                {
                    transaction.SetStopPriceCondition(stopPriceCondition);
                }

                break;
            }

            case OrderTypes.Repo:
            {
                var orderInfo = message.RepoInfo;

                transaction
                .SetAction(TransactionActions.NewRepoNegDeal)
                .SetSide(message.Side)
                .SetPrice(message.Price);

                if (orderInfo.BlockSecurities != null)
                {
                    transaction.SetBlockSecurities((bool)orderInfo.BlockSecurities);
                }

                if (orderInfo.Partner != null)
                {
                    transaction.SetPartner(orderInfo.Partner);
                }

                if (orderInfo.MatchRef != null)
                {
                    transaction.SetMatchRef(orderInfo.MatchRef);
                }

                if (orderInfo.RefundRate != null)
                {
                    transaction.SetRefundRate((int)orderInfo.RefundRate);
                }

                if (orderInfo.Rate != null)
                {
                    transaction.SetRepoRate((int)orderInfo.Rate);
                }

                if (orderInfo.Value != null)
                {
                    transaction.SetRepoValue((decimal)orderInfo.Value);
                }

                if (orderInfo.Term != null)
                {
                    transaction.SetRepoTerm((int)orderInfo.Term);
                }

                if (orderInfo.SecondPrice != null)
                {
                    transaction.SetSecondPrice((decimal)orderInfo.SecondPrice);
                }

                if (orderInfo.SettleCode != null)
                {
                    transaction.SetSettleCode(orderInfo.SettleCode);
                }

                if (orderInfo.SettleDate != null)
                {
                    transaction.SetSettleDate(orderInfo.SettleDate.Value.ToLocalTime(TimeHelper.Moscow));
                }

                if (orderInfo.LowerDiscount != null)
                {
                    transaction.SetLowerDiscount((int)orderInfo.LowerDiscount);
                }

                if (orderInfo.StartDiscount != null)
                {
                    transaction.SetStartDiscount((int)orderInfo.StartDiscount);
                }

                if (orderInfo.UpperDiscount != null)
                {
                    transaction.SetUpperDiscount((int)orderInfo.UpperDiscount);
                }

                break;
            }

            case OrderTypes.Rps:
            {
                var orderInfo = message.RpsInfo;

                transaction
                .SetAction(TransactionActions.NewNegDeal)
                .SetSide(message.Side)
                .SetPrice(message.Price);

                if (orderInfo.Partner != null)
                {
                    transaction.SetPartner(orderInfo.Partner);
                }

                if (orderInfo.MatchRef != null)
                {
                    transaction.SetMatchRef(orderInfo.MatchRef);
                }

                if (orderInfo.SettleCode != null)
                {
                    transaction.SetSettleCode(orderInfo.SettleCode);
                }

                if (orderInfo.SettleDate != null)
                {
                    transaction.SetSettleDate(orderInfo.SettleDate.Value.ToLocalTime(TimeHelper.Moscow));
                }

                if (orderInfo.ForAccount != null)
                {
                    transaction.SetForAccount(orderInfo.ForAccount);
                }

                transaction.SetCurrencyCode(orderInfo.CurrencyType.ToMicexCurrencyName());

                break;
            }

            default:
                throw new NotSupportedException(LocalizedStrings.Str1849Params.Put(message.Type));
            }

            return(transaction);
        }
示例#13
0
 public StudioEmulationAdapter(IMessageSessionHolder sessionHolder)
     : base(sessionHolder)
 {
 }