// private const string TableNameQuote = "QUOTE"; /// <summary> /// получает котировки (свечи m1) по всем торгуемым активам на момент /// времени t меньше либо равный time /// </summary> public static Dictionary<string, CandleData> GetCandlesOnTime(DateTime? time) { var candles = new Dictionary<string, CandleData>(); var cmdText = time.HasValue ? "WITH e AS ( select ticker, MAX([date]) as 'mxdate' from QUOTE where [date] <= '" + time.Value.ToString("yyyyMMdd HH:mm") + "' group by ticker ) select q.* " + "FROM e join QUOTE q on q.ticker = e.ticker and q.date = e.mxdate" : "WITH e AS ( select ticker, MAX([date]) as 'mxdate' from QUOTE group by ticker ) select q.* " + "FROM e join QUOTE q on q.ticker = e.ticker and q.date = e.mxdate"; var cmd = new SqlCommand(cmdText); var values = new object[4]; try { using (var conn = MakeSqlConnection()) { cmd.Connection = conn; conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { if (reader.GetValues(values) != values.Length) continue; var ticker = (Int16) values[0]; var symbol = DalSpot.Instance.GetSymbolByFXICode(ticker); if (string.IsNullOrEmpty(symbol)) continue; var pointValue = DalSpot.Instance.GetPrecision10(symbol); var candle = new CandleData { timeOpen = (DateTime)values[1], open = (float)(double)values[2], }; var hlc = (int)values[3]; candle.MakeHlcFromOffset(hlc, pointValue); candles.Add(symbol, candle); } } } } catch (Exception ex) { Logger.Error("GetCandlesOnTime() - ошибка доступа к БД котировок", ex); } return candles; }
public void TestHlcFormat() { var candleData = new CandleData { open = (float) 1.2345, high = (float) 1.2355, low = (float) 1.2335, close = (float) 1.2344 }; var offset = candleData.GetHlcOffset(VersePointValue); Assert.AreEqual(0x7E7589, offset, "TestHlcFormat: GetHlcOffset error"); var line = candleData.GetHlcOffsetHEX(VersePointValue); Assert.AreEqual("7E7589", line, "TestHlcFormat: GetHlcOffsetHEX error"); var offset16 = candleData.GetHlcOffset16(VersePointValue); Assert.AreEqual(0x7F9B8063, offset16, "TestHlcFormat: GetHlcOffset16 error"); var line16 = candleData.GetHlcOffsetHEX16(VersePointValue); Assert.AreEqual("7F9B8063", line16, "TestHlcFormat: GetHlcOffsetHEX16 error"); var candle = new CandleData {open = candleData.open}; candle.MakeHlcFromOffset(offset, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffset error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffset error (low)"); Assert.AreEqual(candleData.close, candle.close, 0.00001, "TestHlcFormat: MakeHlcFromOffset error (close)"); candle.MakeHlcFromOffsetHEX(line, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffsetHEX error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffsetHEX error (low)"); Assert.AreEqual(candleData.close, candle.close, 0.00001, "TestHlcFormat: MakeHlcFromOffsetHEX error (close)"); candle.MakeHlcFromOffset16(offset16, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (low)"); candle.MakeHlcFromOffsetHEX16(line16, VersePointValue); Assert.AreEqual(candleData.high, candle.high, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (high)"); Assert.AreEqual(candleData.low, candle.low, 0.00001, "TestHlcFormat: MakeHlcFromOffset16 error (low)"); }