Не фурычит экспорт заявок
Atom Ответить
10.11.2010


Почему-то при запуске экспорта из таблицы приходит только последняя заявка и всё.. дальше экспорт не идёт.. т.е. ни старые, ни новые заявки уже не приходят.. где искать причинуConfused

И Quik и S# последней версии.. экспорт других таблиц идёт без нареканий.. Verifier ошибок не находит...

Заявки ловлю так:
Код
trader.NewOrders += Orders =>
{
foreach (var order in Orders)
{
Console.WriteLine("order.State = {0}", order.State);
}
}


VS пишет в окне вывода:
Код
order.State = Done
Первый этап обработки исключения типа "System.ArgumentException" в приложении Ecng.Trading.Quik.dll

Похоже там генерится какое-то исключение.. вот только как его отловить?

Теги:


Спасибо:




26 Ответов
1 2  >
Mikhail Sukhov

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


XMbIPb

Первый этап обработки исключения типа "System.ArgumentException" в приложении Ecng.Trading.Quik.dll[/code]
Похоже там генерится какое-то исключение.. вот только как его отловить?


ITrader.ProcessDataError
Спасибо:

XMbIPb

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


Поймать то поймал.. вот только что это значит?
Код
System.ArgumentException: Элемент с тем же ключом уже был добавлен.
в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
в System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qwlIQWfo3qufLtkzLgdg_0w==(IList`1 #=qxm4X8NPgjxU5efFmY7R3Lw==, Func`2 #=qVtb7jPsPoFV1EKgfGAxHlw==)
в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Поймать то поймал.. вот только что это значит?


В таблице заявок все номера транзакции уникальны?
Спасибо:

XMbIPb

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


Хм.. не совсемBlink .. только сейчас заметил что заявки дублируются по три раза.. это как-то лечится?
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Хм.. не совсемBlink .. только сейчас заметил что заявки дублируются по три раза.. это как-то лечится?


Заявки дублируются или имеют одинаковые номера транзакции?
Спасибо:

XMbIPb

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


Дублируются один в один.. я убрал их из таблицы с помощью фильтра.. перезапустил экспорт.. выставил новую заявку.. в таблице она высветилась моментально.. а вот робот получил её только минут через десять.. когда биржа уже закрылась...
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Дублируются один в один.. я убрал их из таблицы с помощью фильтра.. перезапустил экспорт.. выставил новую заявку.. в таблице она высветилась моментально.. а вот робот получил её только минут через десять.. когда биржа уже закрылась...


ITrader.NewOrders и лог с отметкой времени. Насчет дубляжа - это к брокеру.
Спасибо:

XMbIPb

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


На данный момент ситуация такая - я запускаю экспорт.. обработчик получает все заявки из таблицы.. я вручную выставляю новые, они тоже доходят без проблем.. запускаю код генерирующий заявки(он у меня находится в обработчике QuotesChanged), он выставляет заявку и ноль реакции.. я выставляю ещё одну вручную, она тут же приходит.. короче NewOrders игнорирует заявки выставленные из другого обработчика.. что-то мне подсказывает что здесь какая-то запара с потоками.. вот только я пока не особо в них разбираюсь...
Автор топика
Спасибо:

XMbIPb

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


Все обработчики я запихал в функцию Quik, которую вызываю из основного потока вот таким макаром:
Код
NextPrimeDelegate npd = new NextPrimeDelegate(this.Quik);
npd.BeginInvoke(null, null);


А уже из обработчиков вот так:
Код
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new NextPrimeDelegate(GUI));

вызываю функцию которая отвечает за обновление GUI...
Это может как-то повлиять?
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
На данный момент ситуация такая - я запускаю экспорт.. обработчик получает все заявки из таблицы.. я вручную выставляю новые, они тоже доходят без проблем.. запускаю код генерирующий заявки(он у меня находится в обработчике QuotesChanged), он выставляет заявку и ноль реакции.. я выставляю ещё одну вручную, она тут же приходит.. короче NewOrders игнорирует заявки выставленные из другого обработчика.. что-то мне подсказывает что здесь какая-то запара с потоками.. вот только я пока не особо в них разбираюсь...


Это скорее всего такая же ошибка как и https://stocksharp.ru/posts/m/4545/ Обновитесь до 2.5.2
Спасибо: XMbIPb

XMbIPb

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


Обновил.. но свои заявки по прежнему игнорирует...
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Обновил.. но свои заявки по прежнему игнорирует...


