Не приходят данные в CandleManager
Atom Ответить
28.03.2012


Доброго дня!

Пытаюсь получить Real Time данные через SmartCom. S# версия 4.0.22
Однако не происходят события на получение/изменение свечей.
Подскажи, где у меня ошибка ?

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;

using Ecng.Collections;
using Ecng.Common;
using Ecng.ComponentModel;
using Ecng.Xaml;

using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Logging;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Smart;
using StockSharp.Xaml;

namespace SimpleRobot
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        
        private string _login = "";
        private string _password = "";
        private string _account = "";
        private string _ipAddress = "95.131.26.246";
        private string secCode = "RIM2";

        private readonly TimeSpan _timeFrame = (TimeSpan)SmartTimeFrames.Minute15;  //Таймфрейм
        private static Portfolio _portfolio;    //Портфель
        private Security _sec;                  //Эмитент - Акция/Фьючерс/Опцион

        private SmartTrader _trader;            //Шлюз для SmartCOM
        private Logger _logger;                 //Логгер событий
        private CandleManager _candleManager;   //Менеджер свечей

        private bool _isConnected = false;              //Подключены ли
        private bool _isStartRecivePorfolio = false;    //Начилась ли загрузка портфелей
        private bool _isStartReciveSecurity = false;    //Начилась ли загрузка эмитентов

        private CandleToken token;


        public MainWindow()
        {
            InitializeComponent();
        }


        //Инициализация робота
        private void button1_Click(object sender, RoutedEventArgs e)
        {

            //Логгер
            _logger = new Logger(textBox1);

            //Ip address
            System.Net.IPAddress addr = System.Net.IPAddress.Parse(_ipAddress);
            System.Net.IPEndPoint server = new System.Net.IPEndPoint(addr, 8090);

            //Create Smart Trade шлюз
            _trader = new SmartTrader(_login, _password, server);

            //Подписываемся на все необходимые события
            _trader.Connected += Trader_Connected;
            _trader.Disconnected += Trader_Disconnected;
            _trader.NewHistoryCandles += Trader_GetHistoryCandles;
            _trader.ReConnectionSettings.ConnectionRestored += Trader_ConnectionRestored;
            _trader.ConnectionError += Trader_ConnectionError;
            _trader.NewPortfolios += Trader_NewPortfolios;
            _trader.NewSecurities += Trader_NewSecurities;

            // инициализируем механизм переподключения (будет автоматически соединяться
            // каждые 10 секунд, если шлюз потеряется связь с сервером)
            _trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
            _trader.ReConnectionSettings.WorkingTime = Exchange.Rts.WorkingTime;

            _logger.Write("Инициализия программы");
        }


        //Соединение и передача данных
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //Устанавливаем соединение
            _trader.Connect();
        }



        //Запуск робота
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            //Создаем менеджер свечей и подписываемся на события
            _candleManager = new CandleManager(_trader);
            _candleManager.CandlesStarted += CandleManager_GetCandles;
            _candleManager.CandlesChanged += CandleManager_GetCandles;
            _candleManager.CandlesFinished += CandleManager_GetCandles;

            //Устанавливаени таймфрейм для менеджер свечей
            TimeSpan currentTimeFrame = TimeSpan.FromSeconds(60);
            token = _candleManager.RegisterTimeFrameCandles(_sec, currentTimeFrame);
            //token = _candleManager.RegisterTimeFrameCandles(_sec, 1000);
            
            /*
            var candles = _candleManager.GetTimeFrameCandles(_sec, _timeFrame);

            foreach (Candle candle in candles)
            {
                //Выводим свечи в формате OHLC
                _logger.Write(candle.Time.ToString() + " " + candle.OpenPrice + " " + candle.HighPrice + " " + candle.LowPrice + " " + candle.ClosePrice + " " + candle.CloseVolume);
            }
            */
        }




        private void Trader_Connected()
        {
            this.GuiAsync(() =>
            {
                _isConnected = true;
                _logger.Write("Успешно подключены");

                //Начинаем Экспорт данных
                _trader.StartExport();
            });
        }


        private void Trader_Disconnected()
        {
            this.GuiAsync(() =>
            {
                if (_isConnected)
                {
                    _isConnected = false;
                    _trader.Disconnect();
                    _logger.Write("Отключены");
                }
            });
        }


        private void Trader_GetHistoryCandles(CandleToken token, IEnumerable<TimeFrameCandle> candles)
        {
            this.GuiAsync(() =>
            {
                _logger.Write("Принимаю исторические данные");
                //_candlesStarted.SafeInvoke(token, candles);
                //_candlesFinished.SafeInvoke(token, candles);
            });
        }


        private void Trader_ConnectionRestored()
        {
            this.GuiAsync(() =>
            {
                _logger.Write("Соединение восстановлено");
            });
        }


        private void Trader_ConnectionError(Exception e)
        {
            this.GuiAsync(() =>
            {
                _logger.Write("ОШИБКА: Ошибка соединения" + e.Message + " [" + e.ToString() + "]");
            });
        }

        
        private void Trader_NewPortfolios(IEnumerable<Portfolio> portfolios)
        {
            this.GuiAsync(() =>
            {
                if (_isConnected)
                {
                    if (!_isStartRecivePorfolio)
                    {
                        _logger.Write("Получение портфелей...");
                        _isStartRecivePorfolio = true;
                    }


                    // необходимое условие работы в SmartCOM
                    int pCount = 0;
                    foreach (Portfolio p in portfolios)
                    {
                        pCount++;
                        _trader.RegisterPortfolio(p);
                        _logger.Write("Инициализация портфеля " + p.ToString());
                    }

                    if (pCount == 0)
                    {
                        _logger.Write("Портфели не найдены");
                    }
                    else
                    {
                        // находим нужный портфель и присваиваем его переменной _portfolio
                        _portfolio = portfolios.FirstOrDefault(p => p.Name == _account);

                        if (_portfolio != null)
                        {
                            _logger.Write("Портфель " + _account + " появился");
                        }
                    }
                }
            });
        }



        private void Trader_NewSecurities(IEnumerable<Security> securities)
        {
            this.GuiAsync(() =>
            {
                if (_isConnected)
                {
                    if (!_isStartReciveSecurity)
                    {
                        _logger.Write("Получение инструментов...");
                        _isStartReciveSecurity = true;
                    }


                    if (_isConnected)
                    {
                        var sec = securities.FirstOrDefault(s => s.Code == secCode && s.Type == SecurityTypes.Future);
                        if (sec != null)
                        {
                            _logger.Write("Инструмент " + secCode + " успешно найден");

                            _sec = sec;
                        }
                    }
                }
            });
        }



        private void CandleManager_GetCandles(CandleToken token, IEnumerable<Candle> candles)
        {
            this.GuiAsync(() =>
            {
                foreach (Candle candle in candles)
                {
                    //Выводим свечи в формате OHLC
                    _logger.Write(candle.Time.ToString() + " " + candle.OpenPrice + " " + candle.HighPrice + " " + candle.LowPrice + " " + candle.ClosePrice + " " + candle.CloseVolume);
                }
            });
        }



    }
}



