class Order(BaseOrder): """Базовый класс ордера""" ROOT_NAME = 'order' # Биржевой номер заявки origin_order_no = IntegerField('origin_orderno') # Объем заявки в валюте инструмента value = FloatField('value') # НКД accrued_int = FloatField('accruedint') # Код поставки (значение биржи, определяющее правила расчетов) settle_code = StringField('settlecode') # Неудовлетворенный остаток объема заявки в лотах (контрактах) balance = IntegerField('balance') # Скрытое количество в лотах hidden = IntegerField('hidden') # Доходность yld = IntegerField('yield') # Условие condition = StringField('condition') # Цена для условной заявки, либо обеспеченность в процентах condition_value = FloatField('conditionvalue') # С какого момента времени действительна valid_after = DateTimeField('valid_after', TIME_FORMAT) # Максимальная комиссия по сделкам заявки max_commission = FloatField('maxcomission')
class SecInfoUpdate(Entity): """ Обновление информации по инструменту. """ ROOT_NAME = 'sec_info_upd' secid = IntegerField('secid') # Код инструмента seccode = StringField('seccode') # Идентификатор рынка market = IntegerField('market') # Минимальная цена (только FORTS) minprice = FloatField('minprice') # Максимальная цена (только FORTS) maxprice = FloatField('maxprice') # ГО покупателя (фьючерсы FORTS, руб.) buy_deposit = FloatField('buy_deposit') # ГО продавца (фьючерсы FORTS, руб.) sell_deposit = FloatField('sell_deposit') # ГО покрытой позиции (опционы FORTS, руб.) bgo_c = FloatField('bgo_c') # ГО непокрытой позиции (опционы FORTS, руб.) bgo_nc = FloatField('bgo_nc') # Базовое ГО под покупку маржируемого опциона bgo_buy = FloatField('bgo_buy') # Стоимость пункта цены point_cost = FloatField('point_cost')
class Security(Entity): """ Ценная бумага. """ ROOT_NAME = 'security' id = secid = IntegerField('@secid') active = SimpleBooleanField('@active', 'true', 'false') # Код инструмента seccode = StringField('seccode') # Тип бумаги sectype = StringField('sectype') # Идентификатор режима торгов по умолчанию board = StringField('board') # Идентификатор рынка market = IntegerField('market') # Наименование бумаги name = StringField('shortname') # Количество десятичных знаков в цене decimals = IntegerField('decimals') # Шаг цены minstep = FloatField('minstep') # Размер лота lotsize = IntegerField('lotsize') # Стоимость пункта цены point_cost = FloatField('point_cost') # Имя таймзоны инструмента timezone = StringField('sec_tz') # Флаги фичей credit_allowed = SimpleBooleanField('opmask/@usecredit', 'yes', 'no') bymarket_allowed = SimpleBooleanField('opmask/@bymarket', 'yes', 'no') nosplit_allowed = SimpleBooleanField('opmask/@nosplit', 'yes', 'no') immediate_allowed = SimpleBooleanField('opmask/@immorcancel', 'yes', 'no') cancelbalance_allowed = SimpleBooleanField('opmask/@cancelbalance', 'yes', 'no')
class CandleKind(Entity): """ Периоды свечек. """ ROOT_NAME = 'kind' id = IntegerField('id') name = StringField('name') period = IntegerField('period')
class Schedule(XmlObject): ROOT_NAME = 'schedule' starts = IntegerField('@starts') expires = IntegerField('@expires') allow_unscheduled = StringField('@allow_unscheduled') visits = NodeListField('visit', ScheduleFixtureVisit)
class _Security(MyXmlObject): # Id инструмента secid = IntegerField('@secid') # Id рынка market = IntegerField('market') # Обозначение инструмента seccode = StringField('seccode') # Текущая цена price = FloatField('price') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') # Вклад бумаги в плановое обеспечение cover = FloatField('cover') # Плановая начальная маржа (риск) init_margin = FloatField('init_margin') # Cтавка риска для лонгов riskrate_long = FloatField('riskrate_long') # Cтавка риска для шортов riskrate_short = FloatField('riskrate_short') # Прибыль/убыток по входящим позициям pnl_income = FloatField('pnl_income') # Прибыль/убыток по сделкам pnl_intraday = FloatField('pnl_intraday') # Максимальная покупка, в лотах max_buy = IntegerField('maxbuy') # Макcимальная продажа, в лотах max_sell = IntegerField('maxsell') class _ValuePart(MyXmlObject): # Входящая позиция, штук register = StringField('@register') # Входящая позиция, штук open_balance = IntegerField('open_balance') # Куплено, штук bought = IntegerField('bought') # Продано, штук sold = IntegerField('sold') # Исполнено settled = IntegerField('settled') # Текущая позиция, штук balance = IntegerField('balance') # Заявлено купить, штук buying = IntegerField('buying') # Заявлено продать, штук selling = IntegerField('selling') value_parts = NodeListField('value_part', _ValuePart)
class ScheduleFixtureVisit(IdNode): ROOT_NAME = 'visit' due = IntegerField('@due') starts = IntegerField('@starts') expires = IntegerField('@expires') repeats = StringField('@repeats') increment = IntegerField('@increment')
class _Security(MyXmlObject): # Id бумаги secid = IntegerField('@secid') # Внутренний код рынка market = IntegerField('market') # Код инструмента seccode = StringField('seccode') # Максимум купить (лотов) max_buy = IntegerField('maxbuy') # Максимум продать (лотов) max_sell = IntegerField('maxsell')
class SecurityPit(MyXmlObject): """ Питы - параметры инструмента в нестандартных режимах торгов. """ ROOT_NAME = 'pit' board = StringField('@board') seccode = StringField('@seccode') market = IntegerField('market') decimals = IntegerField('decimals') minstep = FloatField('minstep') lotsize = IntegerField('lotsize') point_cost = FloatField('point_cost')
class HistoryCandle(Entity): """ Свечки OHLCV (open,high,low,close). """ ROOT_NAME = 'candle' date = DateTimeField('@date', TIME_FORMAT) id = hash(date) open = FloatField('@open') high = FloatField('@high') low = FloatField('@low') close = FloatField('@close') volume = IntegerField('@volume') # только ФОРТС open_interest = IntegerField('@oi')
class HistoryCandlePacket(Packet): """ Пакет свечек |||. """ ROOT_NAME = 'candles' # Идентификатор бумаги (постоянный внутри сессии) secid = IntegerField('@secid') # Борда (режим торгов) board = StringField('@board') # Тикер бумаги (постоянный) seccode = StringField('@seccode') # Параметр "status" показывает, осталась ли еще история status = IntegerField('@status') period = IntegerField('@period') items = NodeListField('candle', HistoryCandle)
class TakeProfit(StopOrder): """Тейк профит ордер""" # Цена активации activation_price = FloatField('takeprofit/activationprice') # Защитное время удержания цены # (когда цены на рынке лишь кратковременно достигают уровня цены активации, # и вскоре возвращаются обратно) guard_time = DateTimeField('takeprofit/guardtime', TIME_FORMAT) # Достигнутый максимум extremum = FloatField('takeprofit/extremum') # Уровень исполнения? level = FloatField('takeprofit/level') # Коррекция # Позволяет выставить на Биржу заявку, # закрывающую позицию в момент окончания тренда на рынке. correction = FloatField('takeprofit/correction') # Защитный спрэд # Для определения цены заявки, исполняющей TP на покупку, # защитный спрэд прибавляется к цене рынка. # Для определения цены заявки, исполняющей TP на продажу, # защитный спрэд вычитается из цены рынка. guard_spread = FloatField('takeprofit/guardspread') # Примечание broker_ref = StringField('takeprofit/brokerref') # Количество лотов quantity = IntegerField('takeprofit/quantity')
class ClientPosition(Entity): """ Базовый класс позиции по инструменту. """ # Идентификатор клиента client = StringField('client') # Внутренний код рынка market = IntegerField('market') # Регистр учета register = StringField('register') # Наименование вида средств name = StringField('shortname') # Код вида средств asset = StringField('asset') # Входящий остаток saldo_in = FloatField('saldoin') # Текущее сальдо saldo = FloatField('saldo') # Куплено bought = FloatField('bought') # Продано sold = FloatField('sold') # В заявках на покупку order_buy = FloatField('ordbuy') # В заявках на продажу order_sell = FloatField('ordsell')
class NewsBody(MyXmlObject): """ Тело новости. """ ROOT_NAME = 'news_body' id = IntegerField('id') text = StringField('text')
class CmdResult(MyXmlObject): """ Результат отправки команды (но не исполнения на серваке). """ ROOT_NAME = 'result' success = SimpleBooleanField('@success', 'true', 'false') text = StringField('message') id = IntegerField('@transactionid')
class HistoryTick(Trade): """ Тиковые исторические данные, получаемые после команды subscribe_ticks. Дублирует Trade. Разница только в возможности получать старые сделки. """ ROOT_NAME = 'tick' secid = IntegerField('secid') time = DateTimeField('trade_time', TIME_FORMAT)
class Entry(LedgerXML): ROOT_NAME = 'entry' id = StringField('@id', required=True) section_id = StringField('@section-id', required=False) quantity = IntegerField('@quantity', required=True) value = NodeField('value', Value, required=False)
class SecInfo(Entity): """ Доп. информация по инструменту. """ ROOT_NAME = 'sec_info' id = secid = IntegerField('@secid') # Полное наименование инструмента secname = StringField('secname') # Код инструмента seccode = StringField('seccode') # Идентификатор рынка market = IntegerField('market') # Единицы измерения цены pname = StringField('pname') # Дата погашения mat_date = DateTimeField('mat_date', TIME_FORMAT) # Цена последнего клиринга (только FORTS) clearing_price = FloatField('clearing_price') # Минимальная цена (только FORTS) minprice = FloatField('minprice') # Максимальная цена (только FORTS) maxprice = FloatField('maxprice') # ГО покупателя (фьючерсы FORTS, руб.) buy_deposit = FloatField('buy_deposit') # ГО продавца (фьючерсы FORTS, руб.) sell_deposit = FloatField('sell_deposit') # ГО покрытой позиции (опционы FORTS, руб.) bgo_c = FloatField('bgo_c') # ГО непокрытой позиции (опционы FORTS, руб.) bgo_nc = FloatField('bgo_nc') # Текущий НКД, руб accruedint = FloatField('accruedint') # Размер купона, руб coupon_value = FloatField('coupon_value') # Дата погашения купона coupon_date = DateTimeField('coupon_date', TIME_FORMAT) # Период выплаты купона, дни coupon_period = IntegerField('coupon_period') # Номинал облигации или акции, руб facevalue = FloatField('facevalue') # Тип опциона Call(C)/Put(P) put_call = StringField('put_call', choices=('C', 'P')) # Маржинальный(M)/премия(P) opt_type = StringField('opt_type', choices=('M', 'P')) # Количество базового актива (FORTS) lot_volume = IntegerField('lot_volume')
class StopOrder(BaseOrder): """Стоп заявка""" ROOT_NAME = 'stoporder' # номер заявки Биржевой регистрационный номер заявки, # выставленной на рынок в результате исполнения cтопа order_no = IntegerField('activeorderno') # Идентификатор трейдера, который отменил стоп canceller = StringField('canceller') # Биржевой регистрационный номер сделки, # явившейся основанием для перехода стопа в текущее состояние alltrade_no = IntegerField('alltradeno') # Афтар заявки author = StringField('author') # Привязка к стандартной заявке linked_order_no = IntegerField('linkedorderno') # У стопов почему то нет времени активации time = None
class Board(Entity): """ Режим торгов (борда). Сочетание типа торгов и рынка. TQBR - T+ для акций. """ ROOT_NAME = 'board' # Идентификатор режима торгов id = StringField('@id') # Наименование режима торгов name = StringField('name') # Внутренний код рынка # 1 - ММВБ market = IntegerField('market') # Тип режима торгов 0=FORTS, 1=Т+, 2=Т0 type = IntegerField('type') def __str__(self): return self.name
class NewsHeader(MyXmlObject): """ Новостной заголовок. """ ROOT_NAME = 'news_header' id = IntegerField('id') time = DateTimeField('timestamp', TIME_FORMAT) source = StringField('source') title = StringField('title')
class Entity(MyXmlObject): """ Абстрактный класс сущностей, имеет идентификатор. """ # Entity id, unique in the same class id = IntegerField('@id') def __eq__(self, other): return isinstance(self, type(other)) and self.id == other.id
class SecurityPosition(ClientPosition): """Клиентская позиция""" ROOT_NAME = 'sec_position' # Код инструмента id = secid = IntegerField('secid') # Код инструмента seccode = asset = StringField('seccode') # Неснижаемый остаток saldo_min = FloatField('saldomin')
class AbstractResource(OrderedXmlObject): ORDER = ('id', 'version', 'local', 'remote') LOCATION_TEMPLATE = 'resource/location[@authority="%s"]' local = StringField(LOCATION_TEMPLATE % 'local', required=True) remote = StringField(LOCATION_TEMPLATE % 'remote', required=True) version = IntegerField('resource/@version') id = StringField('resource/@id') descriptor = StringField('resource/@descriptor')
class MarketOrderAbility(MyXmlObject): """ Возможность рыночных заявок. """ ROOT_NAME = 'marketord' # Id бумаги secid = IntegerField('@secid') # Код бумаги seccode = StringField('@seccode') # Флаг доступности permitted = SimpleBooleanField('@permit', 'yes', 'no')
class Quote(Entity): """ Глубина рынка по инструменту. """ ROOT_NAME = 'quote' id = secid = IntegerField('@secid') # Идентификатор режима торгов по умолчанию board = StringField('board') # Код инструмента seccode = StringField('seccode') # Цена price = FloatField('price') # Источник котировки (маркетмейкер) source = StringField('source') # Доходность облигаций yld = IntegerField('yield') # Количество бумаг к покупке buy = IntegerField('buy') # Количество бумаг к продаже sell = IntegerField('sell')
class BaseOrder(Entity): """ Базовый класс ордеров (обычных и стопов) с общими аттрибутами. """ # идентификатор транзакции сервера Transaq id = IntegerField('@transactionid') # Биржевой номер заявки order_no = IntegerField('orderno') # идентификатор бумаги secid = IntegerField('secid') # Идентификатор борда board = StringField('board') # Код инструмента seccode = StringField('seccode') # Цена price = FloatField('price') # Время регистрации заявки биржей time = DateTimeField('time', TIME_FORMAT) # Идентификатор клиента client = StringField('client') # Cтатус заявки status = StringField('status') # Покупка (B) / Продажа (S) buysell = StringField('buysell', choices=('B', 'S')) # Дата экспирации (только для ФОРТС) exp_date = DateTimeField('expdate', TIME_FORMAT) # Примечание broker_ref = StringField('brokerref') # Время регистрации заявки сервером Transaq (только для условных заявок) accept_time = DateTimeField('accepttime', TIME_FORMAT) # До какого момента действительно valid_before = DateTimeField('validbefore', TIME_FORMAT) # Количество лотов quantity = IntegerField('quantity') # Время снятия заявки, 0 для активных withdraw_time = DateTimeField('withdrawtime', TIME_FORMAT) withdraw_time.mapper = NullableDateTimeMapper(TIME_FORMAT) # Сообщение биржи в случае отказа выставить заявку result = StringField('result')
class Suite(XmlObject): ROOT_NAME = 'suite' version = IntegerField('@version') xform_resources = NodeListField('xform', XFormResource) locale_resources = NodeListField('locale', LocaleResource) media_resources = NodeListField('locale', MediaResource) details = NodeListField('detail', Detail) entries = NodeListField('entry', Entry) menus = NodeListField('menu', Menu) fixtures = NodeListField('fixture', Fixture)
class Trade(Entity): """ Сделка по инструменту на рынке (внешняя). """ ROOT_NAME = 'trade' secid = IntegerField('@secid') # Наименование борда board = StringField('board') # Код инструмента seccode = StringField('seccode') # Биржевой номер сделки id = trade_no = IntegerField('tradeno') # Время сделки time = DateTimeField('time', TIME_FORMAT) # Цена сделки price = FloatField('price') # Объём в лотах quantity = IntegerField('quantity') # Покупка (B) / Продажа (S) buysell = StringField('buysell', choices=('B', 'S')) open_interest = IntegerField('openinterest') # Период торгов (O - открытие, N - торги, С - закрытие) trade_period = StringField('period', choices=('O', 'N', 'C', 'F', 'B', 'T', 'L'))
class Suite(OrderedXmlObject): ROOT_NAME = 'suite' ORDER = ('version', 'descriptor') version = IntegerField('@version') descriptor = StringField('@descriptor') xform_resources = NodeListField('xform', XFormResource) locale_resources = NodeListField('locale', LocaleResource) media_resources = NodeListField('locale', MediaResource) details = NodeListField('detail', Detail) entries = NodeListField('entry', Entry) menus = NodeListField('menu', Menu) remote_requests = NodeListField('remote-request', RemoteRequest) fixtures = NodeListField('fixture', Fixture)