private void ButtonRemove_Click(object sender, RoutedEventArgs e) { remove = true; selectedSymbol = SymbolsCb.SelectedItem as Data.SymbolInfo; selectedDateTime = DatePicker.SelectedDate ?? DateTime.Today; type = TypeCb.SelectedItem as string; price = double.Parse(Price.Text.ToString(), Data.numberFormat); Close(); }
private void ButtonAddEdit_Click(object sender, RoutedEventArgs e) { if (fromList) { edit = true; } else { add = true; } selectedSymbol = SymbolsCb.SelectedItem as Data.SymbolInfo; selectedDateTime = DatePicker.SelectedDate ?? DateTime.Today; type = TypeCb.SelectedItem as string; price = double.Parse(Price.Text.ToString().Replace(",", "."), Data.numberFormat); Close(); }
public static Data.SymbolDayData GetSdd(Data.SymbolInfo si, out string time) { time = ""; Console.WriteLine("GetSdd: {0}", si.FullName); try { HtmlWeb web = new HtmlWeb(); HtmlDocument doc = new HtmlDocument(); string data = "http://stooq.pl/q/?s=" + si.ShortName; doc = web.Load(data); HtmlNodeCollection symbolNodes = doc.DocumentNode.SelectNodes("//*/font[@id=\"f18\"]"); string currentPrice = symbolNodes[1].InnerText; HtmlNodeCollection hiCol = doc.DocumentNode.SelectNodes("//*/span[@id='aq_" + si.ShortName.ToLower(CultureInfo.InvariantCulture) + "_h']"); string hi = hiCol[0].InnerText; HtmlNodeCollection lowCol = doc.DocumentNode.SelectNodes("//*/span[@id='aq_" + si.ShortName.ToLower(CultureInfo.InvariantCulture) + "_l']"); string low = lowCol[0].InnerText; HtmlNodeCollection openCol = doc.DocumentNode.SelectNodes("//*/span[@id='aq_" + si.ShortName.ToLower(CultureInfo.InvariantCulture) + "_o']"); string open = openCol[0].InnerText; HtmlNodeCollection timeCol = doc.DocumentNode.SelectNodes("//*/span[@id='aqdat']"); time = timeCol[0].InnerText.Remove(timeCol[0].InnerText.IndexOf("CET") + 3); Data.SymbolDayData sdd = new Data.SymbolDayData(DateTime.Today, float.Parse(open, CultureInfo.InvariantCulture), float.Parse(hi, CultureInfo.InvariantCulture), float.Parse(low, CultureInfo.InvariantCulture), float.Parse(currentPrice, CultureInfo.InvariantCulture), 0); //TODO vol maybe in future return(sdd); } catch (Exception) { Debug.Assert(false); } return(null); }
public DrawingInfo(Data.SymbolInfo symInfo, int width, int height) { viewHeight = height; viewWidth = width; viewMarginTop = 3; viewMarginBottom = 30 /* TODO: status bar h */ + 20; viewMarginLeft = 3; viewMarginRight = 100; viewAutoScale = true; crossMargin = 15; candleWidth = 5; candleMargin = 1; maxNoVertLines = 15; // should be max PIXELS height maxVal = minVal = 0; minViewport = maxViewport = 0; refDateStart = DateTime.Now; refPixelXStart = 0; sddList = null; currentPriceTime = ""; si = symInfo; }
public static List <Data.SymbolDayData> GetSymbolData(Dictionary <string, List <Data.SymbolDayData> > sdds, Data.SymbolInfo si) { string symbolName = si.ShortName; if (sdds.ContainsKey(symbolName)) { return(sdds[symbolName]); } string csv = ""; string today = DateTime.Today.ToString("dd-MM-yyyy"); string filename = "stocker_" + today + "_" + symbolName + ".csv"; if (MainWindow.testMode) { filename = "stocker_00-00-0000_AAA.csv"; } string fileId = Drive.GetFileId(filename); if (fileId != "") { csv = Drive.DownloadFile(fileId, filename); } else { csv = Sources.GetHtml(symbolName); string folderId = Drive.CreateDirectory("temp"); Drive.UploadFile(folderId, filename, csv); } if (csv == "Przekroczony dzienny limit wywolan") { MessageBox.Show(csv, "ERROR"); } List <Data.SymbolDayData> result = new List <Data.SymbolDayData>(); foreach (string line in csv.Split('\n')) { if (line.Length == 0) { continue; } if (line[0] == 'D') { continue; } string[] data = line.Split(','); Debug.Assert(data.Count() >= 5); DateTime date = DateTime.ParseExact(data[0], "yyyy-MM-dd", CultureInfo.InvariantCulture); // discard old data for perf if (date.Year < 2016) { continue; } float open = float.Parse(data[1], CultureInfo.InvariantCulture); float hi = float.Parse(data[2], CultureInfo.InvariantCulture); float low = float.Parse(data[3], CultureInfo.InvariantCulture); float close = float.Parse(data[4], CultureInfo.InvariantCulture); uint volume = 0; if (data.Length == 6) { volume = uint.Parse(data[5]); } Data.SymbolDayData sdd = new Data.SymbolDayData(date, open, hi, low, close, volume); result.Add(sdd); } result.Reverse(); sdds.Add(symbolName, result); return(result); }
// NOTE: this function is adapted to be run in a thread static retData CreateOneReport(Dictionary <string, List <Data.SymbolDayData> > sdds, Data.SymbolInfo symbolInfo) { string report = ""; if (SymbolsDrawingsToSerialize.ContainsKey(symbolInfo.FullName) == false) { return(new retData()); } var sdd = GetSymbolData(sdds, symbolInfo); foreach (var line in SymbolsDrawingsToSerialize[symbolInfo.FullName].chartLines) { if (line.Color != "Lime" && line.Color != "Red") { continue; } DateTime lineStartDate = DateTime.ParseExact(line.StartPointDV.Split('+')[0], Data.dateTimeFormat, CultureInfo.InvariantCulture); DateTime lineEndDate = DateTime.ParseExact(line.EndPointDV.Split('+')[0], Data.dateTimeFormat, CultureInfo.InvariantCulture); double extraDaysFromStart = double.Parse(line.StartPointDV.Split('+')[1].Split(';')[0], Data.numberFormat); double extraDaysToEnd = double.Parse(line.EndPointDV.Split('+')[1].Split(';')[0], Data.numberFormat); if (lineEndDate.AddDays(extraDaysToEnd) < sdd[0].Date) { continue; } // find sdd at start of line var sddIt = 0; while (sdd[sddIt].Date > lineStartDate) { sddIt++; } double numDays = sddIt - extraDaysFromStart + extraDaysToEnd; double startVal = double.Parse(line.StartPointDV.Split(';')[1], Data.numberFormat); double endVal = double.Parse(line.EndPointDV.Split(';')[1], Data.numberFormat); double step = (endVal - startVal) / numDays; double lineValAtSdd0 = startVal + step * sddIt; if (sdd[0].Low < lineValAtSdd0 && lineValAtSdd0 < sdd[0].Hi) { string e = ""; report += "NAME: " + symbolInfo.FullName + " with "; if (step > 0) { e += "ASCENDING line "; } else { e += "DESCENDING line "; } e += "crossed at value " + lineValAtSdd0.ToString("F2", Data.numberFormat); ReportItem ri = new ReportItem(); ri.Symbol = symbolInfo.FullName; ri.Date = sdd[0].Date; ri.Event = e; ReportItems.Add(ri); report += e + "\n"; } } var rd = new retData(); rd.reportString = report; return(rd); }
public static List <Data.SymbolInfo> GetSymbolsFromWeb() { List <Data.SymbolInfo> symbols = new List <Data.SymbolInfo>(); HtmlWeb web = new HtmlWeb(); HtmlDocument doc = new HtmlDocument(); int page = 1; int added = 0; Console.WriteLine("GetSymbolsFromWeb()"); while (true) { string data = "http://stooq.pl/t/?i=513&v=1&l=" + page.ToString(); doc = web.Load(data); // XPath of symbol name // *[@id="f10"] HtmlNodeCollection symbolNodes = doc.DocumentNode.SelectNodes("//*/td[@id=\"f10\"]"); foreach (HtmlNode node in symbolNodes.Skip(2)) { string fullName = node.InnerText; string shortName = node.ParentNode.FirstChild.FirstChild.InnerText; Data.SymbolInfo si = new Data.SymbolInfo(fullName, shortName); symbols.Add(si); } if (symbols.Count <= added) { throw new Exception("assert"); } added = symbols.Count; // check if this is a last page string numOfItemsStr = doc.DocumentNode.SelectNodes("//*[@id=\"f13\"]/text()[1]")[0].InnerText; Regex reNumOfItems = new Regex(@".*?(\d+) z (\d+).*"); Match m = reNumOfItems.Match(numOfItemsStr); if (m.Groups[1].ToString() == m.Groups[2].ToString()) { if (symbols.Count.ToString() != m.Groups[2].ToString()) { throw new Exception("assert"); } break; } page += 1; } // manually added { Data.SymbolInfo intel = new Data.SymbolInfo("_US_INTEL", "INTC.US"); symbols.Add(intel); Data.SymbolInfo wig = new Data.SymbolInfo("_WIG", "WIG"); symbols.Add(wig); Data.SymbolInfo wig20 = new Data.SymbolInfo("_WIG20", "WIG20"); symbols.Add(wig20); Data.SymbolInfo usdpln = new Data.SymbolInfo("_FX_USDPLN", "USDPLN"); symbols.Add(usdpln); Data.SymbolInfo eurpln = new Data.SymbolInfo("_FX_EURPLN", "EURPLN"); symbols.Add(eurpln); Data.SymbolInfo chfpln = new Data.SymbolInfo("_FX_CHFPLN", "CHFPLN"); symbols.Add(chfpln); Data.SymbolInfo gbppln = new Data.SymbolInfo("_FX_GBPPLN", "GBPPLN"); symbols.Add(gbppln); } return(symbols); }