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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #10
0
        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";
 }