示例#1
0
        private async void buttonRun_Click(object sender, EventArgs e)
        {
            Stock stock = GlobalObjects.Chart.Stock;

            textBoxStock.Text = stock.StockSymbol;
            StockData data = await StockDataBase.Get(stock, Api.Interval.Daily);

            int dataCount = data.TimeSeries.DataPoints.Count;

            double   simCash                = 10000;
            DateTime simStartDate           = new DateTime(2016, 1, 1);
            DateTime simEndDate             = new DateTime(2017, 5, 1);
            double   alpha                  = GetStockAlphaBalance(data, simCash, simStartDate, simEndDate);
            double   tradeResult            = 0;
            IOptionTradeAlgorithm tradeAlgo = new BuyAndManageLCV();

            OptionTradeList tradeList = await tradeAlgo.Find(stock, simStartDate, simEndDate);

            OptionTradeSimulation sim = new OptionTradeSimulation("OptionSim", simCash, simStartDate, simEndDate, 1.1, 0.04);

            sim.Run(tradeList);
            GlobalObjects.Chart.Graphs.Clear();
            GlobalObjects.Chart.Graphs.Add(sim.BalanceChart);

            tradeResult = sim.BalanceChart.DataPoints[sim.BalanceChart.DataPoints.Count - 1].GraphData;


            labelResultRightPercent.Text = tradeResult.ToString();
            labelResultAlpha.Text        = alpha.ToString();
        }
示例#2
0
        public async Task <bool> LoadStock(Stock stock)
        {
            if (stock != null)
            {
                StockData tempData = await StockDataBase.Get(stock, Interval);

                int tempDataCount = tempData.TimeSeries.DataPoints.Count;

                if (tempDataCount > 0)
                {
                    Stock prevstock = activeStock;
                    activeStock     = stock;
                    activeStockData = tempData;

                    candleCount  = tempDataCount;
                    DefaultRange = 100;
                    chartRange   = DefaultRange;

                    if (candleCount < chartRange)
                    {
                        chartRange = candleCount;
                    }

                    DefaultRange = chartRange;

                    if (StockChanged != null)
                    {
                        StockChanged();
                    }

                    return(true);
                }
            }
            return(false);
        }
示例#3
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);
        }
        public async Task <OptionTradeList> Find(Stock stock, DateTime startDate, DateTime endDate)
        {
            OptionTradeList tradeList = new OptionTradeList(stock, Api.Interval.Daily);
            StockData       data      = await StockDataBase.Get(stock, Api.Interval.Daily);

            int startIndex = data.FindDateIndex(startDate);
            int endIndex   = data.FindDateIndex(endDate);

            int    tradeHoldLenght      = 30;
            double tradeHoldMaxGain     = 0.9;
            double tradeHoldMaxLoss     = -0.25;
            double portofolioPercentage = 0.8;

            bool inTrade = false;

            for (int i = startIndex; i <= endIndex; i++)
            {
                DateTime today = data.TimeSeries.DataPoints[i].DateTime;
                if (!inTrade)
                {
                    double      close  = data.TimeSeries.DataPoints[i].Close;
                    Spread      spread = Spread.GetSpread(stock, SpreadType.LongCallVertical, close - close * 0.1, 5, today.AddDays(40), today);
                    OptionTrade trade  = new OptionTrade
                    {
                        TradeDate           = data.TimeSeries.DataPoints[i].DateTime,
                        PortfolioPercentage = portofolioPercentage,
                        Spread = spread
                    };
                    tradeList.Trades.Add(trade);
                    inTrade = true;
                }
                else
                {
                    OptionTrade lastTrade = tradeList.Trades[tradeList.Trades.Count - 1];
                    double      openPrice = await lastTrade.Spread.Price(lastTrade.TradeDate);

                    double currentPrice = await lastTrade.Spread.Price(today);

                    double percentageGain = (currentPrice - openPrice) / openPrice;
                    int    dateIndex      = data.FindDateIndex(lastTrade.TradeDate);

                    if (i - dateIndex >= tradeHoldLenght || lastTrade.Spread.DaysUntilExpiration(today) < 5 || percentageGain > tradeHoldMaxGain || percentageGain < tradeHoldMaxLoss)
                    {
                        OptionTrade trade = new OptionTrade
                        {
                            TradeDate           = data.TimeSeries.DataPoints[i].DateTime,
                            PortfolioPercentage = 0,
                            Spread = lastTrade.Spread
                        };
                        tradeList.Trades.Add(trade);
                        inTrade = false;
                    }
                }
            }
            return(tradeList);
        }
示例#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 <double> Price(DateTime date)
        {
            double    price      = 0;
            TimeSpan  updateSpan = DateTime.UtcNow - date;
            StockData data       = await StockDataBase.Get(this, Api.Interval.Daily, updateSpan);

            if (data != null)
            {
                price = data.TimeSeries.DataPoints[data.FindDateIndex(date)].Close;
            }
            return(price);
        }
示例#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
        public FormMain()
        {
            GlobalObjects.Initialize();
            Api.Initialize(File.ReadAllText("AlphavantageKey.txt"));
            StockDataBase.Initialize(TimeSpan.FromHours(5));
            OptionDataBase.Initialize();
            WatchListManager.Initialize();
            InitializeComponent();
            watchListUI.Link(GlobalObjects.Chart);
            chartControl.Link(GlobalObjects.Chart);

            watchListUI.LoadStockEvent  += new WatchListUI.LoadStockHandler(LoadStock);
            chartControl.LoadStockEvent += new ChartControl.LoadStockHandler(LoadStockChart);
        }
示例#11
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;
        }
示例#12
0
        public async void ChangeStock(Stock stock)
        {
            TimeSpan  updateSpan = DateTime.UtcNow - _simDate;
            StockData stockData  = await StockDataBase.Get(stock, Api.Interval.Daily, updateSpan);

            if (stockData.TimeSeries.DataPoints[0].DateTime <= _simDate)
            {
                _stockData          = new StockData();
                _stockData.MetaData = stockData.MetaData;
                _dataIndex          = stockData.FindDateIndex(_simDate);
                if (_dataIndex <= stockData.TimeSeries.DataPoints.Count)
                {
                    _stockData.TimeSeries.DataPoints = stockData.TimeSeries.DataPoints.GetRange(0, _dataIndex + 1);
                }
            }
        }
示例#13
0
        public async Task <OptionTradeList> Find(Stock stock, DateTime startDate, DateTime endDate)
        {
            OptionTradeList tradeList = new OptionTradeList(stock, Api.Interval.Daily);
            StockData       data      = await StockDataBase.Get(stock, Api.Interval.Daily);

            int startIndex = data.FindDateIndex(startDate);
            int endIndex   = data.FindDateIndex(endDate);

            int tradeHoldLenght = 2;

            bool inTrade = false;

            for (int i = startIndex; i <= endIndex; i++)
            {
                if (!inTrade)
                {
                    Option[] options = new Option[2];
                    options[0] = new Option(stock, OptionType.Put, PositionType.Short, 230, startDate.AddDays(25));
                    options[1] = new Option(stock, OptionType.Put, PositionType.Long, 240, startDate.AddDays(25));
                    Spread      spread = new Spread(options);
                    OptionTrade trade  = new OptionTrade
                    {
                        TradeDate           = data.TimeSeries.DataPoints[i].DateTime,
                        PortfolioPercentage = 1,
                        Spread = spread
                    };
                    tradeList.Trades.Add(trade);
                    inTrade = true;
                }
                else
                {
                    OptionTrade lastTrade = tradeList.Trades[tradeList.Trades.Count - 1];
                    int         dateIndex = data.FindDateIndex(lastTrade.TradeDate);
                    if (i - dateIndex >= tradeHoldLenght)
                    {
                        OptionTrade trade = new OptionTrade
                        {
                            TradeDate           = data.TimeSeries.DataPoints[i].DateTime,
                            PortfolioPercentage = 0,
                            Spread = lastTrade.Spread
                        };
                        tradeList.Trades.Add(trade);
                    }
                }
            }
            return(tradeList);
        }