Режим синхронный?
Спасибо:

XMbIPb

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


Включил Асинхронный режим.. всё заработало...
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Включил Асинхронный режим.. всё заработало...


Тогда давайте по порядку. Из какого обработчика регистрировали заявку?
Спасибо:

XMbIPb

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


QuotesChanged и из NewTrades пробовал...
Автор топика
Спасибо:

XMbIPb

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


Возвращаясь к потокам.. хотелось бы всё-таки услышать Ваше компетентное мнение по поводу моей конструкции.. я правильно всё сделал?

Система у меня простенькая - анализирую содержимое GetMarketDepth в обработчике QuotesChanged и от туда же, если нужно выставляю заявки.. может быть стоит как-то по другому построить логику, чтобы по максимуму использовать функционал S#?
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Возвращаясь к потокам.. хотелось бы всё-таки услышать Ваше компетентное мнение по поводу моей конструкции.. я правильно всё сделал?

Система у меня простенькая - анализирую содержимое GetMarketDepth в обработчике QuotesChanged и от туда же, если нужно выставляю заявки.. может быть стоит как-то по другому построить логику, чтобы по максимуму использовать функционал S#?


Я вы можете ее как-то откомментировать?
Спасибо:

XMbIPb

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


Конструкцию взаимодействия с GUI я описал в десятом посте.. под GUI у меня подразумевается свой стакан, в котором я наблюдаю чего замышляет робот...
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Конструкцию взаимодействия с GUI я описал в десятом посте.. под GUI у меня подразумевается свой стакан, в котором я наблюдаю чего замышляет робот...


Вот именно этот пост я и не понял =) Понял что это все сделано для синхронизации для ГУИ. Но что из чего вызывается - не понимаю.
Спасибо:

XMbIPb

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


Кликом по кнопке в моей форме я вызываю функцию Quik в которой у меня находятся QuotesChanged и другие обработчики.. а при поступлении котировок из квика, уже из QuotesChanged вызываю функцию GUI которая обновляет данные в моём стакане...
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Кликом по кнопке в моей форме я вызываю функцию Quik в которой у меня находятся QuotesChanged и другие обработчики.. а при поступлении котировок из квика, уже из QuotesChanged вызываю функцию GUI которая обновляет данные в моём стакане...


Опишите кодом вот эту фразу: "Quik в которой у меня находятся QuotesChanged и другие обработчики"
Спасибо:

XMbIPb

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


Код

public void Quik()
{
try
{
var quikPath = QuikTerminal.GetDefaultPath();

if (quikPath == "")
{
Console.WriteLine("Не найден ни один запущенный Quik");
return;
}

Console.WriteLine("Запущенный Quik найден по пути " + quikPath);

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

// извещаем об успешном соединени
waitHandle.Set();
};

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

trader.Connect();

// дожидаемся события об успешном соединении
waitHandle.WaitOne();

trader.NewPortfolios += portfolios =>
{
и т.д.

Автор топика
Спасибо:

Mikhail Sukhov

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


Неправильный подход в создании ГУИ. Посмотрите пример Sample (а не SampleConsole).
Спасибо:

XMbIPb

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


Я уже пытался выдрать стакан из примера Sample.. но решил что самому написать проще.. проблема в том что мне нужна не точная копия квиковского стакана, а слегка подкорректированная.. а куда там пристроить этот самый корректировщик я так и не разобрался.. да и ещё этот таймер там...
А в чём именно ошибка можете описать в двух словах.. так то вроде всё работает...
Автор топика
Спасибо:

Mikhail Sukhov

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


XMbIPb
Я уже пытался выдрать стакан из примера Sample.. но решил что самому написать проще.. проблема в том что мне нужна не точная копия квиковского стакана, а слегка подкорректированная.. а куда там пристроить этот самый корректировщик я так и не разобрался.. да и ещё этот таймер там...
А в чём именно ошибка можете описать в двух словах.. так то вроде всё работает...


Ошибка в подходе. В консоли я описал все в одном методе. В ГУИ же все обычно все сложнее, выноситься на уровень окна. Чтобы можно было из разным мест использовать. И все очищается при закрытие основного окна... Таймер можете заменить своей реализацией. И еще я бы посоветовал прочитать небольшое введение в WPF. Много это не потребует времени, но многое станет проще.

И да, это уже уровень чуть выше, чем простой робот. Так что это к программистам.BigGrin
Спасибо:
1 2  >

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

loading
clippy