Блог им. traderblogger
Если вы открыли счет для работы с платформой Global Zen Trader, то кроме отличного торгового терминала вы получаете возможность создавать собственных торговых роботов. Давайте сегодня создадим первое приложение «Hello API».
При этом вы будете использовать API брокера, подключаться к серверам брокера и исполнение ордеров через вашу программу будет полностью идентично исполнению ордеров через штатный торговый терминал Global Zen Trader.
В наших примерах будем использовать язык C# (C sharp).
Для начала скачайте API и установите его. Также закажите аккаунт разработчика.
Запускаем Microsoft Visual Studio. Создаем КОНСОЛЬНОЕ приложение.
Обязательно добавьте ссылки на три библиотеки: API.DLL, CommLib.DLL и ProtoSharp.Core.dll:
Данные файлы появляются после установки API и хранятся обычно по адресу: «C:\Program Files\OEC\OEC API COM 3.5»
Но для своего решения вы можете разместить библиотеки непосредственно в каталог проекта.
Дальше создаем код приложения. Комментарии находятся непосредственно в коде.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Hello_oec { class Program { static OEC.API.OECClient oecapi; //объявляем объект класса OECClient - собственно с этим объектом и происходит дальше работа после соединения с сервервами брокера. static void Main(string[] args) { Console.WriteLine("Hello, OEC!"); //традиционное приветствие первой программы oecapi = new OEC.API.OECClient(); // создаем экземпляр // Уникальный идентификатор приложения. Сейчас используется универсальный идентификатор, но в будущем при разработке собственного приложения //необходимо будет получить свой уникальный идентификатор для своей программы. //использование данного UUID позволяет, в частности, подключаться к одному счету из стандартного торгового терминала Global Zen Trader //и из вашей программы. Это удобно, так как позволяет следить за рынком и счетом через Global Zen Trader и при этом ваше приложение будет //решать возложенные на него задачи. oecapi.UUID = "9e61a8bc-0a31-4542-ad85-33ebab0e4e86"; //подключаемся к серверам с использованием своего логина и пароля. //Первый параметр - адрес для разработки. Адрес для реальных счетов: prod.openecry.com // 9200 - порт. Он должен быть открыт //Третий и четвертый параметры - логин и пароль. Вам надо получить его по адресу: http://tradeinwest.ru/account-api-developer/ oecapi.Connect("api.openecry.com", 9200, "TradeInWest.ru", "TradeInWest.ru", true); Console.WriteLine("Connecting"); //Подключаем обработчики событий //Обработчик успешного соедининения oecapi.OnLoginComplete += new OEC.API.OnLoginCompleteEvent(oecapi_OnLoginComplete); //обработчик неудачного соединения oecapi.OnLoginFailed += new OEC.API.OnLoginFailedEvent(oecapi_OnLoginFailed); //Обработчик рассоединения oecapi.OnDisconnected += new OEC.API.OnDisconnectedEvent(oecapi_OnDisconnected); Console.WriteLine("Press Ctrl-C to exit"); //Так как большинство методов API - асинхронные, то для того, чтобы увидеть результаты работы запустим форму - для того чтобы приложение не закрылось. System.Windows.Forms.Application.Run(); } //обработчик удачного соединения. Вызывается в случае, если соединение с сервером прошло удачно. static void oecapi_OnLoginComplete() { //Сообщаем об успешном соединении Console.WriteLine("OnLoginComplete: CompleteConnected={0}",oecapi.CompleteConnected); //Сообщаем общую информацию. //В частности : //1)количество счетов //2)Количество ордеров (любых типов, в любом состоянии) //3)количество контрактов, доступных для торговли //4)количество наличных на счете Console.WriteLine("\tAccounts:{0}, orders:{1},base contracts:{2}, сумма на счете:{3}", oecapi.Accounts.Count, oecapi.Orders.Count, oecapi.BaseContracts.Count,oecapi.Accounts.First.Balances.First.Cash); //СОздали две функции, которые сообщат две дополнительную информацию о счете и о базовом контракте e-mini s&p 500 - тикер ES. DisplayAccount(oecapi.Accounts.First); DisplayContract(oecapi.BaseContracts["ES"]); } //обработчик события неудачного соединения. //в reason возвращается причина неудачи. static void oecapi_OnLoginFailed(OEC.Data.FailReason reason) { Console.WriteLine("OnLoginFailed:{0}", reason); } //обработчик события рассоединения static void oecapi_OnDisconnected(bool unexpected) { Console.WriteLine("OnDisconnected:{0}", unexpected ? "unexpected" : "expected"); } //через API можно получить доступ КО всей информации о своем счете. //в процедуру передается первый из доступных счетов. Как правило он у клиента один. //oecapi.Accounts - коллекция счетов. //oecapi.Accounts.First - первый из коллекции private static void DisplayAccount(OEC.API.Account account) { Console.WriteLine("Account: {0}",account); //получаем баланс нашего счета OEC.API.Balance totalBalance = account.TotalBalance; Console.WriteLine("\tNetLiq: {0}",totalBalance.NetLiq); //ликвидационная стоимость счета Console.WriteLine("\tCash: {0}", totalBalance.Cash); //наличные на счете Console.WriteLine("\tOpen P/L: {0}", totalBalance.OpenPnL); // открытая прибыль или убыток Console.WriteLine("\tInitial Margin: {0}", totalBalance.InitialMargin); //задействованная маржа по открытой позиции Console.WriteLine("Average Positions: {0}", account.AvgPositions.Count); //количество открытых позиций } //Данная процедура выводит информацию о базовом контракте //baseContract - базовый контракт //oecapi.BaseContracts["ES"] - нашли в коллекции базовых контрактов контракт с тикером ES - e-mini s&p 500 //и передали в эту процедуру private static void DisplayContract(OEC.API.BaseContract baseContract) { //выводим его полное имя Console.WriteLine("BaseContractt: {0} - {1}",baseContract.Symbol,baseContract.Name); //выводим валюту, в которой номинирован контракт Console.WriteLine("\tCurrency: {0}",baseContract.Currency.Name); //биржа, на которой торгуется данный контракт Console.WriteLine("\tExchange: {0}", baseContract.Exchange.Name); //вид контракта. В нашем случае - фьючерс Console.WriteLine("\tKind: {0}", baseContract.ContractKind); //тип контракта - электронный Console.WriteLine("\tType: {0}", baseContract.Type); //к какой группе относится - индексы Console.WriteLine("\tGroup: {0}", baseContract.ContractGroup.Name); //время начала и окончания торговли Console.WriteLine("\tNormal trading session: {0}-{1}, day close: {2}", baseContract.StartTime, baseContract.StopTime, baseContract.DayClose); //формат цены Console.WriteLine("\tPrice Format: {0}", OEC.API.Strings.GetPriceMask(baseContract.PriceFormat, 0)); } } }
Теперь запустим нашу программу на исполнение и если всё сделали правильно, то получим такой результат:
Если по каким-то причинам соединиться не получилось, то сработает обработчик oecapi_OnLoginFailed и будет сообщена причина неудачи. Например неправильный логин или пароль, как на даннном скрине:
Обработчик oecapi_OnLoginFailed в итоге выдал нам причину: InvalidUserOrPassword. Кроме того сработал и третий наш обработчик — обработчик рассоединения oecapi_OnDisconnected.
Надеюсь вам данный материал был полезен.