Торговый Плагин для AmiBroker
Торговые функции для взаимодействия с торговой системой It-trade реализованы в виде COM интерфейса (CTradingProxy) и имплементированы в data плагине (smart-plugin.dll). Взаимодействие с интерфейсом происходит напрямую из встроенного в AmiBroker языка AFL. Поддержка COM технологии в AFL начинается с версии 3.7beta.
Поддерживаются следующие функции управления приказами:
1. Int PlaceOrder(string portfolio, string instrument, int operation, int type, int validity, double price, double amount, double stopPrice)
Процедура постановки приказа. В случае успешного завершения возвращает идентификатор приказа. Для манипулирования приказами через CTradingProxy используются только идентификаторы приказов, полученные в результате вызова PlaceOrder. Данные идентификаторы не имеют ничего общего как с биржевыми номерами приказов, так и с номерами приказов в торговой системе.
Внимание: Получение идентификатора приказа еще не означает того, что приказ вышел на биржу, это лишь означает что приказ передан в SmartCOM успешно. В силу архитектурных особенностей связки AmiBroker & SmartCOM2 мы не можем снять приказ или определить его судьбу в текущем контексте исполнения AFL скрипта, но можем сделать эти действия в другом контексте исполнения AFL. Так как реакция SmartCOM сервера на постановку/снятие приказа приходит асинхронно, она может быть получена только после передачи управления из AFL скрипта в цикл обработки сообщений AmiBroker-а. После этого можно получить состояние приказа функцией GetOrderStatus.
2. Int CancelOrder(int orderId)
Процедура снятия приказа. Случае успешного завершения возвращает 0. Коды ошибок представлены в примере ниже.
3. Int GetOrderStatus(int orderId)
Процедура получения статуса приказа. Все статусы описаны в примере.
Внимание: Перед использованием интерфейса CTradingProxy необходимо зарегистрировать сборку smart-plugin.dll в реестре. Для этого необходимо скопировать в папку с плагинами AmiBroker-а файл reg_plugin.bat (обновленный smart-plugin.dll должен уже лежать в этой папке) и выполнить его с правами администратора. При удачной регистрации будет выведено окно с надписью «DllRegisterServer завершено удачно».
1. Пример постановки приказа.
// Получаем ссылку на торговый COM интерфейс
myobj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
OrderId = myobj.PlaceOrder( "BP0694-RF-01", // Портфель
"SBRF-12.10_FT", // Системный код инструмента (alias)
1, // Операция (1-Buy, 2-Sell)
2, // Тип (1-Market, 2-Limit, 3-Stop, 4-StopLimit)
1, // 1-Day, 2-GTC
10120.0, // Цена
1, // Количество
0.0 // Цена стоп
);
if( OrderId > 0 )
{
// Успешное завешение, получаем внутренний номер приказа
_TRACE("Order send successfully, OrderId: " + NumToStr(OrderId));
}
else if( OrderId == -1 )
{
// Ошибка отсылки приказа
_TRACE("Order send failed..");
}
else if ( OrderId == -50 )
{
// Внутренняя ошибка плагина, нет связи с серверным интерфейсом
_TRACE("SystemLevel error..");
}
2. Пример снятия приказа
// Получаем ссылку на торговый COM интерфейс
myobj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
Result = myobj.CancelOrder( 4194305 /* order id */);
if( Result == 0 )
{
// Успешное завершение
_TRACE("Order canceled successfully");
}
else if( Result == -1 )
{
// Приказ закеширован, но снять его не удалось
_TRACE("Cancel failed..");
}
else if( Result == -2 )
{
// Приказ закеширован, но его системный код не определен (Возможно, еще не пришел ответ о его постановке)
_TRACE("Cancel failed..");
}
else if( Result == -3 )
{
// Приказ не кешировался, или уже снят
_TRACE("Cancel failed..");
}
3. Проверка статуса приказа
// Получаем ссылку на торговый COM интерфейс
myobj = CreateObject("SmartAmiTradePlugin.CTradingProxy");
Result = myobj.GetOrderStatus( 4194306);
if( Result == 0 )
{
// Ответ на отправку приказа еще не пришел
_TRACE("Order state unknown, np answer");
}
else if( Result == 1 )
{
// Приказ отправлен с торговую систему удачно
_TRACE("Order placed successfully into TS");
}
else if( Result == 2 )
{
// Приказ находится в пендинге
_TRACE("Order in pending");
}
else if( Result == 3 )
{
// Приказ выставлен на биржу
_TRACE("Order is open");
}
else if( Result == 4 )
{
// Приказ снят
_TRACE("Order is canceled");
}
else if( Result == 5 )
{
// Приказ исполнен
_TRACE("Order is filled");
}
else if( Result == 6 )
{
// Приказ отвергунут системой
_TRACE("Order rejected by system");
}
else if( Result == 7 )
{
// Приказ снят системой
_TRACE("Order canceled by system");
}
else if( Result == -2 )
{
// Приказ не найден
_TRACE("Order not finded");
}