Привод на несколько терминалов
- В аэропорт отвезешь?
- Легко! А дорогу покажешь?
Приятно делать робота, когда Заказчик не только знает, что ему нужно, причем в деталях, но еще и заранее потратил свое время, чтобы мне не пришлось догадываться о его потребностях.
Заказчик имеет свою систему торговли, которую осуществляет в ручном режиме. Все было бы хорошо, однако сложность состоит в том, что торговля осуществляется одновременно в разных терминалах (подключенных к разным брокерам) и по разным счетам одновременно. Понятно, что при количестве терминалов больше двух основные силы тратятся уже не а саму торговлю, а на постоянную беготню по разным закладкам разных терминалов в поисках нужной таблицы и неминуемо возникающие при этом ошибки. Конечно, о какой-то скорости реакции на изменения рынка и речи не шло. Требовался привод, который смог бы избавить Заказчика от этих непродуктивных усилий и уберечь от проблем типа "не в ту строку мышкой попал в третьем по счету терминале". Вот такую картинку я получил от Заказчика:
Итого - таблица. По вертикали - несколько терминалов, между которыми можно переключаться одним кликом. Количество терминалов может со временем изменяться. По горизонтали - инструменты, доступные к торговле. Выбираются интерактивно из числа торгуемых на текущий момент в торговой системе.
Каждый инструмент имеет несколько настроек, модифицирующих реакцию привода на действия пользователя.
Пользователь имеет возможность одним кликом купить или продать инструмент (выставляя лимитированную заявку, рассчитанную в соответствии с настройками инструмента и в требуемом объёме), закрыть текущую позицию, удалить все активные (неисполненные) заявки, либо исполнить panic hide - избавиться от позиции любой ценой.
Все эти действия можно сделать как в одном отдельном терминале, так и сразу в нескольких. Можно и во всех сразу - терминалы объединяются в пулы непосредственно на экранной форме одним нажатием мыши. При этом объемы для торговли могут устанавливаться для каждого терминала свои.
Также Пользователю предоставлена возможность рассчитать и установить одним нажатием кнопки для каждого инструмента объём для торговли, чтобы использовался заданный процент от имеющихся средств - также в разрезе различных счетов/терминалов.
И, соответственно, несколько приятных мелочей типа запоминания положения формы на экране, расположение формы поверх остальных окон, регулируемая прозрачность в случае неактивности, изменение цветовой гаммы и так далее.
Никаких файловых обменов и прочего треша типа .tri/.tro транзакций. Только DDE и API QUIK. Дополнительно привод контролирует наличие всех требуемых к экспорту таблиц, правильность их настройки, проверяет соединение каждого терминала с сервером брокером и проч., ограждая Пользователя от подобного рода неожиданностей в момент торговли.
Что получилось в результате:
Довольно похоже на картинку, присланную Заказчиком. Сказалось хорошо продуманное Заказчиком задание.
На чем писалось? Первый вариант, что пришел в голову - библиотека S#. Штука хорошая, но использовать я ее на этот раз не стал. Графиков в приводе нет, данные поступают из терминала в реальном времени, никакой кроссплатформенности и близко не требуется - никакого смысла городить весь огород. А не написать ли мне этот привод на Бейсике?
Скажем прямо, бейсик - это чересчур . Все дотнеты для этой задачки тоже ни к чему. Из пыльного чулана был извлечен старый добрый AutoIt. К нему был прилеплен готовый многократно проверенный DDE сервер из AmiSharp. Тем более что AmiSharp штатно позволяет управлять несколькими терминалами из одного робота например таким способом:
Написано за 4 дня под милую музыку старины Алана.
См. также Обмен данными между терминалами
Публикуется с разрешения Заказчика