using System; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Text; using System.Linq; namespace BrokersCommon.Models { public class BrokerAccount { public string account_identifier { get; set; } public string account_name { get; set; } public string account_key { get; set; } public string account_type { get; set; } public string account_institution_type { get; set; } public string account_status { get; set; } public string account_description { get; set; } public string account_mode { get; set; } public string quote_mode { get; set; } public string day_trader_status { get; set; } public string nickname { get; set; } public double account_value { get; set; } public double buying_power { get; set; } public double buying_power_in_use { get; set; } public double available_funds { get; set; } public double realized_profit_loss { get; set; } public double unrealized_profit_loss { get; set; } public bool linked { get; set; } public BrokerAccount() { Positions = new List(); Orders = new List(); } public List Positions { get; set; } public void AddPosition(BrokerPosition position) { Positions.Add(position); } public List Orders { get; set; } public int AddOrder(BrokerOrder order) { Orders.Add(order); return GetOrderIndex(order.brokerOrderId); } public List GetOrders(bool includeLocalOrders, string status, DateTime filter) { if (includeLocalOrders) return Orders.Where(o => o.orderStatus == status && o.createdWhen.Date < filter.Date).ToList(); else return Orders.Where(o => !o.IsLocal && status.Contains( o.orderStatus ) && o.createdWhen.Date < filter.Date).ToList(); } public int GetOrderIndex(string orderId) { return Orders == null ? -1 : Orders.FindIndex(o => o.brokerOrderId == orderId); } public int GetPositionIndex(long positionId) { return Positions == null ? -1 : Positions.FindIndex(p => p.broker_position_id == $"{positionId}"); } public int GetPositionIndex(string symbol) { return Positions == null ? -1 : Positions.FindIndex(p => p.symbol == symbol); } public BrokerOrder GetOrder(string orderId) { return Orders.FirstOrDefault(o => o.brokerOrderId == orderId ); } public BrokerPosition GetPosition(string symbol) { return Positions.FirstOrDefault(p => p.symbol == symbol); } public void UpdatePositionRealizedProfitLoss(BrokerOrder order) { var positionIndex = Positions.FindIndex(p => p.symbol == order.symbol); if (positionIndex < 0) return; if (order.orderAction == "BUY_TO_COVER") { Positions[positionIndex].realized_profit_loss += ((Positions[positionIndex].average_open_price - order.averageExecutionPrice) * order.filledQuantity).Value; } else { Positions[positionIndex].realized_profit_loss += ((order.averageExecutionPrice - Positions[positionIndex].average_open_price) * order.filledQuantity).Value; } } public int ManagedOrderCount() { return Orders.Where(o => o.IsLocal).Count(); } } }