示例#14
0
        public async void NextTradeDay()
        {
            _dataIndex++;
            TimeSpan  updateSpan = DateTime.UtcNow - _simDate;
            StockData stockData  = await StockDataBase.Get(Stock, Api.Interval.Daily, updateSpan);

            if (_dataIndex <= stockData.TimeSeries.DataPoints.Count)
            {
                _simDate = stockData.TimeSeries.DataPoints[_dataIndex].DateTime;
                if (OptionChain.DataAvailible(Stock, _simDate))
                {
                    ChangeStock(Stock);
                    _portofolioHistory.Add(new OptionPortfolio(_portfolio));
                    _portfolio.CloseExpiredPositions(_simDate);
                    NextDaySimulated?.Invoke(this, new EventArgs());
                }
            }
        }
示例#15
0
        public async void Run(StockTradeList tradeList)
        {
            if (tradeList != null && tradeList.Trades.Count > 0)
            {
                //find all stocks traded
                StockList stocks = new StockList("TradeList");
                foreach (StockTrade trade in tradeList.Trades)
                {
                    stocks.Add(trade.Stock);
                }

                //find DataRange
                StockData firstData = await StockDataBase.Get(stocks.GetStock(0), tradeList.Interval);

                int startIndex = firstData.FindDateIndex(_startDate);
                int stopIndex  = firstData.FindDateIndex(_endDate);
                int dataCount  = firstData.TimeSeries.DataPoints.Count;

                if (stopIndex == 0)
                {
                    stopIndex = dataCount - 1;
                }

                //Simulate trades
                double         startBalance     = _balanceChart[0];
                StockPortfolio portfolio        = new StockPortfolio(startBalance);
                List <double>  balanceChartList = new List <double>();
                balanceChartList.Add(startBalance);

                for (int i = startIndex; i <= stopIndex; i++)
                {
                    foreach (StockTrade trade in tradeList.Trades)
                    {
                        if (trade.DataIndex == i)
                        {
                            portfolio.MakeTrade(trade, tradeList.Interval);
                        }
                    }
                    balanceChartList.Add(await portfolio.TotalBalance(i, tradeList.Interval));
                }
                _balanceChart = balanceChartList.ToArray();
            }
        }
示例#16
0
        public async void RollBackOneDay()
        {
            if (_portofolioHistory.Count > 0)
            {
                _dataIndex--;
                TimeSpan  updateSpan = DateTime.UtcNow - _simDate;
                StockData stockData  = await StockDataBase.Get(Stock, Api.Interval.Daily, updateSpan);

                if (_dataIndex >= 0)
                {
                    _simDate = stockData.TimeSeries.DataPoints[_dataIndex].DateTime;

                    ChangeStock(Stock);
                    _portfolio = new OptionPortfolio(_portofolioHistory[_portofolioHistory.Count - 1]);
                    _portofolioHistory.RemoveAt(_portofolioHistory.Count - 1);
                    NextDaySimulated?.Invoke(this, new EventArgs());
                }
            }
        }
示例#17
0
        public async void Load(Panel controlPanel, Panel variablePanel)
        {
            panelControl  = controlPanel;
            panelVariable = variablePanel;
            string dataBasePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DataMAN\\Financial data\\Options\\HistoricalOptionData";
            string listName     = "Historical Data";

            /*WatchListManager.AddNewList(listName);
             * foreach (string stockFolder in Directory.GetDirectories(dataBasePath))
             * {
             *  DirectoryInfo dInfo = new DirectoryInfo(stockFolder);
             *  string symbol = dInfo.Name;
             *  Stock stock = new Stock(symbol);
             *  WatchListManager.AddToList(listName, stock);
             * }*/
            if (MessageBox.Show("ready") == DialogResult.OK)
            {
                StockList list = WatchListManager.GetList("Historical Data");
                foreach (string symbol in list.Stocks)
                {
                    Stock     stock = new Stock(symbol);
                    StockData data  = await StockDataBase.Get(stock, Api.Interval.Daily, TimeSpan.FromDays(200));

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

                    if (DateTime.UtcNow - lastRefeshed < TimeSpan.FromMinutes(10))
                    {
                        Thread.Sleep(new TimeSpan(0, 0, 25));
                    }
                }
                MessageBox.Show("Done");
            }
        }
