Финансовая лаборатория

Биржевая торговля и торговые роботы

В предыдущих постах я начал выкладывать описание API программы FinLab.MTS. Первую часть этого описания можно посмотреть здесь. Сегодня продолжение.

Итак, сегодня весь пост будет посвящен классу Algorithm.

Класс Algorithm

Как уже было сказано, это базовый класс. Он реализует несколько интерфейсов, а также имеет ряд собственных свойств и методов.

namespace FinLab.MTS.Infinity

{

[Serializable]

public abstract class Algorithm : IDisposable, ITaskInfo, IControlable, IAlgorithm, IInitializeable

{...}

}

Возможность сохранять и загружать задачу предъявляет к алгоритму требование сериализуемости. Эти требования описаны в разделе 5.3. Подробнее о сериализации можно узнать на сайте МайкроСофт.

http://msdn.microsoft.com/en-us/library/ms950721.aspx

1.1. Интерфейс IAlgorithm

1.1.1. Свойства

TaskParameterList<bool> BoolParameters { get; set; }

TaskParameterList<double> DoubleParameters { get; set; }

Это коллекции булевых и вещественных параметров. Эти коллекции уже определены в классе Algorithm и доступны пользователю. Эти коллекции предназначены для пользователей, которые по каким-то причинам не хотят писать UI настроек своего алгоритма.

Параметры, содержащиеся в этих коллекциях, отображаются в окне «Список параметров» настроек пользовательской задачи (Руководство пользователя FinLab-PairTrade, стр. 55).

Более подробно о работе этих коллекций будет рассказано в приложении №1.

Informer Informer { get; }

Экземпляр класса Informer.

Необходим для отображения на главной форме программы той информации, которая не может быть отображена в основной таблице, т.е. информации, специфической для каждого пользовательского алгоритма.

По умолчанию уже инициализирован, но может быть использован пользователем по своему усмотрению. Подробнее об этом классе будет рассказано в приложении №4.

1.1.2. Методы

Все методы, описанные в интерфейсе IAlgorithm, обязательны к переопределению.

1)    Методы, отвечающие за выставление заявок

AddCommand CheckBuyDirection(IStakan futures, IStakan spot);

AddCommand CheckSellDirection(IStakan futures, IStakan spot);

Параметры:

  • futures – стакан финансового инструмента, являющегося фьючерсом
  • spot – стакан финансового инструмента, являющегося спотом

Возвращаемое значение: экземпляр класса AddCommand, содержащий в себе всю необходимую для выставления заявки информацию или null, если заявку выставлять не надо.

В этих методах алгоритм пользователя анализирует ситуацию на рынке, и, если принимает решение о выставлении заявки – создает новый экземпляр AddCommand, заполняет его поля (цену, количество и пр.) и передает его пользовательской задаче в виде возвращаемого значения. Эта команда затем передается в терминал и служит для выставления заявки.

Оба эти метода имеют идентичное назначение с тем только исключением, что первый отвечает за покупку, а второй за продажу.

Пользовательская задача, получив команду, проверяет ее направление и объем (чтобы не купить и не продать лишнего), запоминает ее и транслирует ее в терминал.

Внимание! Заявки выставляются только по фьючерсу. Пользователю достаточно заполнить только цену, количество и тип заявки (рыночная или лимитированная). Остальные значения в любом случае будут подставлены пользовательской задачей.

Внимание! Алгоритм пользователя сам ответственен за округление цены заявки до минимального шага цены фьючерса!

Более подробно о классе AddCommand рассказоно в приложении №2, об интерфейсе IStakan – в приложении №6.

2)    Методы, отвечающие за снятие заявки

bool DeleteOrderBuy(AddCommand addCommand, IStakan futures, IStakan spot);

bool DeleteOrderSell(AddCommand addCommand, IStakan futures, IStakan spot);

Параметры:

  • addCommand – ранее поданная алгоритмом (через методы CheckBuyDirection или CheckSellDirection) команда на выставление заявки.
  • futures – стакан финансового инструмента, являющегося фьючерсом
  • spot – стакан финансового инструмента, являющегося спотом

Возвращаемое значение: true, если указанная заявка не удовлетворяет рыночной ситуации и подлежит снятию, в противном случае – false.

Все свойства addCommand в точности соответствуют реальной заявке, находящейся в текущий момент в рынке. Это означает, что если после выставления заявка была частично исполнена, то в addCommand будет указано количество лотов (контрактов), равное количеству лотов (контрактов), оставшемуся в заявке.

3)    Метод, оповещающий алгоритм о сделке

void OnTrade(Trade trade);

Параметры:

  • trade – экземпляр сделки, содержащий все необходимую информацию

Класс Trade описан в приложении №10.

1.2. Интерфейс ITaskInfo

1.2.1. Свойства

Все свойства, описанные в интерфейсе ITaskInfo, обязательны к переопределению.

double AveragePrice { get; }

Информативное свойство. Значение этого свойства отображается в главном окне программы в колонке Aver. Spread. Может быть любым значением.

int CurrentLotSizeBuy { get; }

int CurrentLotSizeSell { get; }

Свойства, влияющие на расчеты. Свойство означает количество контрактов, которое планируется купить и продать. В соответствии со значением этого свойства рассчитываются значения опорных бидов и опорных оферов фьючерса и спота, из которых с последствии получаются значения спрэдов Buy Market Spread, Sell Market Spread, Buy Limit Spread, Sell Limit Spread.

К примеру, алгоритм пользователя использует значения спрэдов, рассчитываемые пользовательской задачей. Если задача рассчитана на торговлю 1-2-3 контрактами, то погрешность расчета спрэда мала и ей можно пренебречь. Но если задача будет торговать 100-300 контрактами, то разница между спрэдом на 1 контракт и спрэдом на 100 контрактов может быть существенной. Алгоритм должен это учитывать с помощью этого свойства. Может быть любым положительным числом.

double TargetPriceBuy { get; }

double TargetPriceSell { get; }

Информативные свойства. Значения этих свойств отображаются в главном окне программы в колонках Target Buy Price и Target Sell Price. Может быть любым значением.

1.3. Интерфейс IInitializeable

1.3.1. Методы

Все методы, описанные в интерфейсе IInitializeable, обязательны к переопределению.

bool Initialize();

Метод используется для инициализации экземпляра Algorithm.

Дело в том, что на момент создания экземпляра класса Algorithm (конструктор класса) весь функционал еще недоступен. Экземпляр еще не знает ничего ни о фьючерсе, ни о споте, ни о чем-либо другом. Попытка обращения к любому защищенному (protected) методу или свойству вызовет исключение NullReferenceException.

Метод Initialize вызывается пользовательской задачей в тот момент, когда передача всей информации от задачи к алгоритму завершена, и алгоритм может начинать процессы получения котировок, расчетов и т.п.

Возвращаемое значение: true, если инициализация прошла успешно, иначе false.

1.4. Интерфейс IDisposable

1.4.1. Методы

Все методы, описанные в интерфейсе IDisposable, обязательны к переопределению.

void Dispose();

Метод, в котором выполняются операции по очистке используемых ресурсов при «умерщвлении» экземпляра Algorithm.

1.5. Интерфейс IControlable

1.5.1. Методы

Все методы, описанные в интерфейсе IControlable, обязательны к переопределению.

ObjectAssociatedControl CreateControl();

Возвращаемое значение – экземпляр класса ObjectAssociatedControl – это контрол, содержащий пользовательский интерфейс изменения настроек алгоритма. Этот контрол отображается в окне «Пользовательский интерфейс» настроек пользовательской задачи (Руководство пользователя FinLab-PairTrade, стр. 57).

Подробнее о классе ObjectAssociatedControl будет рассказано в приложении №3.

1.6. Защищенные (protected) свойства Algorithm

IStakan Futures { get; }

IStakan Spot { get; }

Полнофункциональные стаканы фьючерса и спота. Подробно об интерфейсе IStakan будет рассказано в приложении №6.

double KoefFutSpot { get; }

Коэффициент соответствия между спотом и фьючерсом. Равен количеству лотов (контрактов) спота, соответствующему 1 контракту фьючерса.

double LotSize { get; }

Размер лота спота. Т.е. количество единиц базового актива в 1 лоте спота.

int OpenedPosition { get; }

Текущая открытая позиция в задаче. Соответствует количеству открытой позиции по фьючерсу. Например, если куплено 10 контрактов, то OpenedPosition равна 10, если 20 контрактов продано, то OpenedPosition равна -20.

double AverageOpenedSpread { get; }

Средний спрэд по текущей открытой в задаче позиции.

int MaxBuy { get; }

int MaxSell { get; }

Максимально разрешенная для задачи позиция в каждую сторону.

double PointPrice { get; }

Цена пункта фьючерса  задаче. Также является ценой пункта спрэда, поскольку любой спрэд в программе FinLab.MTS должен приводиться к фьючерсу.

int Timeout { get; }

Интервал в миллисекундах, с которым заполняется внутренний буфер значений спрэда задачи.

ResultList Results { get; }

Набор результатов торговли. Через это свойство можно получить такие значения, как финансовый результат (реализованный и нереализованный), количество заявок и сделок, значения спрэда и пр. Подробнее класс ResultList будет рассмотрен в приложении №5.

TaskMode TaskMode { get; }

Режим работы задачи. См. приложение №9.

TickList Ticks { get; }

Коллекция тиков спрэда внутреннего буфера задачи. Эта коллекция заполняется значениями текущего спрэда с интервалом Timeout.

Эта коллекция позволяет быстро и точно проводить практически любые математические расчеты, например, вычисления средней, средневзвешанной, дисперсии,  корреляции, и т.д. Очень подробно о коллекции TickList рассказано в приложении №8.

1.7. Защищенные (protected) методы Algorithm

1.7.1. Методы, доступные для переопределения (virtual)

Informer CreateInformer();

Возвращаемое значение: экземпляр Informer, который в последствии будет доступен через свойство Informer. Подробнее об этом классе будет рассказано в приложении №4.

Переопределение этого метода не является обязательным. Задача может использовать Informer, создаваемый по умолчанию.

void OnUpdateStakan(IStakan futures, IStakan spot);

Параметры:

  • futures – стакан финансового инструмента, являющегося фьючерсом
  • spot – стакан финансового инструмента, являющегося спотом

Данный метод вызывается при каждом обновлении стакана, как по фьючерсу, так и по споту.

Вызов этого метода предшествует вызовам методов CheckBuyDirection, CheckSellDirection, DeleteOrderBuy, DeleteOrderSell.

Переопределение этого метода не является обязательным.

1.7.2. Вспомогательные методы

void InfoToLog(object message);

Параметры:

  • message – объект сообщения для регистрации в логе

Метод, записывающий передаваемое сообщение в лог алгоритма. Лог алгоритма создается автоматически.

void InfoToLog(string format, params object[] args);

Параметры:

  • format – формат строки
  • args – список объектов для регистрации

Метод, записывающий в лог алгоритма сообщение в указанном формате. Работа метода по формированию строки вывода в лог аналогична методу:

string.Format(string format, params object[] args);

void ErrorToLog(object sender, Exception e);

Параметры:

  • sender – источник ошибки
  • e – «пойманное» исключение

Метод, регистрирующий в лог ошибки, возникновение которых возможно в результате работы алгоритма.

DateTime MSKTime(DateTime localTime);

Параметры:

  • localTime – локальное время

Переводит любое локальное время в московское. Необходим для синхронизации времени в отличных от Московского часовых поясах.

DateTime MSKTime();

Метод, аналогичный вызову MSKTime(DateTime localTime) с параметром DateTime.Now.

double RoundPrice(double price);

Параметры:

  • price– цена инструмента

Округляет любое значение цены до минимального шага цены фьючерса. Например, если фьючерс – RTS-9.10, а price = 142768, то результат будет равен 142770.

protected double Spread(double priceFutures, double priceSpot);

Параметры:

  • priceFutures – цена фьючерса
  • priceSpot – цена спота

Возвращаемое значение: значение спрэда, соответствующего указанным ценам фьючерса и спота. Например, для пары GAZR-9.10 и GAZP при цене фьючерса = 16300 и цене спота = 162,87 возвращаемое значение будет равно 13.

double FuturesOrderLimitPrice(double spotBasisPrice, double targetSpread);

Параметры:

  • spotBasisPrice – цена спота
  • targetSpread – целевой спрэд

Возвращаемое значение – цена фьючерса, которая при заданном значении цены спота позволяет зафиксировать целевой спрэд. Например, для пары GAZR-9.10 и GAZP при цене спота = 162,87 и целевом спрэде 27 возвращаемое значение будет равно 163014.

CandelList GetCandels(TimeSpan timeFrame);

Параметры:

  • timeFrame– таймфрейм

Возвращаемое значение – автоматически обновляемая коллекция свечей спрэда. Строится по тиковым данным спрэда, содержащимся во внутреннем буфере задачи. Полученная один раз, эта коллекция будет автоматически обновляться по мере поступления в буфер новых тиков. Повторный вызов метода с тем же параметром таймфрейма выдаст тот же самый экземпляр CandelList.

Подробно о коллекции CandelList будет рассказано в приложении №7.

TickList GetFuturesAllTrades();

TickList GetSpotAllTrades();

Возвращают коллекции тиков по фьючерсу и споту (список сделок, прошедших по фьючерсу или споту с начала торговой сессии). Очень подробно о коллекции TickList рассказано в приложении.

На этом пока всё. Следующий раз посмотрим – как всё это функционирует.

Построение торгового робота - это увлекательное занятие. Открывайте брокерский счет, чтобы когда выйдут следующие части нашего рассказа быть готовым не просто смотреть, но и применять полученную информацию на практике.

Чтобы не пропустить следующие части – не забывайте подписываться на новые статьи по RSS… (кто не знает, что такое RSS – можете посмотреть здесь>>) .

Если информация показалась Вам интеесной и полезной -  поддержите наш блог в рейтинге лучших финансовых блогов. Заодно посмотрите, о чём пишут другие трейдеры.

Рубрики: FinLab

Комментариев: 3

  1. Евгений пишет:

    Информация очень интересна . Но уже 1.04.2011. Где продолжение ? Или всё куда то переехало ? В общих чертах принцип работы программы понятен – В Вэлсе и ТСлабе плюс минус похожий принцип . Но для человека не знакомого с программированием без пошагового объяснения не обойтись. Жду с нетерпением ответа ,или продолжения Ваших замечательных УРОКОВ.

  2. pdv_vrn пишет:

    Евгений никто ни куда не переезжал. Для написание кода необходимы навыки программирования, что можно найти в интернете. Здесь более конкретные вещи описаны. Уроки будут продолжаться следите за лентой новостей по RSS

  3. Евгений пишет:

    У меня вопрос по тексту – ” Внимание! Заявки выставляются только по фьючерсу”. Означает ли это что FinLab.MTS полностью заточена под фьючерсы и под СПОТ рынок её перестроить не удастся ? Например нужно запрограммировать на спекулятивную торговлю 10-ю разными инструментами на фондовом рынке ММВБ.

Оставить комментарий