Почему-то при запуске экспорта из таблицы приходит только последняя заявка и всё.. дальше экспорт не идёт.. т.е. ни старые, ни новые заявки уже не приходят.. где искать причину🤨
И 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
Похоже там генерится какое-то исключение.. вот только как его отловить?
Kommentare (26)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
ITrader.ProcessDataError
Поймать то поймал.. вот только что это значит?
В таблице заявок все номера транзакции уникальны?
Хм.. не совсем😳 .. только сейчас заметил что заявки дублируются по три раза.. это как-то лечится?
Заявки дублируются или имеют одинаковые номера транзакции?
Дублируются один в один.. я убрал их из таблицы с помощью фильтра.. перезапустил экспорт.. выставил новую заявку.. в таблице она высветилась моментально.. а вот робот получил её только минут через десять.. когда биржа уже закрылась...
ITrader.NewOrders и лог с отметкой времени. Насчет дубляжа - это к брокеру.
На данный момент ситуация такая - я запускаю экспорт.. обработчик получает все заявки из таблицы.. я вручную выставляю новые, они тоже доходят без проблем.. запускаю код генерирующий заявки(он у меня находится в обработчике QuotesChanged), он выставляет заявку и ноль реакции.. я выставляю ещё одну вручную, она тут же приходит.. короче NewOrders игнорирует заявки выставленные из другого обработчика.. что-то мне подсказывает что здесь какая-то запара с потоками.. вот только я пока не особо в них разбираюсь...
Это скорее всего такая же ошибка как и http://stocksharp.com/posts/m/4545/ Обновитесь до 2.5.2
Все обработчики я запихал в функцию Quik, которую вызываю из основного потока вот таким макаром:
А уже из обработчиков вот так:
вызываю функцию которая отвечает за обновление GUI... Это может как-то повлиять?
Обновил.. но свои заявки по прежнему игнорирует...
Режим синхронный?
Включил Асинхронный режим.. всё заработало...
Тогда давайте по порядку. Из какого обработчика регистрировали заявку?
QuotesChanged и из NewTrades пробовал...
Попробовал и там и так, на 2.5.2 работает как часики. Можете сократить свое решение до минимального размера, чтобы на нем протестировать?
Возвращаясь к потокам.. хотелось бы всё-таки услышать Ваше компетентное мнение по поводу моей конструкции.. я правильно всё сделал?
Система у меня простенькая - анализирую содержимое GetMarketDepth в обработчике QuotesChanged и от туда же, если нужно выставляю заявки.. может быть стоит как-то по другому построить логику, чтобы по максимуму использовать функционал S#?
Я вы можете ее как-то откомментировать?
Конструкцию взаимодействия с GUI я описал в десятом посте.. под GUI у меня подразумевается свой стакан, в котором я наблюдаю чего замышляет робот...
Вот именно этот пост я и не понял =) Понял что это все сделано для синхронизации для ГУИ. Но что из чего вызывается - не понимаю.
Кликом по кнопке в моей форме я вызываю функцию Quik в которой у меня находятся QuotesChanged и другие обработчики.. а при поступлении котировок из квика, уже из QuotesChanged вызываю функцию GUI которая обновляет данные в моём стакане...
Опишите кодом вот эту фразу: "Quik в которой у меня находятся QuotesChanged и другие обработчики"
Неправильный подход в создании ГУИ. Посмотрите пример Sample (а не SampleConsole).
Я уже пытался выдрать стакан из примера Sample.. но решил что самому написать проще.. проблема в том что мне нужна не точная копия квиковского стакана, а слегка подкорректированная.. а куда там пристроить этот самый корректировщик я так и не разобрался.. да и ещё этот таймер там...
А в чём именно ошибка можете описать в двух словах.. так то вроде всё работает...
Ошибка в подходе. В консоли я описал все в одном методе. В ГУИ же все обычно все сложнее, выноситься на уровень окна. Чтобы можно было из разным мест использовать. И все очищается при закрытие основного окна... Таймер можете заменить своей реализацией. И еще я бы посоветовал прочитать небольшое введение в WPF. Много это не потребует времени, но многое станет проще.
И да, это уже уровень чуть выше, чем простой робот. Так что это к программистам.😀