Теги:


Спасибо:




11 Ответов
Alexander

Фотография
Дата: 28.03.2012
Ответить


в SampleCandles приходят?
Спасибо:

Mirovan

Фотография
Дата: 29.03.2012
Ответить


Попробовал воспользоваться вместо CandleManager - CandleBuilder'ом - результат тот же :(
Ума не приложу где у меня ошибка :(
Автор топика
Спасибо:

Mirovan

Фотография
Дата: 29.03.2012
Ответить


Mirovan Перейти
Alexander Mukhanchikov Перейти
в SampleCandles приходят?


Перепроверил проект SampleSmartCandles. Там вызов метода DrawCandles на подписанные CandlesStarted/CandlesChanged тоже не происходит.



Перепроверил проект SampleSmartCandles. Там вызов метода DrawCandles на подписанные CandlesStarted/CandlesChanged тоже не происходит.

Тестирование проводил на Демо-сервере ИТинвеста.
Автор топика
Спасибо:

Mirovan

Фотография
Дата: 29.03.2012
Ответить


Т.е. исторические данные приходят нормально, а real- time нет (тупо не происходит событие от CandleManager'а)
Автор топика
Спасибо:

Marcopolo

Фотография
Дата: 29.03.2012
Ответить


Попробуйте

Код

_candleManager = new CandleManager(_trader);
foreach (var builder in _candleManager.Sources.OfType<CandleBuilder>())
{
   builder.IsSyncRegister = true;
}
Спасибо:

Mirovan

Фотография
Дата: 29.03.2012
Ответить


Marcopolo Перейти
Попробуйте

Код

_candleManager = new CandleManager(_trader);
foreach (var builder in _candleManager.Sources.OfType<CandleBuilder>())
{
   builder.IsSyncRegister = true;
}


К сожалению не помогло.

Прогнал еще раз SampleCandles и SampleSMA - там данные приходят.

Может проблема в том что программа не корректно завершает работу.

Добавил :
Код

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (_trader != null)
            {
                _trader.StopExport();
                _trader.Disconnect();

                _trader.Dispose();
            }

            base.OnClosing(e);
        }


Пока не помогло
Автор топика
Спасибо:

Mirovan

Фотография
Дата: 29.03.2012
Ответить


Похоже решил проблему.

Данные стали приходить, когда добавил строчку:


securities.ForEach(_trader.RegisterTrades);
Автор топика
Спасибо:

Marcopolo

Фотография
Дата: 29.03.2012
Ответить


Для получения свечек real-time необходима подписка на сделки

Код

// начинаем получать текущие сделки (для построения свечек реального времени)
_trader.RegisterTrades(_strategy.Security);


Опоздал :)
Спасибо:

Кот Матроскин

Фотография
Дата: 12.04.2012
Ответить


Такая строка из кода выше:
Код
private Logger _logger;                 //Логгер событий

Нигде в документации не найду про класс Logger. Устарело или не там ищу?
Или просто это не S#?
Спасибо:

Mirovan

Фотография
Дата: 13.04.2012
Ответить


Кот Матроскин Перейти
Такая строка из кода выше:
Код
private Logger _logger;                 //Логгер событий

Нигде в документации не найду про класс Logger. Устарело или не там ищу?
Или просто это не S#?



Это мой собственный класс.
Автор топика
Спасибо:

Кот Матроскин

Фотография
Дата: 13.04.2012
Ответить


Понял, спасибо
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy