ВступлениеКраткое вступление о том, что такое прямой доступ к торгам для робота. Это значит, что ваш робот начинает слать торговые сигналы на биржу, минуя всех посредников (брокера, промежуточное программное обеспечение и т.д.). Часто подобный доступ ассоциируют с High Frequency Trading (далее, просто HFT) роботами, или, попросту говоря, высокочастотниками. Но HFT это не единственные “клиенты”, кому может быть удобен такой способ. Ниже ряд преимуществ и для обычного робота:
- Отсутствие прослоек уменьшает технические риски.
- Прямой доступ гарантирует торговлю только по правилам биржи, без накладывания дополнительных ограничений. Например, дополнительное ГО (гарантийному обеспечению), как правило.
- Робот не привязан к какой-либо технологии доступа, кроме как к Plaza2.
- Самая полная информация о маркет-данных. Например, order log (журнал заявок, поступающих от всех участников торгов).
Модель доступа Естественно, создание роботов под шлюз биржи – это только их программирование. На языке C#, С++, Delphi и т.д. – на чем больше опыт. Биржа дает свой программный интерфейс (далее, API), с помощью которого роботы и подключаются к торгам. Бывают 2 версии этого API, под 32 и 64 битные компьютеры. Лучше использовать под 64 бита, так как тогда робот не будет ограничен потреблением памяти. Для роботов, которые используют Plaza2 как один из источников данных, а так же сложные математические расчеты, проблема с доступной памятью наиболее актуальна.
Plaza2 API так же бывает однопоточной и многопоточной (STA, MTA). Лучше использовать MTA, так как в этом случае робот будет работать без временных зависаний (особенно проявляется при сильном движении на рынке), да и просто быстрее получать и отправлять данные. Написание робота под Plaza2 API требует глубоких познаний в программировании и специфике работы биржевых данных. Поэтому, для упрощения создания роботов можно использовать бесплатную библиотеку StockSharp. У нее есть ряд преимуществ перед обычным Plaza2 API:
- Существенно упрощает и ускоряет процесс обучения написания роботов под Plaza2.
- Позволяет включать режим эмуляции на реальных торгах (с реальной ликвидностью в стаканах).
- Тестирование робота на исторических данных (единая среда как для написания робота, так и для тестирования).
- Сертифицирована, что позволяет не проходить сертификацию у биржи, и получать сертификат автоматически.
- Наличие стопов.
- Не вносит никаких задержек, тоесть скорость работы точно такая же, как если писать робота напрямую под Plaza2 API (критично для HFT).
- Открытый код.
- Возможность подключать западные площадки.
ПримерВместо заключения небольшой пример того, как выглядит робот, торгующий через Plaza2.
Подключение к торгам:
Код
var trader = new PlazaTrader();
Security rih2 = null;
trader.NewSecurities += securities =>
{
// если RIH2 еще не появился, то пытаемся его найти
if (rih2 == null)
rih2 = securities.FirstOrDefault(s => s.Id == "RIH2@RTS");
};
// после успешного подключения запускаем экспорт
trader.Connected += trader.StartExport;
// подключаемся к торгам
trader.Connect();
Небольшая стратегия, торгующая спредом фьючерса на индекс РТС:
Код
class SpreadStrategy : Strategy
{
private Order _order;
private bool _canProcess;
private OrderDirections _dir;
protected override void OnStarting()
{
// подписываемся на правило изменения стакана
this
.When(Security.MarketDepthChanged())
.Do(ProcessDepth);
// добавляем автозащитную стратегию (автоматически выставляет тейк + стоп)
ChildStrategies.Add(new AutoProtectiveStrategy());
base.OnStarting();
}
private void ProcessDepth(MarketDepth depth)
{
// заявка пока еще не исполнена
if (!_canProcess)
return;
// заявка исполнилась, но не исполнились стопы
if (PositionManager.Position != 0)
return;
// создаем рыночную заявку (так как на FORTS нет такого понятия как рыночная заявка, то будет использована встречная цена в стакане)
_order = this.CreateOrder(_dir, depth.GetMarketPrice(_dir));
// в следующий раз будем открываться в другую сторону
_dir = _dir.Invert();
// запретить обработу стакана до тех пор, пока заявка не исполниться
_canProcess = false;
this
.When(_order.Matched())
.Do(() => _canProcess = true);
// отправляем на регистрацию
RegisterOrder(_order);
}
}
Сухов Михаил
StockSharp Торговые роботы