"Рабочая" версия SampleSmartConsole не получает инструмент и портфель
Atom Ответить
14.12.2011


Приветствую, недавно закончил курс "Базовый" по S#, пытаюсь довести до ума пример SampleSmartConsole, но выполнение програмы останавливается после сообщения "Дожидаемся появления в программе инструмента RIH и портфеля "
Хотелось бы узнать где ошибка в этом коде и по какому алгоритму самому определять подобные моменты.


Код
using System;
using System.Net;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StockSharp.Algo;
using StockSharp.BusinessEntities;
using StockSharp.Smart;
using System.Threading;
using Ecng.Collections;
using Ecng.Common;
using StockSharp.Algo.Candles;


namespace MyFirstBot
{

    class Program
    {

        static string login = "Мой логин";
        static string password = "QKVDBU";
        public static Portfolio portfolio;
        public static Security secObject;
        static string sec;
        private StockSharp.Algo.Candles.CandleManager _candleManager;
        private TimeSpan _candleWidth;
        private SmartTrader trader;
        const string secCode = "RIH2";
        const string account = "Мой счет";


        static string ipAddress = "62.141.86.229";
        static System.Net.IPAddress addr = System.Net.IPAddress.Parse(ipAddress);
        static System.Net.IPEndPoint server = new System.Net.IPEndPoint(addr, 8090);

        static void Main()
        {


            try
            {
                var trader = new SmartTrader(login, password, server);
                var waitHandle = new AutoResetEvent(false);
                trader.Connected += () =>
                {
                    Console.WriteLine("Подключение было произведено успешно.");

                   waitHandle.Set();
                };
                Console.WriteLine("Производим подключение...");

                trader.Connect();
   
                waitHandle.WaitOne();


                trader.NewPortfolios += portfolios =>
                {
                    // необходимое условие работы в SmartCOM
                    portfolios.ForEach(trader.RegisterPortfolio);

                    if (portfolio == null)
                    {
                       
                        portfolio = portfolios.FirstOrDefault(p => p.Name == account);

                        if (portfolio != null)
                        {
                            Console.WriteLine("Портфель {0} появился.", account);

                            if (secObject != null)
                                waitHandle.Set();
                        }
                    }
                };

               
                trader.NewSecurities += securities =>
                        {
                            if (secObject == null)
                            {
                                
                                secObject = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Equity);

                                if (secObject != null)
                                {
                                    Console.WriteLine("Инструмент RIH2 появился.");

                                    if (portfolio != null)
                                        waitHandle.Set();
                                }
                            }
                        };
                Console.WriteLine("Дожидаемся появления в программе инструмента RIH и портфеля {0}...".Put(account));

                // запускаем экспорт по инструментам и портфелям
                trader.StartExport();

                // дожидаемся появления портфеля и инструмента
                waitHandle.WaitOne();

                trader.SecuritiesChanged += securities =>
                {
                    // если инструмент хоть раз изменился (по нему пришли актуальные данные)
                    if (securities.Contains(secObject))
                        waitHandle.Set();
                };

                Console.WriteLine("Дожидаемся обновления данных по инструменту RIH2...");


                trader.RegisterSecurity(secObject);
                waitHandle.WaitOne();




          }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                
            }
            Console.ReadKey();
        }
    
    }
}

Теги:


Спасибо:



Скидка 15% на все продукты до 5 апреля (осталось 3 дней).

20 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 14.12.2011
Ответить


Что-нибудь еще печатает?
Спасибо:

Андрей Александрович

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


Нет больше ничего не происходит. Если вбить данные реального счета и IP боевого сервера то остановка происходит на этой же стадии.
Если заменить в коде waitHandle.WaitOne на скажем Thread.Sleep(5000) чтобы выполнение программы дошло до вывода исключений то в командной строке появляется определенный текст но я не знаю как скопировать его на форум.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 15.12.2011
Ответить


Можете перед

portfolio = portfolios.FirstOrDefault(p => p.Name == account);

вывести на экран все portfolios, которые пришли. По инструменту. А справочник инструментов в СмартТрейде обновлен?
Спасибо:

Андрей Александрович

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


Пробовал ставить вывод на экран в разные места кода... Списки обновлены, СмартТрейд подключается к демо серверу без проблем.
При размещении
Код
Console.WriteLine("Инструменты или портфели");  
Console.ReadKey();

в разные места в коде не дает никаких результатов. Причем размещение в тела функций событий появления новых инструментов и новых портфелей этих двух строчек не прерывает программу для нажатия клавиши, следовательно в моем понимании эти события вообще не дергаются...
Михаил, если у вас есть минутка свободного времени, вы не могли бы скопировать этот код к себе в Visual Studio и проверить его работоспособность?
На курсах робота писали под Quik там всё выгружалось нормально а теперь выходит сам я не могу даже к системе подключится толком...
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.12.2011
Ответить


Просьба актуальна из сообщения https://stocksharp.ru/posts/m/14674/
Спасибо:

Андрей Александрович

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


Михаил, если у вас работает приведенный выше код, то по какой причине могут не приходить новые инструменты и портфели на моем компьютере? Какая у вас версия SmartCom? Какие еще варианты решения этой проблемы можно попробовать?
Судя по количеству просмотров этой темы с подобными трудностями столкнулся не только я...
Хотелось бы быстрее устранить неполадки, возникшие по неведомым мне причинам, и приступить к написанию алгоритма.
Буду благодарен за помощь...
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.12.2011
Ответить