示例#18
0
        private async void buttonStart_Click(object sender, EventArgs e)
        {
            TrainerWindow trainer   = new TrainerWindow();
            DateTime      startDate = dateTimePickerStart.Value;
            Stock         stock     = new Stock(textBoxStock.Text);

            if (checkBoxRandomStartDate.Checked)
            {
                Random r         = new Random();
                int    totalDays = (dateTimePickerStart.MaxDate - dateTimePickerStart.MinDate).Days;
                startDate = dateTimePickerStart.MinDate.AddDays(r.Next(0, totalDays - 90));
                StockData data = await StockDataBase.Get(stock, Api.Interval.Daily);

                startDate = data.FindClosestTradeDay(startDate);
            }
            if (OptionChain.DataAvailible(stock, startDate))
            {
                trainer.Show((double)numericUpDown1.Value, startDate, new Stock(textBoxStock.Text));
                this.Close();
            }
        }
示例#19
0
            public async Task <double> Price(DateTime date)
            {
                double      price = 0;
                OptionChain chain = OptionDataBase.Get(_stock, date);

                if (chain != null)
                {
                    OptionChainDataPoint option = chain.FindOption(_optionType, _expDate, _strike);
                    price = (option.Bid + option.Ask) * 0.5;
                }
                else
                {
                    TimeSpan  updateSpan = DateTime.UtcNow - date;
                    StockData data       = await StockDataBase.Get(_stock, Api.Interval.Daily, updateSpan);

                    int index      = data.FindDateIndex(date);
                    int expiration = DaysUntilExpiration(date);
                    price = Indicators.Options.AproxPrice(data, index, _optionType, _strike, expiration);
                }
                return(price);
            }
示例#20
0
        public async static Task <GraphData> PriceGraph(DateTime openDate, Option option)
        {
            StockData data = await StockDataBase.Get(option.Stock, Api.Interval.Daily);

            int startIndex = data.FindDateIndex(openDate);
            int endIndex   = data.FindDateIndex(option.ExpirationDate);

            GraphData graph = new GraphData("PriceGraph " + option.Stock.StockSymbol + " " + option.Strike.ToString() + option.OptionType.ToString());

            for (int i = startIndex; i <= endIndex; i++)
            {
                DateTime dataPointDate = data.TimeSeries.DataPoints[i].DateTime;
                Option   opt           = Option.GetOption(option.Stock, option.OptionType, option.PositionType, option.Strike, option.ExpirationDate, dataPointDate);
                double   price         = await opt.Price(dataPointDate);

                GraphDataPoint point = new GraphDataPoint(dataPointDate, price);
                graph.DataPoints.Add(point);
            }

            return(graph);
        }
示例#21
0
        public async void Run(OptionTradeList tradeList)
        {
            if (tradeList != null && tradeList.Trades.Count > 0)
            {
                //find DataRange
                StockData firstData = await StockDataBase.Get(tradeList.Stock, tradeList.Interval);

                int startIndex = firstData.FindDateIndex(_startDate);
                int stopIndex  = firstData.FindDateIndex(_endDate);
                int dataCount  = firstData.TimeSeries.DataPoints.Count;

                if (stopIndex == 0)
                {
                    stopIndex = dataCount - 1;
                }

                //Simulate trades
                OptionPortfolio portfolio = new OptionPortfolio(_startBalance, _fee, _slippage);
                _balanceChart = new GraphData(_name + " Balance");

                for (int i = startIndex; i <= stopIndex; i++)
                {
                    foreach (OptionTrade trade in tradeList.Trades)
                    {
                        int dateIndex = firstData.FindDateIndex(trade.TradeDate);
                        if (dateIndex == i)
                        {
                            portfolio.MakeTrade(trade, tradeList.Interval);
                        }
                    }
                    DateTime       date = firstData.TimeSeries.DataPoints[i].DateTime;
                    GraphDataPoint balanceGraphDataPoint = new GraphDataPoint(date, await portfolio.TotalBalance(date, tradeList.Interval));
                    _balanceChart.DataPoints.Add(balanceGraphDataPoint);
                }
            }
        }
