Вопрос по архитектуре библиотеки

Вопрос по архитектуре библиотеки
Atom
2/28/2011


Добрый день.

Предположим, что необходимо получать данные по инструментам, для этого мы добавляем нужные столбцы в квике и в программе, подписываемся на событие новой записи и изменения данных в таблице Secirities и в обработчике Trader.Connected запускаем экспорт по DDE этой таблицы.
Данные поступают, мы их видим как в обработчиках событий, так и в таблице Trader.Securities. Далее есть два варианта:
1. в любой момент времени мы можем обратиться к данной таблице из кода стратегии и прочитать нужные нам данные;
2. в обработчиках событий копировать поступившие данные в свои структуры и в стратегии работать со своими данными.

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

Tags:


Thanks:


< 1 2 
esper

Avatar
Date: 3/1/2011
Reply


Mikhail Sukhov
esper
А каким образом можно сделать синхронизацию с внутренним обновлением этих данных? Чтобы пока я их читаю они не менялись?


Наверное никак, так как никакой синхронизации в обновлении данных нет. А в чем заключается сама задача?


К примеру, у меня стратегия крутится в другом потоке, на каждой итерации ей нужны данные из таблицы инструментов. Получение данных из таблицы осуществляется не в одном месте, а рассредоточено по всей функции стратегии. Я считываю одно поле для конкретного инструмента в начале функции, далее выполняю другие действия, из квика приходят новые данные, считываю другое поле для этого же инструмента и получаю несогласованные данные.

Хотелось бы иметь возможность получения согласованных данных. Сейчас просто в событиях новой записи и изменения записи копирую данные в свои структуры и работаю с ними, возможно есть вариант более правильный.
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


esper
Я считываю одно поле для конкретного инструмента в начале функции, далее выполняю другие действия, из квика приходят новые данные, считываю другое поле для этого же инструмента и получаю несогласованные данные.


Можете эти поля указать?
Thanks:

Maxim

Avatar
Date: 3/4/2011
Reply


Михаил, добрый день.
Еще один вопрос про потоки.

Каким образом можно перебрать все элементы свойства QuikTrader.MyTrades?

Если применить к этому свойству foreach, то в процессе работы цикла к этому свойству
из другого потока могут добавится новые элементы и foreach может сработать некорректно(может пропустить некоторые элементы).

Соответственно, что бы применить foreach к QuikTrader.MyTrades, нужно на время выполнения этого цикла блокировать
изменение этого свойства. Есть ли такая возможность? Например, публичный объект для блокировки?


Или есть другой способ выполнить задачу?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/4/2011
Reply


Maxim
Михаил, добрый день.
Еще один вопрос про потоки.

Каким образом можно перебрать все элементы свойства QuikTrader.MyTrades?


Напрямую. Всегда возвращается копия данных, которая не модифицируется.

Maxim

Если применить к этому свойству foreach, то в процессе работы цикла к этому свойству
из другого потока могут добавится новые элементы и foreach может сработать некорректно(может пропустить некоторые элементы).


Попробуйте так сделать. Ошибка будет совсем другая.

Maxim

Соответственно, что бы применить foreach к QuikTrader.MyTrades, нужно на время выполнения этого цикла блокировать
изменение этого свойства. Есть ли такая возможность? Например, публичный объект для блокировки?


Предлагаю рассматривать задачу с практической стороны. Скажите, зачем вам это нужно на конкретном примере, и я попробую найти путь.
Thanks:

Maxim

Avatar
Date: 3/4/2011
Reply


Mikhail Sukhov

Напрямую. Всегда возвращается копия данных, которая не модифицируется.


В принципе это то, что было надо. И то, чего я не знал.
Практическую задачу я вроде в комментарии и описал:
нужно было быть уверенным, что пока перебираешь все элементы свойства, это свойство не изменится.
Спасибо за ответ.

Итак, насколько я понял если во время выполнения следующего кода
из Квика придет новая моя сделка, то она в цикл никак не попадет?
Code

foreach (MyTrade myTrade in Global.Quik.MyTrades)
if (_newOrder == myTrade.Order)
_volume += myTrade.Trade.Volume;





Возможно, что бы сто раз одно и то же не объяснять, стоит добавить в документацию раздел
с описанием того, что в библиотеке потокобезопасно, а что нет. Хотя понимаю, что на все надо время.
Thanks:
< 1 2 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy