/// <summary>Send a range of market data.</summary> private void SendHistoricMarketData(MarketSeries series, int i_oldest, int i_newest) { // Send historical data to Tradee var open_time = new List <long>(series.OpenTime.Count); var open = new List <double>(series.Open.Count); var high = new List <double>(series.High.Count); var low = new List <double>(series.Low.Count); var close = new List <double>(series.Close.Count); var median = new List <double>(series.Median.Count); var volume = new List <double>(series.TickVolume.Count); Debug.Assert(i_newest <= i_oldest); for (int i = i_oldest; i-- != i_newest;) { var t = series.OpenTime.Last(i).Ticks; var o = series.Open.Last(i); var h = series.High.Last(i); var l = series.Low.Last(i); var c = series.Close.Last(i); var m = series.Median.Last(i); var v = series.TickVolume.Last(i); open_time.Add(t); open.Add(o); high.Add(Math.Max(h, Math.Max(o, c))); low.Add(Math.Min(l, Math.Min(o, c))); close.Add(c); median.Add(m); volume.Add(v); } // Nothing available? if (close.Count == 0) { return; } // Create a candle batch var data = new PriceCandles( open_time.ToArray(), open.ToArray(), high.ToArray(), low.ToArray(), close.ToArray(), median.ToArray(), volume.ToArray()); if (Model.Post(new InMsg.CandleData(SymbolCode, series.TimeFrame.ToTradeeTimeframe(), data))) { Debug.WriteLine("Historic data for {0},{1} sent".Fmt(series.SymbolCode, series.TimeFrame.ToTradeeTimeframe())); } }
/// <summary>Send fake historic data</summary> private void SendHistoricData() { const int Count = 20; foreach (var tf in TimeFrames) { var one = Misc.TimeFrameToTicks(1.0, tf); var candles = new PriceCandles( Enumerable.Range(0, Count).Select(i => m_now - (Count - i) * one).ToArray(), Enumerable.Range(0, Count).Select(i => m_rng.NextDouble(0.5, 1.5)).ToArray(), Enumerable.Range(0, Count).Select(i => m_rng.NextDouble(1.5, 2.0)).ToArray(), Enumerable.Range(0, Count).Select(i => m_rng.NextDouble(0.0, 0.5)).ToArray(), Enumerable.Range(0, Count).Select(i => m_rng.NextDouble(0.5, 1.5)).ToArray(), Enumerable.Range(0, Count).Select(i => m_rng.NextDouble(0.5, 1.5)).ToArray(), Enumerable.Range(0, Count).Select(i => (double)(int)m_rng.NextDouble(1, 100)).ToArray()); Model.Post(new InMsg.CandleData(SymbolCode, tf, candles)); } }
/// <summary>Add a batch of candles</summary> public void Add(ETimeFrame tf, PriceCandles candles) { // Insert the candles into the database using (var t = m_db.NewTransaction()) using (var query = new Sqlite.Query(m_db, SqlExpr.InsertCandle(tf))) { foreach (var candle in candles.AllCandles.Select(x => new Candle(x))) { query.Reset(); query.BindParms(1, SqlExpr.InsertCandleParams(candle)); query.Run(); } t.Commit(); } // Don't bother maintaining the cache, just invalidate it InvalidateCachedData(); // Record the last time data was received LastUpdatedUTC = Model.UtcNow; // Notify data added/changed DataChanged.Raise(this, new DataEventArgs(this, tf, null, false)); }