private async Task <bool> OpenPosition(OptionTrade trade, Api.Interval interval) { TimeSpan updateSpan = DateTime.UtcNow - trade.TradeDate; StockData data = await StockDataBase.Get(trade.Spread.Stock, interval, updateSpan); OptionPosition position = GetPosition(trade.Spread); position.Spread = trade.Spread; double totalBalance = await TotalBalance(trade.TradeDate, interval); position.EntryDate = trade.TradeDate; double margin = await trade.Spread.MaxLoss(trade.TradeDate); double budget = totalBalance * trade.PortfolioPercentage; if (trade.Amount == 0) { position.Amount = (int)(budget / (margin * (1 + Slippage) + Fee)); } else { double totalCost = (margin * (1 + Slippage) + Fee) * trade.Amount; if (Cash >= totalCost) { position.Amount = trade.Amount; } else { position.Amount = 0; } } Cash -= position.Amount * (margin * (1 + Slippage) + Fee); return(true); }
public PositionLine(OptionPosition position, DateTime date) { InitializeComponent(); _position = position; _dataDate = date; FillLabels(); }
private async Task <double> GetPositionValue(OptionPosition position, StockData data, DateTime date) { double posValue = 0; if (position.Amount > 0) { posValue = await position.Spread.PositionValue(date, position.Amount); } return(posValue); }
private async void ClosePosition(OptionTrade trade, Api.Interval interval) { TimeSpan updateSpan = DateTime.UtcNow - trade.TradeDate; StockData data = await StockDataBase.Get(trade.Spread.Stock, interval, updateSpan); OptionPosition position = GetPosition(trade.Spread); double posValue = await GetPositionValue(position, data, trade.TradeDate); Cash += posValue * (1 - Slippage) - Fee * position.Amount; position.Amount = 0; }
private void CopyPositions(OptionPortfolio original) { Positions = new List <OptionPosition>(); foreach (OptionPosition pos in original.Positions) { OptionPosition newPos = new OptionPosition() { Amount = pos.Amount, Spread = pos.Spread, EntryDate = pos.EntryDate }; Positions.Add(newPos); } }
private OptionPosition GetPosition(Spread spread) { if (spread != null) { for (int i = 0; i < Positions.Count; i++) { if (Positions[i].Spread == spread) { return(Positions[i]); } } } OptionPosition newPos = new OptionPosition(); newPos.Spread = spread; Positions.Add(newPos); return(Positions[Positions.Count - 1]); }