← Zurück

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

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

И 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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (26)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

ITrader.ProcessDataError

XMbIPb
XMbIPb Autor

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

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
Mikhail Sukhov

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

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

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

Это скорее всего такая же ошибка как и http://stocksharp.com/posts/m/4545/ Обновитесь до 2.5.2

XMbIPb
XMbIPb Autor

Все обработчики я запихал в функцию Quik, которую вызываю из основного потока вот таким макаром:

NextPrimeDelegate npd = new NextPrimeDelegate(this.Quik);
            npd.BeginInvoke(null, null);

А уже из обработчиков вот так:

Dispatcher.BeginInvoke(DispatcherPriority.Normal, new NextPrimeDelegate(GUI));

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

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

Режим синхронный?

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

XMbIPb
XMbIPb Autor

QuotesChanged и из NewTrades пробовал...

Mikhail Sukhov
Mikhail Sukhov

XMbIPb: QuotesChanged и из NewTrades пробовал...

Попробовал и там и так, на 2.5.2 работает как часики. Можете сократить свое решение до минимального размера, чтобы на нем протестировать?

XMbIPb
XMbIPb Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Я вы можете ее как-то откомментировать?

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

XMbIPb
XMbIPb Autor
 
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
Mikhail Sukhov

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

XMbIPb
XMbIPb Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

И да, это уже уровень чуть выше, чем простой робот. Так что это к программистам.😀