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; } }
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); } }
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); } } }