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

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


Добрый день.

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

  1. в любой момент времени мы можем обратиться к данной таблице из кода стратегии и прочитать нужные нам данные;
  2. в обработчиках событий копировать поступившие данные в свои структуры и в стратегии работать со своими данными.

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


Теги:


Спасибо:


< 1 2 
esper

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


Mikhail Sukhov:

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

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

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

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

Спасибо:

Mikhail Sukhov

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


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

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

Спасибо:

Maxim

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


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

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

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

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

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

Спасибо:

Mikhail Sukhov

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


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

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

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

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

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

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

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

Спасибо:

Maxim

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


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

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

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


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

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

Спасибо:
< 1 2 

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

loading
clippy