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 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); }
public void MakeTrade(StockTrade trade, Api.Interval interval) { if (trade.Stock != null) { ClosePosition(trade, interval); OpenPosition(trade, interval); } }
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()); } }
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; }
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; }
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); }
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); }
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); }
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); }
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); }
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; }
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); }
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); }
public StockTradeList(Api.Interval interval) { Interval = interval; Trades = new List <StockTrade>(); }
private void LoadStockChart(Stock stock, Api.Interval interval) { LoadStockEvent?.Invoke(stock, interval); }
private void LoadStockChart(Stock stock, Api.Interval interval) { LoadStock(stock); }
public static async Task <StockData> Get(Stock stock, Api.Interval interval) { StockData stockData = await Get(stock, interval, _dataRefreshRate); return(stockData); }
private void LoadStockChart(Stock stock, Api.Interval interval) { GlobalObjects.Chart.Interval = interval; LoadStock(stock); }
public OptionTradeList(Stock stock, Api.Interval interval) { Stock = stock; Interval = interval; Trades = new List <OptionTrade>(); }