public string GetBoxedPosition() { string[] colNames = new[] { "TRADER", "SYMBOL", "QUANTITY" }; var groupedLongPosition = LongPositions.GroupBy(r => new { r.Trader, r.Symbol }) .Select(grp => new { grp.Key, Qty = grp.Sum(r => r.Qty) }).ToList(); var groupedShortPosition = ShortPositions.GroupBy(r => new { r.Trader, r.Symbol }) .Select(grp => new { grp.Key, Qty = Math.Abs(grp.Sum(r => r.Qty)) }).ToList(); var result = (from lP in groupedLongPosition join sP in groupedShortPosition on lP.Key equals sP.Key select new { lP.Key.Trader, lP.Key.Symbol, Qty = Min(lP.Qty, sP.Qty) }).Select(r => r.Trader + "," + r.Symbol + "," + r.Qty).ToList(); return(string.Join(",", colNames) + Environment.NewLine + string.Join(Environment.NewLine, result)); }
internal void AddPosition(Position pos) {//build position collections incrementally if (pos.TradeType == TradeType.Buy) { LongPositions.Add(pos); } else { ShortPositions.Add(pos); } }
public DataFile(string fileName) : this() { using (var streamReader = new StreamReader(fileName)) { streamReader.ReadLine();//skip first line while (streamReader.Peek() >= 0) { var traderPosition = new TraderPosition(streamReader.ReadLine()); TraderPositions.Add(traderPosition); if (traderPosition.Qty >= 0) { LongPositions.Add(traderPosition); } else { ShortPositions.Add(traderPosition); } } } }
internal void UpdateAll() { foreach (var pos in CompositePositions) { //in case CompositePositions is null such as when building via AddPosition() if (CompositePositions == null) { CompositePositions = (List <Position>)ShortPositions.Concat(LongPositions); } //all positions in compositePositions list should be of same symbol if (this.Symbol == null) { this.Symbol = pos.SymbolCode; } if (this.Symbol != pos.SymbolCode) { throw new InvalidOperationException("symbol mismatch in compositePos. list"); } //add pos to approp. list, sum vol & avg. prc. if (pos.TradeType == TradeType.Buy) { LongPositions.Add(pos); LongExposureVol += pos.Volume; VolWdEntryPrcLong += pos.EntryPrice * (double)pos.Volume; } else { ShortPositions.Add(pos); ShortExposureVol += pos.Volume; VolWdEntryPrcShort += pos.EntryPrice * (double)pos.Volume; } //foreach } VolWdEntryPrcLong /= LongExposureVol; VolWdEntryPrcShort /= ShortExposureVol; //UpdateAll() }