Example #1
0
        public void AccountPositionToDualPosition(AccountData[] Positions, bool bOnlyToday, DualPositionContainer container)
        {
            foreach (var pos in Positions)
            {
                string     symbol     = (string)pos.Fields[AccountDataField.SYMBOL];
                Instrument instrument = framework.InstrumentManager.Get(symbol);
                if (instrument == null)
                {
                    continue;
                }

                int date = (int)pos.Fields[AccountDataFieldEx.DATE];
                if (bOnlyToday)
                {
                    if (date != TimeHelper.GetDate(DateTime.Today))
                    {
                        continue;
                    }
                }

                PositionFieldEx pfe = (PositionFieldEx)pos.Fields[AccountDataFieldEx.USER_DATA];

                var record = container.GetPositionRecord(instrument);
                record.Long.Qty       = pfe.Long.Position;
                record.Long.QtyToday  = pfe.Long.TodayPosition;
                record.Short.Qty      = pfe.Short.Position;
                record.Short.QtyToday = pfe.Short.TodayPosition;
            }
        }
Example #2
0
        private void OnRspQryInvestorPosition_callback(object sender, ref PositionField position, int size1, bool bIsLast)
        {
            if (size1 <= 0)
            {
                (sender as XApi).GetLog().Info("OnRspQryInvestorPosition");
                return;
            }

            (sender as XApi).GetLog().Info("OnRspQryInvestorPosition:" + position.ToFormattedString());

            if (!IsConnected)
            {
                return;
            }

            PositionFieldEx item;

            if (!positions.TryGetValue(position.Symbol, out item))
            {
                item = new PositionFieldEx();
                positions[position.Symbol] = item;
            }
            item.AddPosition(position);

            AccountData ad = new AccountData(DateTime.Now, AccountDataType.Position,
                                             position.AccountID, this.id, this.id);

            ad.Fields.Add(AccountDataField.SYMBOL, item.Symbol);
            ad.Fields.Add(AccountDataField.EXCHANGE, item.Exchange);
            ad.Fields.Add(AccountDataField.QTY, item.Qty);
            ad.Fields.Add(AccountDataField.LONG_QTY, item.LongQty);
            ad.Fields.Add(AccountDataField.SHORT_QTY, item.ShortQty);

            ad.Fields.Add(AccountDataFieldEx.USER_DATA, item);
            ad.Fields.Add(AccountDataFieldEx.DATE, GetDate(DateTime.Today));

            try
            {
                EmitAccountData(ad);
            }
            catch (Exception ex)
            {
                (sender as XApi).GetLog().Error(ex);
            }
        }
Example #3
0
        private void OnRspQryInvestorPosition_callback(object sender, ref PositionField position, int size1, bool bIsLast)
        {
            if (size1 <= 0)
            {
                (sender as XApi).GetLog().Info("OnRspQryInvestorPosition");
            }
            else if (position.Position != 0)
            {
                // UFX中已经过期的持仓也会推送,所以这里过滤一下不显示
                if (IsLogOnRspQryInvestorPosition)
                {
                    (sender as XApi).GetLog().Info("OnRspQryInvestorPosition:" + position.ToFormattedString());
                }
            }

            // 由策略来收回报
            if (OnRspQryInvestorPosition != null)
            {
                OnRspQryInvestorPosition(sender, ref position, size1, bIsLast);
            }

            // 需要保证从上一个查询到现在,列表中的数据是本次查询的所有数据
            if (size1 > 0)
            {
                _dictPositions_current[position.ID] = position;
            }

            if (!bIsLast)
            {
                return;
            }

            PositionsMsg_Long(_dictPositions_current);

            // 比较两次容器的区别
            var list = MergePositions(_dictPositions_current, _dictPositions_last);

            _dictPositions_last    = _dictPositions_current;
            _dictPositions_current = new SortedDictionary <string, PositionField>();

            if (!IsConnected)
            {
                return;
            }

            // 没有持仓通知的合约,也通知为0
            foreach (var pos in list)
            {
                PositionFieldEx item;
                if (!positions.TryGetValue(pos.Symbol, out item))
                {
                    item = new PositionFieldEx();
                    positions[pos.Symbol] = item;
                }
                item.AddPosition(pos);

                AccountData ad = new AccountData(DateTime.Now, AccountDataType.Position,
                                                 pos.AccountID, this.id, this.id);

                ad.Fields.Add(AccountDataField.SYMBOL, item.Symbol);
                ad.Fields.Add(AccountDataField.EXCHANGE, item.Exchange);
                ad.Fields.Add(AccountDataField.QTY, item.Qty);
                ad.Fields.Add(AccountDataField.LONG_QTY, item.LongQty);
                ad.Fields.Add(AccountDataField.SHORT_QTY, item.ShortQty);

                ad.Fields.Add(AccountDataFieldEx.USER_DATA, item);
                ad.Fields.Add(AccountDataFieldEx.DATE, GetDate(DateTime.Today));

                try
                {
                    EmitAccountData(ad);
                }
                catch (Exception ex)
                {
                    (sender as XApi).GetLog().Error(ex);
                }
            }
        }