МТ5 и trans2quik.dll - страница 6

 
prostotrader:

Да нет, нужно просто синхронизировать работу 3-х потоков (по сути на писать Synchronizer), но

не знаю как.

Ну, остаются только флаги. Выставляем флаг, ждем когда остальные завершат деятельность, остановятся и снимут свои флаги, делаем дела, снимаем флаг. Ну, и логика приоритетов флагов, ясное дело.

ДДЕ я бы все-таки не останавливал, пусть в буфер пишет, чтобы ничего не пропало.

 
Yuriy Asaulenko:

Ну, остаются только флаги. Выставляем флаг, ждем когда остальные завершат деятельность, остановятся и снимут свои флаги, делаем дела, снимаем флаг. Ну, и логика приоритетов флагов, ясное дело.

ДДЕ я бы все-таки не останавливал, пусть в буфер пишет, чтобы ничего не пропало.

Т.е в Синхронайзере нужно сделать буфер входяших функций, которые в зависимости от приоритета будут исполняться?

 
prostotrader:

Т.е в Синхронайзере нужно сделать буфер входяших функций, которые в зависимости от приоритета будут исполняться?

Нет, просто приостанавливать поток(и) по соответствующим флагам и их приоритету. В этом варианте вообще больше ничего не надо.

Второй вариант, дождаться окончания функции потока, и тогда остановить уже по его флагу. Это м.б. нужно, например, чтобы обновились аск-бид, индикаторы и что-то еще нужное.

Например, значения флага.

0 - поток стоит,

1 - поток работает,

2 - запрос на остановку всех младших по приоритету потоков.

Выставляем 2, ждем пока все не станут 0, выполняем прогу, ставим в 0 или 1. По этому флагу все остальные возобновляют работу.

 
Yuriy Asaulenko:

Нет, просто приостанавливать поток(и) по соответствующим флагам и их приоритету. В этом варианте вообще больше ничего не надо.

Второй вариант, дождаться окончания функции потока, и тогда остановить уже по его флагу. Это м.б. нужно, например, чтобы обновились аск-бид, индикаторы и что-то еще нужное.

Например, значения флага.

0 - поток стоит,

1 - поток работает,

2 - запрос на остановку всех младших по приоритету потоков.

Выставляем 2, ждем пока все не станут 0, выполняем прогу, ставим в 0 или 1. По этому флагу все остальные возобновляют работу.

Вы же сами писали, что DDE приостанавливать не хорошо

 
prostotrader:

Вы же сами писали, что DDE приостанавливать не хорошо

Просто вас не понял.

Я делаю так.

1.Сервер (у меня ТСР-сервер) в своем потоке постоянно пишет данные в коллекцию типа последним вошел-первым вышел. Его останавливать не надо.

2. Из коллекции в другом потоке данные читаются-удаляются и пишутся в DataTable (это аналог таблицы БД, но в памяти). Уже этот поток можно приостановить, если он мешает.

3. еще поток читает данные из DataTable для анализа. Он никак не мешает потоку 2, т.к. выборка идет по select и в эту таблицу никто кроме 2 записи не производит. Этот поток тоже можно приостановить, если мешает.

ЗЫ мне ничего не приходится останавливать, т.к. работаю с одним инструментом и поток 3 переключается на подачу-исполнением заявок и сопровождение сделок.

 
Yuriy Asaulenko:

Просто вас не понял.

Я делаю так.

1.Сервер (у меня ТСР-сервер) в своем потоке постоянно пишет данные в коллекцию типа последним вошел-первым вышел. Его останавливать не надо.

2. Из коллекции в другом потоке данные читаются-удаляются и пишутся в DataTable (это аналог таблицы БД, но в памяти). Уже этот поток можно приостановить, если он мешает.

3. еще поток читает данные из DataTable для анализа. Он никак не мешает потоку 2, т.к. выборка идет по select и в эту таблицу никто кроме 2 записи не производит. Этот поток тоже можно приостановить, если мешает.

ЗЫ мне ничего не приходится останавливать, т.к. работаю с одним инструментом и поток 3 переключается на подачу-исполнением заявок и сопровождение сделок.

Вам везёт, у меня 52 инструмента, так что придётся переключаться

 
prostotrader:

Вам везёт, у меня 52 инструмента, так что придётся переключаться

Я так понял, что анализ всех 52 инструментов идет в одном потоке? Или нет?

В качестве Storage что используется? В моем случае, при многопользовательском доступе блокировка не нужна и чтение не мешает записи.

Единственное, что нужно блокировать, это совместный доступ Child к trans2quik. И только в случае множества потоков Child. А это можно сделать организовав trans2quik в отдельном потоке и вызывать по событию и одновременно блокировать обработчик события до окончания работы с заявкой. Остальные не достучатся.)

 
prostotrader:

Совсем забросил идею связать МТ5 и Квик, остановился только на Квик (DEE server + trans2quik.dll)

Очень жаль. А в чем причина такого решения, есть серьёзные преграды в получении\передачи данных между двумя программами?

 
Yuriy Asaulenko:

Я так понял, что анализ всех 52 инструментов идет в одном потоке? Или нет?

В качестве Storage что используется? В моем случае, при многопользовательском доступе блокировка не нужна и чтение не мешает записи.

Единственное, что нужно блокировать, это совместный доступ Child к trans2quik. И только в случае множества потоков Child. А это можно сделать организовав trans2quik в отдельном потоке и вызывать по событию и одновременно блокировать обработчик события до окончания работы с заявкой. Остальные не достучатся.)

Нет, сам анализ происходит в Child (отдельно, по каждому инструменту) Selector(1,2) выбираают, какому роботу отдать данные и колбэки

Storage - просто таблицы, которые хранятся в памяти

 
Aleksey Vyazmikin:

Очень жаль. А в чем причина такого решения, есть серьёзные преграды в получении\передачи данных между двумя программами?

Просто нет смысла городить огород.

Используя МТ 5 нужен код в советнике и DLL, которая будкт принимать данные.

Используя только Квик, у нас только одно приложение (см. рис. с диаграммой)