← Zurück

Загрузка исторических данных

Здравствуйте!

Мне для торговли необходимо получать исторические свечные данные и тут бы метод закачки свечей с сайта финама как раз бы помог. Но я не могу разобраться в методах, поскольку:

  1.  Видео-урок 4 устарел. Последняя версия  библиотеки (4.3.19.5) используют модифицированную функцию GetCandle , одним из параметров которой является интерфейс INativeIdStorage. Кроме того все последующие версии библиотек ( после с 4.2.10) не используют явно заданное хранилище, которое описывается в видео-уроке. (хотелось бы понять как это сейчас работает. Нужно создавать свой класс для реализации интерфейса?).
    
  2.  Попытка запустить проект загрузки исторических данных (CandleDownloadUsing) из разных решений StockSharp.Edu не увенчалась успехом – в большинстве случаях в предшествующих версиях библиотек при выполнении метода GetCandle  вызывается исключение – “не удалось соединиться с удаленным сервером”. Почему появляется такое исключение? Сменились адреса серверов?
    
  3.  Проект CandleDownloadUsing в последней версии вообще не модифицирован, что вызывает исключение при обращении к несуществующим полям. 
    

Есть возможность сделать рабочий пример CandleDownloadUsing с расширенными комментариями?

War dieses Thema hilfreich?

Thema teilen

Kommentare (15)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

Чтобы ваши сообщения были видны технической поддержке, предлагаем вам пройти процедуру, описанную здесь http://stocksharp.ru/articles/7809/support-20/

Support
Support

Пример во вложении... Также можете посмотреть пример SampleHistoryTesting.

swnike
Александр3012
Александр3012

Благодарю, с nativeIdStorage, вроде, стало понятнее, но пример во вложении не работает, видимо он собран на устаревшей версии библиотеки. Теперь в FinamHistorySource метод Refresh требует ещё провайдер бирж, что это и зачем - опять не понятно. Большая просьба, сделайте на свежей библиотеке маленькую программку качающую исторические свечи с финама или любого ресурса, чтоб можно было разобраться и поправить в своих роботов, а то в курсах все устаревшее, а без информации не специалисту разобраться не просто.

Support
Support

Какую версию s# используете?

Александр3012
Александр3012

4.3.21

Александр3012
Александр3012

4.3.21

Александр3012
Александр3012

Уважаемая техподдержка, ответьте что-нибудь. Разъясните на примере или просто словами. Не понятно как с новой библиотекой закачивать исторические данные.

Support
Support

Реализуйте IExchangeInfoProvider как показано в следующем примере или используйте предыдущую версию...

private class ExchangeInfoProvider : IExchangeInfoProvider { public IEnumerable Boards => throw new NotImplementedException();

        public IEnumerable<Exchange> Exchanges => throw new NotImplementedException();

        public event Action<ExchangeBoard> BoardAdded;
        public event Action<Exchange> ExchangeAdded;

        public Exchange GetExchange(string code)
        {
            throw new NotImplementedException();
        }

        public ExchangeBoard GetExchangeBoard(string code)
        {
            switch (code)
            {
                case "TQBR" :
                    return ExchangeBoard.MicexTqbr;
                case "TQBS":
                    return ExchangeBoard.MicexTqbs;
                default:
                    break;
            }

            return ExchangeBoard.Micex;
        }

        public void Save(ExchangeBoard board)
        {
            throw new NotImplementedException();
        }

        public void Save(Exchange exchange)
        {
            throw new NotImplementedException();
        }
    }

IExchangeInfoProvider exchangeInfoProvider = new ExchangeInfoProvider(); bool isCanceled = false; _finamHistorySource.Refresh(finamSecurityStorage, nativeIdStorage, exchangeInfoProvider, new Security(), s => , () => isCanceled);

Александр3012
Александр3012

Уважаемая техподдержка, добрый день. Собрал на новой библиотеке 4.3.23 пример для закачки свечей с финама, подправил его под нее, все заработало, но вот такая непонятная штука происходит: Закачиваю свечи для сбера - все работает, качаешь фьючерс - выдает ошибку. "Необработанное исключение типа "System.ArgumentException" в StockSharp.Algo.History.dll Дополнительные сведения: Инструмент RIM7@FORTS не содержит идентификатор Finam (market)." Подскажите как победить эту беду. Ошибка выпадает на предпоследней строчке "var candles = _finamHistorySource.GetCandles(security, timeFrame, start, end);"

namespace свечи_с_финама_4._3._23 {

class Program
{

