Приветствую, недавно закончил курс "Базовый" по 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();
}
}
}
Kommentare (20)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Что-нибудь еще печатает?
Нет больше ничего не происходит. Если вбить данные реального счета и IP боевого сервера то остановка происходит на этой же стадии. Если заменить в коде waitHandle.WaitOne на скажем Thread.Sleep(5000) чтобы выполнение программы дошло до вывода исключений то в командной строке появляется определенный текст но я не знаю как скопировать его на форум.
Можете перед
portfolio = portfolios.FirstOrDefault(p => p.Name == account);
вывести на экран все portfolios, которые пришли. По инструменту. А справочник инструментов в СмартТрейде обновлен?
Пробовал ставить вывод на экран в разные места кода... Списки обновлены, СмартТрейд подключается к демо серверу без проблем. При размещении ```csharp Console.WriteLine("Инструменты или портфели");
Console.ReadKey();
Просьба актуальна из сообщения http://stocksharp.com/posts/m/14674/
Я внимательно читаю все ваши сообщения
Михаил, если у вас работает приведенный выше код, то по какой причине могут не приходить новые инструменты и портфели на моем компьютере? Какая у вас версия SmartCom? Какие еще варианты решения этой проблемы можно попробовать? Судя по количеству просмотров этой темы с подобными трудностями столкнулся не только я... Хотелось бы быстрее устранить неполадки, возникшие по неведомым мне причинам, и приступить к написанию алгоритма. Буду благодарен за помощь...
Прочите пожалуйста еще раз мое сообщение http://stocksharp.com/posts/m/14674/
Сейчас протестировал соединение через Smart COM Test Connect. Все портфели и котировки идут в штатном режиме. Выходит что-то не так в коде...
Вы можете ответить еще на этот вопрос http://stocksharp.com/posts/m/14650/ ? Как минимум должно печататься "Производим подключение..."
после чего происходит бессрочное ожидание
Что выведится в этом случае? У вас СмартКом 2.2? Какая версия S#?
Ничего не происходит. размещая ```csharp foreach (var pf in portfolios) Console.WriteLine(pf.Name);
Перегрузил библиотеки из версии S# 4.0.8 Инструменты и портфели найдены успешно. Программа работает. Надеюсь эта тема поможет найти столь не очевидное решение проблемы с подключением другим пользователям. Михаил, мое почтение за участие.
На будущее - читайте форум новостей.
Кот Матроскин, я изменил код указанным вами образом...
портфель появляется, а инструмент нет поскольку строка
почему-то не присваивает значение экземпляру Securities secObject о чем свидетельствует исключение в строке ```csharp trader.RegisterSecurity(secObject);
2 мы скрываем. Поэтому в S# везде единая (и правильная) кодировка - RIH2
Дает такой же результат
Теперь всё ОК инструмент найден.