Прочите пожалуйста еще раз мое сообщение https://stocksharp.ru/posts/m/14674/
Спасибо:

Андрей Александрович

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


Я внимательно читаю все ваши сообщения

Eridu Перейти
Пробовал ставить вывод на экран
При размещении
Код
Console.WriteLine("portfolios");  

не дает никаких результатов. Cледовательно в моем понимании эти события вообще не дергаются...


trader.ProcessDataError ничего не выводит.
Пример SampleSmart подключается к демо серверу, но списки инструментов и портфелей пусты.
Автор топика
Спасибо:

Андрей Александрович

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


Сейчас протестировал соединение через Smart COM Test Connect. Все портфели и котировки идут в штатном режиме.
Выходит что-то не так в коде...
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.12.2011
Ответить


Eridu Перейти
Сейчас протестировал соединение через Smart COM Test Connect. Все портфели и котировки идут в штатном режиме.
Выходит что-то не так в коде...


Вы можете ответить еще на этот вопрос https://stocksharp.ru/posts/m/14650/ ? Как минимум должно печататься "Производим подключение..."
Спасибо:

Андрей Александрович

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


Eridu Перейти
выполнение програмы останавливается после сообщения "Дожидаемся появления в программе инструмента RIH2 и портфеля "

Подключение происходит успешно о чем свидетельствует сообщение в консоли. А вот события появления новых портфелей и инструментов даже не дергаются.
Вот хронология еще раз:
Производим подключение...
Подключение было произведено успешно.
Дожидаемся появления в программе инструмента RIH2 и портфеля

после чего происходит бессрочное ожидание
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.12.2011
Ответить


Eridu Перейти
Eridu Перейти
выполнение програмы останавливается после сообщения "Дожидаемся появления в программе инструмента RIH2 и портфеля "

Подключение происходит успешно о чем свидетельствует сообщение в консоли. А вот события появления новых портфелей и инструментов даже не дергаются.
Вот хронология еще раз:
Производим подключение...
Подключение было произведено успешно.
Дожидаемся появления в программе инструмента RIH2 и портфеля

после чего происходит бессрочное ожидание


Код
foreach (var pf in portfolios)
  Console.WriteLine(pf.Name);

// необходимое условие работы в SmartCOM
portfolios.ForEach(trader.RegisterPortfolio);


Что выведится в этом случае? У вас СмартКом 2.2? Какая версия S#?
Спасибо:

Андрей Александрович

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


Ничего не происходит.
размещая
Код
foreach (var pf in portfolios)
  Console.WriteLine(pf.Name);

в тело функции события появления новых портфелей ничего не меняется потому что событие не вызывается(не дергается не происходит). В том вся и проблема. Событие появления новых инструментов аналогичным образом не вызывается(я пробовал ставить в тело функции этого события прерывание но программа не прерывалась).
Версия смартком 2.2.79.
Версия S# 4.0.5
Автор топика
Спасибо:

Андрей Александрович

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


Перегрузил библиотеки из версии S# 4.0.8
Инструменты и портфели найдены успешно.
Программа работает.
Надеюсь эта тема поможет найти столь не очевидное решение проблемы с подключением другим пользователям.
Михаил, мое почтение за участие.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.12.2011
Ответить


Eridu Перейти
Перегрузил библиотеки из версии S# 4.0.8
Инструменты и портфели найдены успешно.
Программа работает.
Надеюсь эта тема поможет найти столь не очевидное решение проблемы с подключением другим пользователям.
Михаил, мое почтение за участие.


На будущее - читайте форум новостей.
Спасибо: Андрей Александрович

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

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


1. Если хочешь работать с фьючерсом, то должно быть не "ecurityTypes.Equity", а "ecurityTypes.Future"
2. В смарт-коме наименование фьючерса должно быть не secCode = "RIZ1", а "RTS-12.11_FT"
Спасибо: Андрей Александрович

Андрей Александрович

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


Кот Матроскин Перейти
1. Если хочешь работать с фьючерсом, то должно быть не "ecurityTypes.Equity", а "ecurityTypes.Future"
2. В смарт-коме наименование фьючерса должно быть не secCode = "RIZ1", а "RTS-12.11_FT"


Кот Матроскин, я изменил код указанным вами образом...
Код
const string secCode = "RTS-03.12_FT";

портфель появляется, а инструмент нет
поскольку строка
Код
secObject = securities.FirstOrDefault(sec => sec.Code == secCode && sec.Type == SecurityTypes.Future);

почему-то не присваивает значение экземпляру Securities secObject о чем свидетельствует исключение в строке
Код
trader.RegisterSecurity(secObject);
"значение не может быть неопределено"
хотя список фьючерсных инструментов выгружается корректно и в нем присутствует инструмент RTS-3.12
В чем может быть причина этой ошибки?
Автор топика
Спасибо:

Андрей Александрович

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


Код
const string secCode = "RTS-3.12_FT";

Дает такой же результат
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.12.2011
Ответить


Кот Матроскин Перейти
1. Если хочешь работать с фьючерсом, то должно быть не "ecurityTypes.Equity", а "ecurityTypes.Future"
2. В смарт-коме наименование фьючерса должно быть не secCode = "RIZ1", а "RTS-12.11_FT"


2 мы скрываем. Поэтому в S# везде единая (и правильная) кодировка - RIH2
Спасибо: Кот Матроскин

Андрей Александрович

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


Теперь всё ОК инструмент найден.
Автор топика
Спасибо:


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

loading
clippy