    /// <summary>
    /// Хранилище инструментов Финама
    /// </summary>
    private class FinamSecurityStorage : CollectionSecurityProvider, ISecurityStorage
    {
        public FinamSecurityStorage(Security security)
            : base(new[] { security })
        {
        }

        void ISecurityStorage.Save(Security security)
        {
        }

        void ISecurityStorage.Delete(Security security)
        {
            throw new NotSupportedException();
        }

        void ISecurityStorage.DeleteBy(Security criteria)
        {
            throw new NotSupportedException();
        }


        //IEnumerable<string> ISecurityStorage.GetSecurityIds()
        //{
        //    return Enumerable.Empty<string>();
        //}
    }



    private class ExchangeInfoProvider : IExchangeInfoProvider
    {
        public IEnumerable<ExchangeBoard> Boards { get { throw new NotImplementedException(); } }

        public IEnumerable<Exchange> Exchanges { get { throw new NotImplementedException(); } }

        public event Action<ExchangeBoard> BoardAdded;
        public event Action<Exchange> ExchangeAdded;

        public Exchange GetExchange(string code)
        {
            throw new NotImplementedException();
        }

        public ExchangeBoard GetExchangeBoard(string code)
        {
            switch (code)
            {
                case "TQBR":
                    return ExchangeBoard.MicexTqbr;
                case "TQBS":
                    return ExchangeBoard.MicexTqbs;
                default:
                    break;
            }

            return ExchangeBoard.Micex;
        }

        public void Save(ExchangeBoard board)
        {
            throw new NotImplementedException();
        }

        public void Save(Exchange exchange)
        {
            throw new NotImplementedException();
        }

        //я добавил, не были реализованы члены интерфеса
        public event Action<Exchange> ExchangeRemoved;
        public event Action<ExchangeBoard> BoardRemoved;
        public void Delete(ExchangeBoard board)
        {
            throw new NotImplementedException();
        }

        public void Delete(Exchange exchange)
        {
            throw new NotImplementedException();
        }

    }



    static void Main(string[] args)
    {

        //Security security = new Security
        //{
        //    Id = "SBER@TQBR",
        //    Board = ExchangeBoard.Micex
        //};

        Security security = new Security
        {
            Id = "RIM7@FORTS",
            Board = ExchangeBoard.Forts
        };
      

        // Создаем жранилище для нативных идентификаторов (родные идентификаторы инструментов Финама)
        var nativeIdStorage = new InMemoryNativeIdStorage();

        bool isCanceled = false;
        // Обновляет 
        //  _finamHistorySource.Refresh(new FinamSecurityStorage(security), nativeIdStorage, security, newsec, canceled);

        

        IExchangeInfoProvider exchangeInfoProvider = new ExchangeInfoProvider();
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

        // Создаем экземпляр класса FinamHistorySource. Этот объект управляет получением данных с Финама.
        FinamHistorySource _finamHistorySource = new FinamHistorySource(nativeIdStorage, exchangeInfoProvider);

        // Задаем папку, где будут сохранены запрошенные данные.. Если папку не задавать, то
        // на диске данные сохранены не будут
        //_finamHistorySource.DumpFolder = @"D:/трейдинг роботы/4.3.19.5/Исторические Свечи/DataHist";
        _finamHistorySource.DumpFolder = "DataHist";

        // Выполняем обновление хранилища инструментов Финама
        // Перед добавлением каждого инструмента в хранилище вызывается функция (делегат) isCanceled, если функция возвращает false, то обновление
        // хранилища продолжается, если true, то прерывается.
        // При добавлении нового инструмента в хранилище вызывается функция (делегат) newSecurity.
        _finamHistorySource.Refresh(new FinamSecurityStorage(security), security, s => isCanceled = s.Id == security.Id, () => isCanceled);

        var timeFrame = TimeSpan.FromMinutes(1);

        var now = DateTime.Now;
        var end = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
        var start = end.AddDays(-1);

        // Запрашиваем свечи с Финама 
        var candles = _finamHistorySource.GetCandles(security, timeFrame, start, end);

        Console.Read();

    }

}

}

Support
Support

Проверим..

Александр3012
Александр3012

Благодарю, буду ждать ответа.

Дмитрий_
Дмитрий_
            Чтобы закачать фьючерс - создавайте инструмент так
            var si = new Security
            {
                Id = "SPFB.Si@FORTS",
                Board = ExchangeBoard.Forts
            };
            var rts = new Security
            {
                Id = "SPFB.RTS@FORTS",
                Board = ExchangeBoard.Forts
            };
Александр3012
Support
Support

Вот так сделайте:

   public ExchangeBoard GetExchangeBoard(string code)
        {
            switch (code)
            {
                case "TQBR":
                    return ExchangeBoard.MicexTqbr;
                case "TQBS":
                    return ExchangeBoard.MicexTqbs;
                case "FORTS":
                    return ExchangeBoard.Forts;

                default:
                    break;
            }

            return ExchangeBoard.Micex;
        }
Александр3012
Александр3012
Александр3012

Благодарствую, все работает. Выкладываю, может кому пригодится.

namespace свечи_с_финама_4._3._23 {

class Program
{

    /// <summary>
    /// Хранилище инструментов Финама
    /// </summary>
    private class FinamSecurityStorage : CollectionSecurityProvider, ISecurityStorage
    {
        public FinamSecurityStorage(Security security)
            : base(new[] { security })
        {
        }

        void ISecurityStorage.Save(Security security)
        {
        }

        void ISecurityStorage.Delete(Security security)
        {
            throw new NotSupportedException();
        }

        void ISecurityStorage.DeleteBy(Security criteria)
        {
            throw new NotSupportedException();
        }

    }



    private class ExchangeInfoProvider : IExchangeInfoProvider
    {
        public IEnumerable<ExchangeBoard> Boards { get { throw new NotImplementedException(); } }

        public IEnumerable<Exchange> Exchanges { get { throw new NotImplementedException(); } }

        public event Action<ExchangeBoard> BoardAdded;
        public event Action<Exchange> ExchangeAdded;

        public Exchange GetExchange(string code)
        {
            throw new NotImplementedException();
        }

        public ExchangeBoard GetExchangeBoard(string code)
        {
            switch (code)
            {
                case "TQBR":
                    return ExchangeBoard.MicexTqbr;
                case "TQBS":
                    return ExchangeBoard.MicexTqbs;
                case "FORTS":
                    return ExchangeBoard.Forts;
                default:
                    break;
            }

            return ExchangeBoard.Micex;
        }

        public void Save(ExchangeBoard board)
        {
            throw new NotImplementedException();
        }

        public void Save(Exchange exchange)
        {
            throw new NotImplementedException();
        }

       
        public event Action<Exchange> ExchangeRemoved;
        public event Action<ExchangeBoard> BoardRemoved;
        public void Delete(ExchangeBoard board)
        {
            throw new NotImplementedException();
        }

        public void Delete(Exchange exchange)
        {
            throw new NotImplementedException();
        }

    }



    static void Main(string[] args)
    {

        //Security security = new Security
        //{
        //    Id = "SBER@TQBR",
        //    Board = ExchangeBoard.Micex
        //};          

        //var security = new Security
        //{
        //    Id = "SPFB.Si@FORTS",
        //    Board = ExchangeBoard.Forts
        //};

        var security = new Security
        {
            Id = "SPFB.RTS@FORTS",
            Board = ExchangeBoard.Forts
        };

        // Создаем жранилище для нативных идентификаторов (родные идентификаторы инструментов Финама)
        var nativeIdStorage = new InMemoryNativeIdStorage();

        bool isCanceled = false;
        
        IExchangeInfoProvider exchangeInfoProvider = new ExchangeInfoProvider();
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

        // Создаем экземпляр класса FinamHistorySource. Этот объект управляет получением данных с Финама.
        FinamHistorySource _finamHistorySource = new FinamHistorySource(nativeIdStorage, exchangeInfoProvider);

        // Задаем папку, где будут сохранены запрошенные данные.. Если папку не задавать, то
        // на диске данные сохранены не будут
        //_finamHistorySource.DumpFolder = @"D:/трейдинг роботы/DataHist";
        _finamHistorySource.DumpFolder = "DataHist";

        // Выполняем обновление хранилища инструментов Финама
        // Перед добавлением каждого инструмента в хранилище вызывается функция (делегат) isCanceled, если функция возвращает false, то обновление
        // хранилища продолжается, если true, то прерывается.
        // При добавлении нового инструмента в хранилище вызывается функция (делегат) newSecurity.
        _finamHistorySource.Refresh(new FinamSecurityStorage(security), security, s => isCanceled = s.Id == security.Id, () => isCanceled);

        var timeFrame = TimeSpan.FromMinutes(1);

        var now = DateTime.Now;
        var end = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0);
        var start = end.AddDays(-1);

        // Запрашиваем свечи с Финама 
        var candles = _finamHistorySource.GetCandles(security, timeFrame, start, end);

        Console.Read();

    }

}

}

Support
Support

ок.