// triggered by reqAccountUpdate(true, null) called in Start() public virtual void updatePortfolio(Contract contract, int position, double marketPrice, double marketValue, double averageCost, double unrealisedPNL, double realisedPNL, string accountName) { Position pos = new Position(); pos.FullSymbol = ContractToSecurityFullName(contract); pos.Size = position; // STK averageCost is its unit price // FUT averageCost is its unit price * multiplier int multiplier = Security.GetMultiplierFromFullSymbol(pos.FullSymbol); //pos.AvgPrice = pos.FullSymbol.Contains("STK") ? (decimal)averageCost : // ((position == 0) ? (decimal)averageCost : (decimal)(averageCost/position/multiplier)); pos.AvgPrice = (decimal)(averageCost / multiplier); pos.ClosedPL = (decimal)realisedPNL; pos.OpenPL = (decimal)unrealisedPNL; pos.Account = Account; // If exists, don't trigger gotPosition if (_symbolToPosition.ContainsKey(pos.FullSymbol)) { _symbolToPosition[pos.FullSymbol] = pos; } else { _symbolToPosition.Add(pos.FullSymbol, pos); OnGotPosition(pos); } }
/// <summary> /// computes money used to purchase a portfolio of positions. /// uses average price for position. /// </summary> /// <param name="plist"></param> /// <returns></returns> public static decimal[] MoneyInUse(List <Position> plist) { decimal[] miu = new decimal[plist.Count]; for (int i = 0; i < plist.Count; i++) { miu[i] += plist[i].AvgPrice * plist[i].UnsignedSize * Security.GetMultiplierFromFullSymbol(plist[i].FullSymbol); } return(miu); }
public static decimal[] MoneyInUse(Dictionary <string, Position> pdict) { decimal[] miu = new decimal[pdict.Count]; int i = 0; foreach (KeyValuePair <string, Position> item in pdict) { miu[i++] += item.Value.AvgPrice * item.Value.UnsignedSize * Security.GetMultiplierFromFullSymbol(item.Key); } return(miu); }
/// <summary> /// Gets the closed PL on a position basis, the PL that is registered to the account for the entire shares transacted. /// </summary> /// <param name="existing">The existing position.</param> /// <param name="closing">The portion of the position being changed/closed.</param> /// <returns></returns> public static decimal ClosePL(Position existing, Trade adjust) { int closedsize = Math.Abs(adjust.TradeSize) > existing.UnsignedSize ? existing.UnsignedSize : Math.Abs(adjust.TradeSize); return(ClosePT(existing, adjust) * closedsize * Security.GetMultiplierFromFullSymbol(adjust.FullSymbol)); }
/// <summary> /// get open pl for position given the last trade /// </summary> /// <param name="LastTrade"></param> /// <param name="Pos"></param> /// <returns></returns> public static decimal OpenPL(decimal LastTrade, Position Pos) { return(OpenPL(LastTrade, Pos.AvgPrice, Pos.Size * Security.GetMultiplierFromFullSymbol(Pos.FullSymbol))); }