public void UpdateLastSDD() { Debug.Assert(canvas != null); Data.SymbolDayData lastSdd = drawingInfo.sddList[0]; int cbgFound = -1; // CandleBodyGeom int csgFound = -1; // CandleShadowGeom CandleTag ct = new CandleTag(); for (int i = 0; i < canvas.Children.Count; i++) { if (canvas.Children[i] is CandleBodyGeom && ((CandleTag)((CandleBodyGeom)canvas.Children[i]).Tag).first) { cbgFound = i; ct = (CandleTag)((CandleBodyGeom)canvas.Children[i]).Tag; canvas.Children.RemoveAt(cbgFound); break; } } for (int i = 0; i < canvas.Children.Count; i++) { if (canvas.Children[i] is CandleShadowGeom && ((CandleTag)((CandleShadowGeom)canvas.Children[i]).Tag).first) { csgFound = i; canvas.Children.RemoveAt(csgFound); break; } } CreateCandle(canvas, ct.offset, lastSdd, ct.first); }
public void CreateCandle(Canvas canvas, int offset, Data.SymbolDayData sdd, bool first) { double[] sortedVals = { sdd.Hi, sdd.Open >= sdd.Close ? sdd.Open : sdd.Close, sdd.Open > sdd.Close ? sdd.Close : sdd.Open, sdd.Low }; if (drawingInfo.viewAutoScale) { sortedVals[0] = Misc.RemapRangeValToPix(sortedVals[0], drawingInfo); sortedVals[1] = Misc.RemapRangeValToPix(sortedVals[1], drawingInfo); sortedVals[2] = Misc.RemapRangeValToPix(sortedVals[2], drawingInfo); sortedVals[3] = Misc.RemapRangeValToPix(sortedVals[3], drawingInfo); } bool upDir = sdd.Open > sdd.Close ? false : true; var candle = new CandleBodyGeom(drawingInfo, offset, sortedVals, first, upDir); var shadow = new CandleShadowGeom(drawingInfo, offset, sortedVals, first, upDir); canvas.Children.Add(candle); canvas.Children.Add(shadow); }
public static bool LineValueOnSdd(ChartLine line, Data.SymbolDayData sdd) { DrawingInfo di = line.GetDrawingInfo(); double PDR = DateToPixel(di, sdd.Date, 0); double PVRLO = Math.Round(RemapRangeValToPix(sdd.Low, di), 6); double PVRHI = Math.Round(RemapRangeValToPix(sdd.Hi, di), 6); Point pLO = new Point(PDR, PVRLO); Point pHI = new Point(PDR, PVRHI); return(DoIntersect(line.getP1(), line.getP2(), pLO, pHI)); }
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 static Type Check(Chart.ChartLine line, Data.SymbolDayData sdd) { bool cross = Misc.LineValueOnSdd(line, sdd); bool upCandle = sdd.Open < sdd.Close; bool downCandle = !upCandle; bool upLine = line.getP1().X > line.getP2().X ? line.getP1().Y <line.getP2().Y : line.getP1().Y> line.getP2().Y; bool downLine = !upLine; if (cross && upCandle && upLine) { return(Type.CrossUpLineWithTrend); } else if (cross && downCandle && downLine) { return(Type.CrossDownLineWithTrend); } return(Type.Nothing); }
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); }