示例#22
0
        public async Task <OptionTradeList> Find(Stock stock, DateTime startDate, DateTime endDate)
        {
            OptionTradeList tradeList = new OptionTradeList(stock, Api.Interval.Daily);
            StockData       data      = await StockDataBase.Get(stock, Api.Interval.Daily);

            int startIndex = data.FindDateIndex(startDate);
            int endIndex   = data.FindDateIndex(endDate);

            int    period         = 40;
            double priceGainGate  = -0.5;
            double volumeGainGate = 0.5;

            int    tradeHoldLenght      = 15;
            double tradeHoldMaxGain     = 0.9;
            double tradeHoldMaxLoss     = -0.25;
            double portofolioPercentage = 0.8;

            bool inTrade = false;

            for (int i = startIndex; i <= endIndex; i++)
            {
                if (!inTrade)
                {
                    {
                        DateTime today          = data.TimeSeries.DataPoints[i].DateTime;
                        double   open           = data.TimeSeries.DataPoints[i].Open;
                        double   close          = data.TimeSeries.DataPoints[i].Close;
                        double   percentageGain = (close - open) / open;
                        if (percentageGain > priceGainGate)
                        {
                            double volume               = data.TimeSeries.DataPoints[i].Volume;
                            double volumeSMA            = Indicators.GetSMA(data, i, period, PricePoint.Volume);
                            double volumePercentageGain = (volume - volumeSMA) / volumeSMA;
                            if (volumePercentageGain > volumeGainGate)
                            {
                                Option[] options = new Option[2];
                                options[0] = new Option(stock, OptionType.Call, PositionType.Long, Math.Round(close, 0) - 5, today.AddDays(40));
                                options[1] = new Option(stock, OptionType.Call, PositionType.Short, Math.Round(close, 0) + 0, today.AddDays(40));
                                Spread      spread = new Spread(options);
                                OptionTrade trade  = new OptionTrade
                                {
                                    TradeDate           = data.TimeSeries.DataPoints[i].DateTime,
                                    PortfolioPercentage = portofolioPercentage,
                                    Spread = spread
                                };
                                tradeList.Trades.Add(trade);
                                inTrade = true;
                            }
                        }
                    }
                }
                else
                {
                    OptionTrade lastTrade = tradeList.Trades[tradeList.Trades.Count - 1];
                    DateTime    today     = data.TimeSeries.DataPoints[i].DateTime;
                    int         dateIndex = data.FindDateIndex(lastTrade.TradeDate);
                    double      openPrice = await lastTrade.Spread.Price(lastTrade.TradeDate);

                    double currentPrice = await lastTrade.Spread.Price(today);

                    double percentageGain = (currentPrice - openPrice) / openPrice;

                    if (i - dateIndex >= tradeHoldLenght || lastTrade.Spread.DaysUntilExpiration(today) < 5 || percentageGain > tradeHoldMaxGain || percentageGain < tradeHoldMaxLoss)
                    {
                        OptionTrade trade = new OptionTrade
                        {
                            TradeDate           = data.TimeSeries.DataPoints[i].DateTime,
                            PortfolioPercentage = 0,
                            Spread = lastTrade.Spread
                        };
                        tradeList.Trades.Add(trade);
                        inTrade = false;
                    }
                }
            }
            return(tradeList);
        }
