Взаимодействие советников

 

Всем привет.

Подскажите, пожалуйста, как можно решить следующую задачу.

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

Возникают следующие трудности при работе: если каждый советник будет отрабатывать только свои сделки, то из-за разницы времени прихода котировок не каждый советник сможет поймать условие совокупной прибыли, более того, они могут начать открывать свои сделки в тот момент, когда нужно их закрывать; общий файл (ini, txt, csv), расшаренный для чтения и записи одновременно на несколько советников, в который можно было бы записывать сигнал на блокировку работы всех советников кроме одного, очень много сожрет по производительности, так как каждому советнику обращаться к нему придется на каждом тике; писать полностью самостоятельный советник для контроля этих сделок тоже проблему не решит, так как нужно именно заблокировать работу всех советников на время выполнения операций одним.

Помогите найти решение!

 
глобальные переменные помогут — GlobalVariableSetOnCondition
 
Обмен событиями поможет - EventChartCustom (в МТ4 тоже есть).
 

Если хотите сделать все действительно хорошо, то в данном конкретном случае лучше всего - делать мультивалютный советник, а ну кучу одновалютных. Да, это более сложное решение, чем подсказали выше, но работать будет 100% безупречно, потому что не нужны будут никакие синхронизации. А вот для решения проблемы с одновременным открытием сделок можно запускать на необходимой паре скрипт, который открывает/устанавливает/модифицирует ордер.

 
Придется писать еще один - главный.
 

Надо ли действительно блокировать, если проблема именно в одновременном открытии сделок? Может быть, достаточно использовать упорно недокументируемую, но уже больше 2 лет имеющуюся возможность параллельно отправлять до 8 торговых запросов на сервер?

 
Vladimir:

Надо ли действительно блокировать, если проблема именно в одновременном открытии сделок? Может быть, достаточно использовать упорно недокументируемую, но уже больше 2 лет имеющуюся возможность параллельно отправлять до 8 торговых запросов на сервер?

Это как, Я что-то пропустил?

 
Vitaly Muzichenko:

Это как, Я что-то пропустил?


Запустить 8 скриптов. И все они одновременно пошлют торговые приказы, которые должны выполниться без ошибки "Торговый поток занят".

 
Vitaly Muzichenko:

Это как, Я что-то пропустил?


Это только начало.

 
Artyom Kuraev:
 

...общий файл (ini, txt, csv), расшаренный для чтения и записи одновременно на несколько советников, в который можно было бы записывать сигнал на блокировку работы всех советников кроме одного, очень много сожрет по производительности, так как каждому советнику обращаться к нему придется на каждом тике;...

Про 8 торговых потоков -то я сказал, но.. повторно обращаю Ваше внимание на то, что эта возможность систематически игнорируется разработчиком при оформлении документации (справки). Это означает, что в любой момент она может исчезнуть, и сервис-деск обращаться будет не с чем. Сам я использую параллельно до 8 торговых запросов только на конкурсах демо-счетов. На реальных счетах по возможности не применяю ничего недокументированного.

Скажите, какие замеры Вы сделали, что выяснилась потеря призводительности из-за того, что несколько советников держат постоянно открытым на чтение один общий файл и каждый тик подчитывают из него короткие блокировки/разблокировки?

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

 
Не понимаю зачем вам файл сдался если и без него можно обойтиться.
Причина обращения: