Почему-то при запуске экспорта из таблицы приходит только последняя заявка и всё.. дальше экспорт не идёт.. т.е. ни старые, ни новые заявки уже не приходят.. где искать причину🤨
И 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
Похоже там генерится какое-то исключение.. вот только как его отловить?
Comentarios (26)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
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. Много это не потребует времени, но многое станет проще.
И да, это уже уровень чуть выше, чем простой робот. Так что это к программистам.😀