private string GetTimeFrameSuffix(BarDataScale dataScale) { string suffix; switch (dataScale.Scale) { case BarScale.Tick: suffix = "TICKS"; break; case BarScale.Minute: suffix = string.Format("{0}MINUTES", dataScale.BarInterval); break; case BarScale.Daily: suffix = "DAY"; break; case BarScale.Weekly: suffix = "WEEK"; break; case BarScale.Monthly: suffix = "MONTH"; break; default: suffix = string.Empty; break; } return(suffix); }
private string GetSuffix(BarDataScale dataScale) { string suffix; switch (dataScale.Scale) { case BarScale.Tick: suffix = ".T"; break; case BarScale.Minute: suffix = "." + dataScale.BarInterval.ToString(); break; case BarScale.Daily: suffix = ".D"; break; case BarScale.Weekly: suffix = ".W"; break; case BarScale.Monthly: suffix = ".M"; break; default: suffix = string.Empty; break; } return(suffix); }
public BarDataScale GetDataScale() { BarDataScale dataScale; switch (cbTimeframes.SelectedIndex) { case 0: dataScale = new BarDataScale(BarScale.Tick, 1); break; case 1: dataScale = new BarDataScale(BarScale.Minute, (int)cbIntervals.SelectedItem); break; case 2: dataScale = new BarDataScale(BarScale.Daily, 0); break; case 3: dataScale = new BarDataScale(BarScale.Weekly, 0); break; case 4: dataScale = new BarDataScale(BarScale.Monthly, 0); break; default: dataScale = new BarDataScale(); break; } return(dataScale); }
private BarDataScale GetDataScale(NamedPipeClientStream pipe) { byte[] buffer; // Проверка указателя // bool checkPointer = ReadPipeData(pipe, 2, out buffer); if (!checkPointer || BitConverter.ToInt16(buffer, 0) != dataScalePointer) { throw new Exception("Ошибка: не удалось получить метку таймфрейма"); } // Получение таймфрейма // int timeFrame = 0; bool checkTimeFrame = ReadPipeData(pipe, 4, out buffer); if (checkTimeFrame) { timeFrame = BitConverter.ToInt32(buffer, 0); } else { throw new Exception("Ошибка: не удалось получить таймфрейм."); } BarDataScale dataScale = new BarDataScale(); switch (timeFrame) { case -3: dataScale.Scale = BarScale.Monthly; break; case -2: dataScale.Scale = BarScale.Weekly; break; case -1: dataScale.Scale = BarScale.Daily; break; case 0: dataScale.Scale = BarScale.Tick; dataScale.BarInterval = 1; break; default: dataScale.Scale = BarScale.Minute; dataScale.BarInterval = timeFrame; break; } return(dataScale); }
public override void RequestUpdates(List <string> symbols, DateTime startDate, DateTime endDate, BarScale scale, int barInterval, IUpdateRequestCompleted requestCompleted) { List <Task> tasks = new List <Task>(); BarDataScale dataScale = new BarDataScale(scale, barInterval); foreach (string updSymbol in symbols) { SymbolDescription symbolDescription = GetSymbolDescription(updSymbol); if (symbolDescription != null) { tasks.Add(Task.Factory.StartNew((object updateRequiredSymbol) => { string symbol = (string)updateRequiredSymbol; DateTime currentDate = DateTime.Now; Bars bars = new Bars(symbol, scale, barInterval); try { string suffix = GetSuffix(dataScale); int corrections = 0; bars.AppendWithCorrections(GetHistory(dataScale, symbol, suffix), out corrections); if (bars.Count > 0 && bars.Date[bars.Count - 1] > currentDate) { bars.Delete(bars.Count - 1); } requestCompleted.UpdateCompleted(bars); } catch (Exception exception) { logger.Error(exception); requestCompleted.UpdateError(symbol, exception); } }, updSymbol)); } else { requestCompleted.UpdateError(updSymbol, new Exception("В формате имени инструмента была допущена ошибка")); } } if (tasks.Count > 0) { Task.WaitAll(tasks.ToArray()); } requestCompleted.ProcessingCompleted(); }
private Bars GetHistory(BarDataScale dataScale, string symbol, string suffix) { string securityName; List <Candle> candles; lock (_getHistoryLocker) candles = _staticProvider.GetStaticData(dataScale, symbol, suffix, out securityName); Bars bars = new Bars(symbol, dataScale.Scale, dataScale.BarInterval); foreach (Candle candle in candles) { bars.Add(candle.Date, candle.Open, candle.High, candle.Low, candle.Close, candle.Volume); } return(bars); }
public override System.Windows.Forms.UserControl WizardNextPage(System.Windows.Forms.UserControl currentPage) { WizardPage wizardPage = currentPage as WizardPage; if (wizardPage != null) { _newDSScale = wizardPage.GetDataScale(); int errors = 0; _newDSSymbols = wizardPage.GetSymbolsDescription(ref errors); if (errors > 0) { MessageBox.Show(string.Format("В формате имени одного или нескольких инструментов была допущена ошибка. Всего ошибок: {0}.", errors), "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } return(null); }
/// <summary> /// True if QuikQuote is inside QuikBar time interval /// </summary> /// <param name="bar">QuikBar</param> /// <param name="quote">QuikQuote</param> /// <param name="dataScale">Bar data scale</param> /// <returns></returns> private static bool IsNewBarQuote(QuikBar bar, QuikQuote quote, BarDataScale dataScale) { switch (dataScale.Scale) { case BarScale.Tick: return(true); break; case BarScale.Second: return(quote.Time.Second != bar.OpenTime.Second && quote.Time.Second % dataScale.BarInterval == 0); break; case BarScale.Minute: return(quote.Time.Minute != bar.OpenTime.Minute && quote.Time.Minute % dataScale.BarInterval == 0); break; case BarScale.Daily: case BarScale.Weekly: default: return(quote.Time.Day != bar.OpenTime.Day && quote.Time.Day % dataScale.BarInterval == 0); break; case BarScale.Monthly: case BarScale.Quarterly: return(quote.Time.Month != bar.OpenTime.Month && quote.Time.Month % dataScale.BarInterval == 0); break; case BarScale.Yearly: return(quote.Time.Year != bar.OpenTime.Year && quote.Time.Year % dataScale.BarInterval == 0); } }
private string GetPipeName(BarDataScale dataScale, string symbol, string suffix, bool staticPipe) { string pipeName; string timeFrameSuffix = GetTimeFrameSuffix(dataScale); List <SymbolDescription> symbols = (List <SymbolDescription>)_settingsProvider.GetObject("ImportSymbols", typeof(List <SymbolDescription>)) ?? new List <SymbolDescription>(); string appropriateSymbol = (from symbolDescription in symbols where symbolDescription.FullCode == symbol select symbolDescription.ExportName).DefaultIfEmpty(symbol).First(); if (staticPipe) { pipeName = string.Format("QUIK_{0}{1}_{2}_EXISTING_DATA", appropriateSymbol, suffix, timeFrameSuffix); } else { pipeName = string.Format("QUIK_{0}{1}_{2}", appropriateSymbol, suffix, timeFrameSuffix); } return(pipeName); }
private bool UpdateRequired(SymbolDescription description, BarDataScale barDataScale) { if (!_dataStore.ContainsSymbol(description.FullCode, barDataScale.Scale, barDataScale.BarInterval)) { return(true); } MarketHours mktHours = new MarketHours(); mktHours.Market = GetMarketInfo(description.FullCode); DateTime updateTime = _dataStore.SymbolLastUpdated(description.FullCode, barDataScale.Scale, barDataScale.BarInterval); if (!barDataScale.IsIntraday) { if ((DateTime.Now.Date >= updateTime.Date.AddDays(1)) || (updateTime.Date < mktHours.LastTradingSessionEndedNative.Date)) { return(true); } else { return(false); } } else { if (mktHours.IsMarketOpenNow || (updateTime < mktHours.LastTradingSessionEndedNative)) { return(true); } else { return(false); } } }
public override string TifForStrategyOrders(BarDataScale scale) { l.Debug("TifForStrategyOrders " + scale.ToString()); return("Day"); }
public override string RouteForStrategyOrders(BarDataScale scale) { l.Debug("RouteForStrategyOrders " + scale.ToString()); return "RouteForStrategyOrders"; }
public void Stream(string symbol, CancellationToken token) { BarDataScale dataScale = new BarDataScale(BarScale.Minute, 1); string pipeName = GetPipeName(dataScale, symbol, string.Empty, false); using (NamedPipeClientStream quikPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.None)) { try { quikPipe.Connect(1000); // Проверка версии протокола CheckProtocolVersion(quikPipe); // Получение полного имени инструмента string securityName = GetSymbolName(quikPipe); // Получение таймфрейма для инструмента BarDataScale pipeScale = GetDataScale(quikPipe); bool sendQuote = false; int candlesCount = -1; while (true) { token.ThrowIfCancellationRequested(); byte[] buffer; // Получение указателя // short pointer = 0; bool checkPointer = ReadPipeData(quikPipe, 2, out buffer); if (checkPointer) { pointer = BitConverter.ToInt16(buffer, 0); } else { throw new Exception("Не удалось получить указатель"); } switch (pointer) { // Неизвестный указатель: // не удалось установить назначение // в комментах была следующая строка "Stop Session for %s" // case unknownPointer: _logger.Debug(string.Format("[{0}] Неизвестный указатель в последовательности данных", symbol)); break; // Получение количества свечей // case candlesCountPointer: bool checkCandlesCount = ReadPipeData(quikPipe, 4, out buffer); if (!checkCandlesCount) { throw new Exception("Не удалось получить количество свечей"); } if (!sendQuote) { candlesCount = BitConverter.ToInt32(buffer, 0); } break; // Получение данных свечи // case candlesDataPointer: try { DateTime timeStamp = DateTime.Now; Candle candle = GetCandle(quikPipe); if (sendQuote && NewQuote != null) { Quote quote = new Quote() { Symbol = symbol, TimeStamp = timeStamp.Minute > candle.Date.Minute ? candle.Date.AddSeconds(59) : timeStamp, Price = candle.Close, Size = candle.Volume, }; NewQuote(quote, candle); } candlesCount--; if (!sendQuote && candlesCount == 0) { sendQuote = true; } } catch (Exception ex) { _logger.Debug(string.Format("[{0}] {1}", symbol, ex)); } break; // Получение количества оставшихся свечей // case candlesLeftPointer: ReadPipeData(quikPipe, 4, out buffer); break; // Неверная последовательность // default: break; } } } catch (OperationCanceledException) { } catch (Exception ex) { _logger.Error("[STREAM] " + ex); } } }
public List <Candle> GetStaticData(BarDataScale dataScale, string symbol, string suffix, out string securityName) { string pipeName = GetPipeName(dataScale, symbol, suffix, false); List <Candle> candles = new List <Candle>(); using (NamedPipeClientStream quikPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.None)) { try { quikPipe.Connect(1000); } catch (TimeoutException) { throw new Exception("Не удалось подключиться к каналу передачи данных."); } catch (IOException) { throw new Exception("Канал передачи данных занят."); } // Проверка версии протокола CheckProtocolVersion(quikPipe); // Получение полного имени инструмента securityName = GetSymbolName(quikPipe); // Получение таймфрейма для инструмента BarDataScale pipeScale = GetDataScale(quikPipe); if (!pipeScale.Equals(dataScale)) { throw new Exception("Таймфрем запроса не совпадает с таймфреймом полученных котировок."); } bool update = true; while (update) { byte[] buffer; // Получение указателя // short pointer = 0; bool checkPointer = ReadPipeData(quikPipe, 2, out buffer); if (checkPointer) { pointer = BitConverter.ToInt16(buffer, 0); } else { throw new Exception("Не удалось получить указатель"); } switch (pointer) { // Неизвестный указатель: // не удалось установить назначение // в комментах была следующая строка "Stop Session for %s" // case unknownPointer: _logger.Debug(string.Format("[{0}.{1}] Неизвестный указатель в последовательности данных.", symbol, suffix)); break; // Получение количества свечей // case candlesCountPointer: bool checkCandlesCount = ReadPipeData(quikPipe, 4, out buffer); int candlesCount = 0; if (checkCandlesCount) { candlesCount = BitConverter.ToInt32(buffer, 0); } else { throw new Exception("Не удалось получить количество свечей."); } break; // Получение данных свечи // case candlesDataPointer: try { Candle candle = GetCandle(quikPipe); if (pipeScale.IsIntraday) { candle.Date = candle.Date.AddMinutes(pipeScale.BarInterval); } candles.Add(candle); } catch (Exception ex) { _logger.Debug(string.Format("[{0}.{1}] {2}", symbol, suffix, ex)); update = false; } break; // Получение количества оставшихся свечей // case candlesLeftPointer: bool chekCandlesLeft = ReadPipeData(quikPipe, 4, out buffer); int candlesLeft = 0; if (chekCandlesLeft) { candlesLeft = BitConverter.ToInt32(buffer, 0); } if (candlesLeft == 0) { update = false; } break; // Неверная последовательность // default: throw new Exception(string.Format("Неверная последовательность данных. Последняя метка: {0}", pointer)); } } } return(candles); }
/// <summary> /// True if QuikQuote is inside QuikBar time interval /// </summary> /// <param name="bar">QuikBar</param> /// <param name="quote">QuikQuote</param> /// <param name="dataScale">Bar data scale</param> /// <returns></returns> private static bool IsNewBarQuote(QuikBar bar, QuikQuote quote, BarDataScale dataScale) { switch (dataScale.Scale) { case BarScale.Tick: return true; break; case BarScale.Second: return (quote.Time.Second != bar.OpenTime.Second && quote.Time.Second % dataScale.BarInterval == 0); break; case BarScale.Minute: return ( quote.Time.Minute != bar.OpenTime.Minute && quote.Time.Minute % dataScale.BarInterval == 0); break; case BarScale.Daily: case BarScale.Weekly: default: return (quote.Time.Day != bar.OpenTime.Day && quote.Time.Day % dataScale.BarInterval == 0); break; case BarScale.Monthly: case BarScale.Quarterly: return (quote.Time.Month != bar.OpenTime.Month && quote.Time.Month % dataScale.BarInterval == 0); break; case BarScale.Yearly: return (quote.Time.Year != bar.OpenTime.Year && quote.Time.Year % dataScale.BarInterval == 0); } }
public override string RouteForStrategyOrders(BarDataScale scale) { l.Debug("RouteForStrategyOrders " + scale.ToString()); return("RouteForStrategyOrders"); }
public override string TifForStrategyOrders(BarDataScale scale) { return("Default"); }
public override string RouteForStrategyOrders(BarDataScale scale) { return("UniversalBrokerAdapter"); }
public override string TifForStrategyOrders(BarDataScale scale) { l.Debug("TifForStrategyOrders " + scale.ToString()); return "Day"; }