манименеджмент на несколько экспертов

 

 Задача такая:

 Появилась идея, распределить какой-то процент от депозита на торговлю опрделённых количеством экспертов. Например, есть доля средств 2% от депозита для торговли. Если торгует 2 эксперта, значит каждый может рисковать только 2% / 2 = 1% процентом от депозита, если 4 эксперта торгуют, на каждого доля риска будет 2% / 4 = 0.5%.

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

 

Можно реализовать через глобальные переменные - пусть каждый эксперт создает уникальную отметку (глобальную переменную), но с узнаваемой сигнатурой, тогда каждый советник при запуске ищет сигнатуры, суммирует по количеству и устанавливает себе исходя из этого % риска, а еще лучше пусть создается и переписывается каждым новым стартующим/останавливающимся советником общая глобальная переменная с величиной % риска.

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

 

Мне кажется, проще использовать одну общую глобальную переменную в качестве счётчика. При инициализации советник увеличивает её значение на единицу, а при деинициализации - уменьшает.

А также как вариант - парсить файл с логами экпертов. Но это уже гемор конечно :) 

 
А если глюк ? Если деинит не прошел штатно ?  
 
FAQ:
А если глюк ? Если деинит не прошел штатно ?  
ну да, необходимо конечно вводить дополнительные проверки. Деинит не приходит при нештатном завершении работы терминала, поэтому нужно предусмотреть ещё одну общую глобальную переменную, в которой будет храниться ID текущего процесса либо хэндл главного окна терминала. Ну и плюс надо организовать последовательный доступ экспертов к этим переменным, т.е. нужна ещё одна глобальная переменная в качестве семафора.
 

Пусть глобальная переменная советника будет выглядеть так - сигнатура+№ID по порядку запуска+время последнего рефреша и переписывать он ее будет на каждом тике.

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

Тогда каждый тик советник будет подтверждать свою активность, а в случае выхода без деинита - будет выключен из состава рабочих другими исправно работающими советниками через 2 минуты после его вылета.

 
FAQ:
А если глюк ? Если деинит не прошел штатно ?  
Можно сделать так: каждый эксперт обязан отмечаться в глобальных переменых, например, не реже, чем раз в полминуты. Т.е. писать в глобальную свой идентификатор и временную отметку. При этом проверять отмети других экспертов: если находится устаревшая, то просто ее удалять и считать, что эксперт завис или переглючил.
 
Meat:
ну да, необходимо конечно вводить дополнительные проверки. Деинит не приходит при нештатном завершении работы терминала, поэтому нужно предусмотреть ещё одну общую глобальную переменную, в которой будет храниться ID текущего процесса либо хэндл главного окна терминала. Ну и плюс надо организовать последовательный доступ экспертов к этим переменным, т.е. нужна ещё одна глобальная переменная в качестве семафора.


Хэндл зачем? Он же один на все совы...

И семафор должен быть на каждый советник.

Речь ведь идет не о вылете терминала целиком, а только об изменении количества активных сов.

 
ktest0:


Хэндл зачем? Он же один на все совы...

И семафор должен быть на каждый советник.

Речь ведь идет не о вылете терминала целиком, а только об изменении количества активных сов.

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

 Во, я нашёл в чём подвох:

ktest0:

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

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

 
Meat:

 Во, я нашёл в чём подвох:

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


Подвоха нет, т.к.:

1. удаление нужно делать при проверке на доступность торговли и наличия связи с сервером и тайм ауте советника я говорил допустим 2 минуты, а можно и 10 и 30 и 60 минут сделать - каждый делает как хочет

2. советник в любом случае зациклен, он повторяет функцию Start() на каждом тике

3. в собственную переменную для каждого советника своей, где есть сигнатура, ID-номер и штамп времени никто ничего писать не может - она только для него, остальные только читают

4. если советник долгое время не получал тики, ну предположим реально рынок валютной пары "замерз" - логично предположить что он не торгует, а значит нафига он нужен в учете рабочих советников? Вердикт - удалить его глобальную переменную и изменить счетчик на -1, пусть ее сам восстановит когда тики пойдут, изменит счетчик активных сов на +1 и снова вольется в торговлю.

Полный автоматизЪм... 

Причина обращения: