Блог им. traderblogger
Symbol Lookup — получим конкретные контракты для торговли.
В одном из предыдущих занятий мы рассматривали такое понятие, как «Базовые контракты» . Базовые контракты содержат массу полезной и практической информации о фьючерсах и опционах и спредах, доступных у брокера. Но нет самого главного!
Это не те объекты, которыми собственно можно торговать. Торговля осуществляется не базовыми контрактами, а конкретными фьючерсами, ПРИВЯЗАННЫМИ К времени экспирации.
В данном уроке научимся их получать. В следующих материалах они будут использоваться постоянно. Поэтому внимательно изучите данный материал.
Создаем новое приложение в Visual Studio — windows forms. Не забываем подключить нужные dll (смотрите первые статьи).
Создаем форму, как показано на рисунке:
Ниже полный текст программы с подробным комментариями:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows; namespace Symbol_Lookup { public partial class Form1 : Form { static OEC.API.OECClient oecClient; static OEC.API.SimpleSymbolLookupCriteria ourSymbolLookupRequest = null; static OEC.API.SymbolLookupCriteria aBunchOfOurSymbol = null; public Form1() { InitializeComponent(); oecClient = new OEC.API.OECClient(); oecClient.UUID = "9e61a8bc-0a31-4542-ad85-33ebab0e4e86"; login.Text = "TradeInWest.ru"; password.Text = "TradeInWest.ru"; oecClient.OnLoginComplete += new OEC.API.OnLoginCompleteEvent(onLoginComplete); oecClient.OnLoginFailed += new OEC.API.OnLoginFailedEvent(onLoginFailed); oecClient.OnDisconnected += new OEC.API.OnDisconnectedEvent(onDisconnected); //добавляем обработчик события - получение доступных контрактов для торговли по запросу. oecClient.OnSymbolLookupReceived += new OEC.API.OnSymbolLookupEvent(OnSymbolLookupReceived); } //подключаемся к серверу брокера private void bConnect_Click(object sender, EventArgs e) { oecClient.Connect("api.openecry.com", 9200, login.Text, password.Text, true); } //обработчик клика на кнопку "рассоединение" private void bDisconnect_Click(object sender, EventArgs e) { //отсоединяемся. oecClient.Disconnect(); lStatus.Text = ""; } //обработка удачного подключения private void onLoginComplete() { //Сообщаем об успешном соединении lStatus.Text = "Соединение установлено. Счет:" + oecClient.Accounts.First.Name; //пока есть соединение кнопка Connect - не активна. bConnect.Enabled = false; //а вот кнопку DisConnect делаем активной bDisconnect.Enabled = true; //И заполняем списки контрактов } //обработка неудачного соединенияя private void onLoginFailed(OEC.Data.FailReason reason) { lStatus.Text = "Соединение не удалось: " + reason.ToString(); //колдуем над доступностью кнопок bConnect.Enabled = true; bDisconnect.Enabled = false; } //обработка отключения от сервера private void onDisconnected(bool unexpected) { //колдуем над доступностью кнопок bConnect.Enabled = true; bDisconnect.Enabled = false; } //обработчик получения по запросу списка доступных для торговли контрактов. private void OnSymbolLookupReceived(OEC.API.SymbolLookupCriteria symbolLookup, OEC.API.ContractList contracts) { string strContract=""; listContracts.Items.Clear(); if (aBunchOfOurSymbol != null && symbolLookup.ID == aBunchOfOurSymbol.ID) { //перебираем контракты из коллекции контрактов , которую получили в результате выборки foreach (var contract in contracts) { //отбираем только фьючерсы if (contract.BaseContract.ContractKind == OEC.Data.ContractKind.Future) { //формируем строку и добавляем ее в listbox для отображения strContract = "Contract: " + contract.Symbol + "; Expiration Date: " + contract.ExpirationTime; listContracts.Items.Add(strContract); } } } } //обработчик клика на кнопку "Показать контракты" private void bSymbolLookup_Click(object sender, EventArgs e) { //если символ не указан, то поиск не производим if (tSymbol.Text == "") { MessageBox.Show("Укажите символ контракта для поиска"); return; } //формируем фильтр критериев для поиска доступных контрактов aBunchOfOurSymbol = new OEC.API.SymbolLookupCriteria() { SearchText = tSymbol.Text, ContractType = OEC.Data.ContractType.Electronic, Mode = OEC.Data.SymbolLookupMode.AnyInclusion, DesiredResultCount = 20 }; //получаем доступные контракты oecClient.SymbolLookup(aBunchOfOurSymbol); } } }
Здесь можете скачать готовый проект.
Ниже представлю скриншоты работы программы, а потом разберем ключевые моменты, на которые надо обратить внимание.
Запустили программу, подключились к серверу, указали интересующий нас тикер «6e» и нажали кнопку «Показать контракты». Получаем следующее:
Как вы видите отображаются в списке КОНКРЕТНЫЕ контрактыфьючерса 6E (на валютную пару евродоллар) с датами их экспирации. Вот уже с этими контрактами в списке можно совершать конкретные сделки!
Другой пример (для фьючерса E-Mini S&P 500):
В качестве тикера можно указывать не только сивол базового контракта, но и полную спецификацию, включающую кроме тикера базового контракта, но и месяц и год экспирации контракта. Например, можно получить декабрьский контракт по E-Mini S&P 500: esz6.
Ключевые участки кода:
//формируем фильтр критериев для поиска доступных контрактов aBunchOfOurSymbol = new OEC.API.SymbolLookupCriteria() { SearchText = tSymbol.Text, ContractType = OEC.Data.ContractType.Electronic, Mode = OEC.Data.SymbolLookupMode.AnyInclusion, DesiredResultCount = 20 }; //получаем доступные контракты oecClient.SymbolLookup(aBunchOfOurSymbol); }
Переменная aBunchOfOurSymbol — содержит в себе критерии отбора и поиска доступных фьючерсов. В частности происходит поиск с параметром SearchText, тип контрактов — электронные, ограничение по количеству — 20 контрактов.
После задания критерия поиска производим собственно поиск:
//получаем доступные контракты oecClient.SymbolLookup(aBunchOfOurSymbol);
А далее в обработчике получения найденных контрактов выводим полученную коллекцию:
//обработчик получения по запросу списка доступных для торговли контрактов. private void OnSymbolLookupReceived(OEC.API.SymbolLookupCriteria symbolLookup, OEC.API.ContractList contracts) { string strContract=""; listContracts.Items.Clear(); if (aBunchOfOurSymbol != null && symbolLookup.ID == aBunchOfOurSymbol.ID) { //перебираем контракты из коллекции контрактов , которую получили в результате выборки foreach (var contract in contracts) { //отбираем только фьючерсы if (contract.BaseContract.ContractKind == OEC.Data.ContractKind.Future) { //формируем строку и добавляем ее в listbox для отображения strContract = "Contract: " + contract.Symbol + "; Expiration Date: " + contract.ExpirationTime; listContracts.Items.Add(strContract); } } }
Надеемся данный материал бы полезен вам. Обязательно постарайтесь с ним разобраться, так как в последующем активно будем возвращаться к получению конкретных фьючерсов.