Не приходят данные в CandleManager

Не приходят данные в CandleManager
Atom
3/28/2012
Mirovan


Доброго дня!

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

Code

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);
                }
            });
        }



    }
}



Tags:


Thanks:


1 2  >
Alexander

Avatar
Date: 3/28/2012
Reply


в SampleCandles приходят?
Thanks:

Mirovan

Avatar
Date: 3/29/2012
Reply


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

Mirovan

Avatar
Date: 3/29/2012
Reply


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


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



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

Тестирование проводил на Демо-сервере ИТинвеста.
Thanks:

Mirovan

Avatar
Date: 3/29/2012
Reply


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

Marcopolo

Avatar
Date: 3/29/2012
Reply


Попробуйте

Code

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

Mirovan

Avatar
Date: 3/29/2012
Reply


Marcopolo
Попробуйте

Code

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


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

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

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

Добавил :
Code

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

                _trader.Dispose();
            }

            base.OnClosing(e);
        }


Пока не помогло
Thanks:

Mirovan

Avatar
Date: 3/29/2012
Reply


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

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


securities.ForEach(_trader.RegisterTrades);
Thanks:

Marcopolo

Avatar
Date: 3/29/2012
Reply


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

Code

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


Опоздал :)
Thanks:

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

Avatar
Date: 4/12/2012
Reply


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

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

Mirovan

Avatar
Date: 4/13/2012
Reply


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

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



Это мой собственный класс.
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy