Блог им. 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);
}
}
}
Надеемся данный материал бы полезен вам. Обязательно постарайтесь с ним разобраться, так как в последующем активно будем возвращаться к получению конкретных фьючерсов.