0. Прежде всего, хочу предупредить, что пользователи maratrus и _maratrus_ суть один и тот же пользователь. К сожалению, я не смог восстановить пароль для пользователя maratrus, а именно, я правильно ответил на кодовый вопрос, получил уведомление о том, что пароль был выслан на почту. Однако, на почту не пришло никакого письма.
Прошу прощения за очередной вопрос, но это мои первые шаги со Stock# и мне необходимо познать философию проекта, а с кодом я как-нибудь разберусь.
Хотел бы высказать несколько замечаний по первому примеру SampleConsole (далее везде рассматривается бумага лукойл, как и в исходных кодах):
1.
Код
Console.Write("Введите номер счета, через который будет выставлена заявка: ");
Спрашивается про "Номер счета", но, насколько я понимаю, введенное имя сравнивается с "Кодом клиента"
Код
trader.NewPortfolios += portfolios =>
{
...
_portfolio = portfolios.FirstOrDefault(p => p.Name == account);
...
}
Это сильно путает, особенно новичков :)
Более того в
документации этим отличиям уделено много внимания.
2. Мне кажется, не совсем верным использовать следующую строчку кода:
Код
trader.StartExport(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable);
так как портфель, насколько я разобрался, берется из таблицы "Портфель по бумагам", а потому было
бы честно запускать экспорт по DDE "Портфеля по бумагам" явным образом, так как он может быть
не запущен (как было у меня :) - приходилось ждать бескончено долго)
3. Столкнулся с такой проблемой, если открыть стакан по бумаге до запуска программы, то получаю
бесконечное ожидание.
Цитата:
Запущенный Quik найден по пути C:\Program Files\QUIK-Junior\info.exe
Введите номер счета, через который будет выставлена заявка: XXXXX
Производим подключение...
Подключение было произведено успешно.
Дожидаемся появления в программе инструмента Лукойл и портфеля XXXXX...
Портфель XXXXX появился.
Инструмент Лукойл появился.
4. Возникает также еще одна проблема
Цитата:
Запущенный Quik найден по пути C:\Program Files\QUIK-Junior\info.exe
Введите номер счета, через который будет выставлена заявка: XXXXX
Производим подключение...
Подключение было произведено успешно.
Дожидаемся появления в программе инструмента Лукойл и портфеля XXXXX...
Портфель XXXXX появился.
Инструмент Лукойл появился.
Первоначальное значение середины спреда 0
Стакан Лукойла появился.
System.ArgumentException: Цена лимитной заявки не может быть равной 0.
Parameter name: order
at StockSharp.Algo.TraderHelper.#=q96rsnhjjy1zjoKjqFURaiX6A72SdCnGGNnBMxj3B$p
Y=(Order #=qFaKmqMcqubJuY_CXJvzyIg==)
at StockSharp.Algo.TraderHelper.#=q93NW1Wf7B0m0TPobghg_hA==(Order #=q$BFO$oQm
fSsKbAkA6sfDuw==)
at StockSharp.Algo.BaseTrader.RegisterOrder(Order order)
at SampleConsole.Program.Main() in C:\Documents and Settings\user\My Document
s\Downloads\Stock#\Samples\Quik\SampleConsole\Program.cs:line 167
Press any key to continue . . .
Причина ее кроется в race condition, как мне кажется. Мы подписываемся на событие
появления инструментов:
Код
trader.NewSecurities += securities =>
{
...
if (_portfolio != null)
waitHandle.Set();
...
};
Поэтому в тот момент, когда мы подсчитываем первоначальное значение середины спрэда
Код
var firstMid = _lkoh.BestPair.SpreadPrice / 2;
ни одно событие по обновлению стакана могло не придти.
На самом деле, мне наиболее интересна причина проблемы 3 :)
P.S. Скажите пожалуйста, а вы исходники самой библиотеки не выкладываете, случайно, чтобы, если что, самому покопаться можно было?