Example #1
0
        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);
        }
Example #2
0
 public PositionLine(OptionPosition position, DateTime date)
 {
     InitializeComponent();
     _position = position;
     _dataDate = date;
     FillLabels();
 }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #5
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);
     }
 }
Example #6
0
        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]);
        }