示例#23
0
        public async Task <StockTradeList> Find(Stock stock, DateTime startDate, DateTime endDate)
        {
            StockTradeList tradeList = new StockTradeList(Api.Interval.Daily);
            StockData      data      = await StockDataBase.Get(stock, Api.Interval.Daily);

            int    startIndex     = data.FindDateIndex(startDate);
            int    period         = 40;
            double priceGainGate  = -0.5;
            double volumeGainGate = 0.5;

            int    tradeHoldLenght  = 15;
            double tradeHoldMaxGain = 0.04;
            double tradeHoldMaxLoss = -0.04;

            bool inTrade = false;

            for (int i = startIndex; i < data.TimeSeries.DataPoints.Count; i++)
            {
                if (!inTrade)
                {
                    {
                        double open           = data.TimeSeries.DataPoints[i].Open;
                        double close          = data.TimeSeries.DataPoints[i].Close;
                        double percentageGain = (close - open) / open;
                        if (percentageGain > priceGainGate)
                        {
                            double volume               = data.TimeSeries.DataPoints[i].Volume;
                            double volumeSMA            = Indicators.GetSMA(data, i, period, PricePoint.Volume);
                            double volumePercentageGain = (volume - volumeSMA) / volumeSMA;
                            if (volumePercentageGain > volumeGainGate)
                            {
                                StockTrade trade = new StockTrade
                                {
                                    DataIndex           = i,
                                    PortfolioPercentage = 1,
                                    Stock = stock,
                                    Type  = StockTradeType.LongStock
                                };
                                tradeList.Trades.Add(trade);
                                inTrade = true;
                            }
                        }
                    }
                }
                else
                {
                    StockTrade lastTrade      = tradeList.Trades[tradeList.Trades.Count - 1];
                    double     posOpen        = data.TimeSeries.DataPoints[lastTrade.DataIndex].Close;
                    double     currentPrice   = data.TimeSeries.DataPoints[i].Close;
                    double     percentageGain = (currentPrice - posOpen) / posOpen;

                    if (i - lastTrade.DataIndex >= tradeHoldLenght)
                    {
                        StockTrade trade = new StockTrade
                        {
                            DataIndex           = i,
                            PortfolioPercentage = 0,
                            Stock = stock,
                            Type  = StockTradeType.LongStock
                        };
                        tradeList.Trades.Add(trade);
                        inTrade = false;
                    }
                    else if (percentageGain > tradeHoldMaxGain || percentageGain < tradeHoldMaxLoss)
                    {
                        StockTrade trade = new StockTrade
                        {
                            DataIndex           = i,
                            PortfolioPercentage = 0,
                            Stock = stock,
                            Type  = StockTradeType.LongStock
                        };
                        tradeList.Trades.Add(trade);
                        inTrade = false;
                    }
                }
            }

            return(tradeList);
        }
示例#24
0
        public async void Run(StockTradeList tradeList)
        {
            if (tradeList != null && tradeList.Trades.Count > 0)
            {
                //find all stocks traded
                StockList stocks = new StockList("TradeList");
                foreach (StockTrade trade in tradeList.Trades)
                {
                    stocks.Add(trade.Stock);
                }

                //find DataRange
                StockData firstData = await StockDataBase.Get(stocks.GetStock(0), tradeList.Interval);

                int startIndex = firstData.FindDateIndex(_startDate);
                int stopIndex  = firstData.FindDateIndex(_endDate);
                int dataCount  = firstData.TimeSeries.DataPoints.Count;

                if (stopIndex == 0)
                {
                    stopIndex = dataCount - 1;
                }

                //Simulate trades
                double     timesTraded  = 0;
                double     timesRight   = 0;
                StockTrade currentTrade = new StockTrade();
                StockData  data         = firstData;
                for (int i = startIndex; i <= stopIndex; i++)
                {
                    foreach (StockTrade trade in tradeList.Trades)
                    {
                        if (trade.DataIndex == i)
                        {
                            if (trade.PortfolioPercentage > 0)
                            {
                                data = await StockDataBase.Get(trade.Stock, tradeList.Interval);

                                currentTrade = trade;
                            }
                            else
                            {
                                timesTraded++;
                                double openPrice  = data.TimeSeries.DataPoints[currentTrade.DataIndex].Close;
                                double closePrice = data.TimeSeries.DataPoints[i].Close;

                                if (currentTrade.Type == StockTradeType.LongStock && closePrice > openPrice)
                                {
                                    timesRight++;
                                }
                                if (currentTrade.Type == StockTradeType.ShortStock && closePrice < openPrice)
                                {
                                    timesRight++;
                                }
                            }
                        }
                    }
                }

                //save results
                _rightPredictPercentage = timesRight / timesTraded;
                _tradesMade             = (int)timesTraded;
            }
        }