예제 #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);
        }
예제 #2
0
        public static async Task <StockData> Get(Stock stock, Api.Interval interval, TimeSpan updateSpan)
        {
            StockData stockData;

            if (!Contains(stock, interval))
            {
                stockData = await stock.LoadStockData(interval, updateSpan);

                AddStockData(stockData);
            }
            else
            {
                stockData = GetStockData(stock, interval);
                DateTime lastRefeshed;
                try
                {
                    lastRefeshed = DateTime.Parse(stockData.MetaData.LastRefreshed);
                }
                catch
                {
                    lastRefeshed = DateTime.MinValue;
                }

                if (DateTime.UtcNow - lastRefeshed > updateSpan)
                {
                    stockData = await stock.LoadStockData(interval, updateSpan);

                    ReplaceStockData(stockData);
                }
            }

            return(stockData);
        }
예제 #3
0
 public void MakeTrade(StockTrade trade, Api.Interval interval)
 {
     if (trade.Stock != null)
     {
         ClosePosition(trade, interval);
         OpenPosition(trade, interval);
     }
 }
예제 #4
0
        public async void MakeTrade(OptionTrade trade, Api.Interval interval)
        {
            if (trade.Spread != null)
            {
                ClosePosition(trade, interval);
                bool x = await OpenPosition(trade, interval);

                TradeMade?.Invoke(this, new EventArgs());
            }
        }
예제 #5
0
        private async void ClosePosition(StockTrade trade, Api.Interval interval)
        {
            StockData data = await StockDataBase.Get(trade.Stock, interval);

            StockPosition position = GetPosition(trade.Stock);
            double        posValue = GetPositionValue(position, data, trade.DataIndex);

            position.Amount = 0;
            Cash           += posValue;
        }
예제 #6
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;
        }
예제 #7
0
        public async Task <StockData> DownloadStockData(Api.Interval interval)
        {
            string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DataMAN\\Financial data\\Stocks\\"
                              + _stockSymbol + "\\" + interval.ToString() + "\\" + _stockSymbol + ".json";

            await Api.GetDataToFile(_stockSymbol, interval, Api.Outputsize.full, filePath);

            StockData stockData = LoadStockDataFromFile(interval);

            return(stockData);
        }
예제 #8
0
        public async Task <double> TotalBalance(int dataIndex, Api.Interval interval)
        {
            double total = Cash;

            foreach (StockPosition position in Positions)
            {
                StockData data = await StockDataBase.Get(position.Stock, interval);

                total += GetPositionValue(position, data, dataIndex);
            }
            return(total);
        }
예제 #9
0
        public async Task <double> TotalBalance(DateTime date, Api.Interval interval)
        {
            double total = Cash;

            foreach (OptionPosition position in Positions)
            {
                TimeSpan  updateSpan = DateTime.UtcNow - date;
                StockData data       = await StockDataBase.Get(position.Spread.Stock, interval, updateSpan);

                total += await GetPositionValue(position, data, date) * (1 - Slippage);
            }
            return(total);
        }
예제 #10
0
 private static bool Contains(Stock stock, Api.Interval interval)
 {
     foreach (StockData data in dataBase)
     {
         if (data.MetaData.Symbol.Equals(stock.StockSymbol, StringComparison.OrdinalIgnoreCase))
         {
             if (data.MetaData.Interval == interval)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
예제 #11
0
 private static StockData GetStockData(Stock stock, Api.Interval interval)
 {
     foreach (StockData data in dataBase)
     {
         if (data.MetaData.Symbol.Equals(stock.StockSymbol, StringComparison.OrdinalIgnoreCase))
         {
             if (data.MetaData.Interval == interval)
             {
                 return(data);
             }
         }
     }
     return(null);
 }
예제 #12
0
        private async void OpenPosition(StockTrade trade, Api.Interval interval)
        {
            StockData data = await StockDataBase.Get(trade.Stock, interval);

            StockPosition position     = GetPosition(trade.Stock);
            double        totalBalance = await TotalBalance(trade.DataIndex, interval);

            position.EntryIndex = trade.DataIndex;
            double entryPrice = data.TimeSeries.DataPoints[trade.DataIndex].Close;
            double budget     = totalBalance * trade.PortfolioPercentage;

            position.Amount = (int)(budget / entryPrice);
            position.Type   = trade.Type;//long or short
            Cash           -= position.Amount * entryPrice;
        }
예제 #13
0
        public StockData LoadStockDataFromFile(Api.Interval interval)
        {
            StockData stockData = new StockData();

            if (StockSymbol.Length > 0)
            {
                string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DataMAN\\Financial data\\Stocks\\"
                                  + _stockSymbol + "\\" + interval.ToString() + "\\" + _stockSymbol + ".json";

                if (File.Exists(filePath))
                {
                    stockData = JsonConverter.ConvertJsonFromFile(filePath);
                }
            }
            return(stockData);
        }
예제 #14
0
        public async Task <StockData> LoadStockData(Api.Interval interval, TimeSpan dataRefreshTime)
        {
            StockData tempData = LoadStockDataFromFile(interval);

            DateTime lastRefeshed;

            try
            {
                lastRefeshed = DateTime.Parse(tempData.MetaData.LastRefreshed);
            }
            catch
            {
                lastRefeshed = DateTime.MinValue;
            }

            if (DateTime.UtcNow - lastRefeshed > dataRefreshTime)
            {
                tempData = await DownloadStockData(interval);
            }

            int tempDataCount = tempData.TimeSeries.DataPoints.Count;

            return(tempData);
        }
예제 #15
0
 public StockTradeList(Api.Interval interval)
 {
     Interval = interval;
     Trades   = new List <StockTrade>();
 }
예제 #16
0
 private void LoadStockChart(Stock stock, Api.Interval interval)
 {
     LoadStockEvent?.Invoke(stock, interval);
 }
예제 #17
0
 private void LoadStockChart(Stock stock, Api.Interval interval)
 {
     LoadStock(stock);
 }
예제 #18
0
        public static async Task <StockData> Get(Stock stock, Api.Interval interval)
        {
            StockData stockData = await Get(stock, interval, _dataRefreshRate);

            return(stockData);
        }
예제 #19
0
 private void LoadStockChart(Stock stock, Api.Interval interval)
 {
     GlobalObjects.Chart.Interval = interval;
     LoadStock(stock);
 }
예제 #20
0
 public OptionTradeList(Stock stock, Api.Interval interval)
 {
     Stock    = stock;
     Interval = interval;
     Trades   = new List <OptionTrade>();
 }