public void TestMakeCandles() { var pool = new CandlePackerPool(); var quoteNames = new[] { "EURUSD", "GBPUSD" }; CandleDataBidAsk[] candles = null; for (var date = DateTime.Now.Date; date < DateTime.Now.Date.AddDays(1).AddSeconds(1); date = date.AddSeconds(22)) { candles = pool.MakeCandles(new[] { new QuoteData(1, 1.0001f, date), new QuoteData(2, 2.0001f, date), }, ref quoteNames); Assert.IsNotNull(candles, "CandlePackerPool.MakeCandles - должен таки вернуть свечи"); Assert.AreEqual(candles.Length, 2, "CandlePackerPool.MakeCandles - должен таки вернуть 2 свечи"); } var candle = candles[0]; Assert.Less((DateTime.Now.Date.AddDays(1) - candle.timeClose).TotalSeconds, 30, "CandlePackerPool.MakeCandles - должен закончиться на последней свече за день"); // добавить левый тикер quoteNames = new[] { "EURUSD", "IDDQD" }; candles = pool.MakeCandles(new[] { new QuoteData(1, 1.0001f, DateTime.Now), new QuoteData(2, 2.0001f, DateTime.Now), }, ref quoteNames); Assert.AreEqual(1, candles.Length, "CandlePackerPool.MakeCandles - должен пропустить левый тикер (свечу)"); Assert.AreEqual(1, quoteNames.Length, "CandlePackerPool.MakeCandles - должен пропустить левый тикер"); Assert.IsNotNull(candles[0], "CandlePackerPool.MakeCandles - оставшаяся свеча не должна пропасть"); }
/// <summary> /// отдать "живые" котировки роботам /// </summary> private void ProcessQuoteRoutineDoWork(object sender, DoWorkEventArgs e) { var quoteList = (List <Cortege2 <string, QuoteData> >)e.Argument; string[] quoteNames; CandleDataBidAsk[] candles; packerPool.MakeCandles(quoteList, out quoteNames, out candles); foreach (var robot in robots) { List <string> robotEvents; try { robotEvents = robot.OnQuotesReceived(quoteNames, candles, false); if (robotEvents == null || robotEvents.Count == 0) { continue; } } catch (Exception ex) { Logger.ErrorFormat("Ошибка в ProcessQuoteRoutineDoWork ({0}): {1}", robot.GetUniqueName(), ex); continue; } ShowRobotEventsSafe(robot, robotEvents); } }
public void OnQuotesReceived(string[] names, QuoteData[] quotes) { if (State != FarmState.Started) { return; } // if (RobotFarmOffTime.IsTimeOff()) return; var candles = packerPool.MakeCandles(quotes, ref names); foreach (var account in Accounts) { try { account.OnQuotesReceived(names, candles, false); } catch (Exception ex) { Logger.Error("Ошибка обработки котировок по счету " + account.AccountId + ": " + ex.Message); } } }