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 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 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 HistoryTick(Trade): """ Тиковые исторические данные, получаемые после команды subscribe_ticks. Дублирует Trade. Разница только в возможности получать старые сделки. """ ROOT_NAME = 'tick' secid = IntegerField('secid') time = DateTimeField('trade_time', TIME_FORMAT)
class NewsHeader(MyXmlObject): """ Новостной заголовок. """ ROOT_NAME = 'news_header' id = IntegerField('id') time = DateTimeField('timestamp', TIME_FORMAT) source = StringField('source') title = StringField('title')
class Balance(LedgerXML): """https://github.com/dimagi/commcare-core/wiki/ledgerxml#balance-transactions """ ROOT_NAME = REPORT_TYPE_BALANCE ROOT_NS = COMMTRACK_REPORT_XMLNS entity_id = StringField('@entity-id', required=True) date = DateTimeField('@date', required=True) section_id = StringField('@section-id', required=False) entry = NodeField('entry', Entry, required=True)
class Transfer(LedgerXML): """https://github.com/dimagi/commcare-core/wiki/ledgerxml#transfer-transactions """ ROOT_NAME = REPORT_TYPE_TRANSFER ROOT_NS = COMMTRACK_REPORT_XMLNS src = StringField('@src', required=False) dest = StringField('@dest', required=False) date = DateTimeField('@date', required=True) type = StringField('@type', required=False) section_id = StringField('@section-id', required=False) entry = NodeField('entry', Entry, required=True)
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 TextMessage(Entity): """ Текстовые сообщения, которые можно передавать через Транзак. """ ROOT_NAME = 'message' # Дата id = date = DateTimeField('date', TIME_FORMAT) # Срочность urgent = SimpleBooleanField('urgent', 'Y', 'N') # Отправитель sender = StringField('from') # Содержимое text = StringField('text')
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 StopLoss(StopOrder): """Стоп лосс оредер""" # Использование кредита use_credit = SimpleBooleanField('stoploss/@usecredit', 'yes', 'no') # Цена активации activation_price = FloatField('stoploss/activationprice') # Рыночное исполнение bymarket = ItemField('bymarket') # Защитное время удержания цены # (когда цены на рынке лишь кратковременно достигают уровня цены активации, # и вскоре возвращаются обратно) guard_time = DateTimeField('stoploss/guardtime', TIME_FORMAT) # Примечание broker_ref = StringField('stoploss/brokerref') # Количество лотов quantity = IntegerField('stoploss/quantity') # Цена исполнения (отменяет bymarket) price = FloatField('stoploss/orderprice')
class ClientTrade(Entity): """ Клиентская сделка (т.е. успешно выполненная заявка). """ ROOT_NAME = 'trade' # Id бумаги secid = IntegerField('secid') # Номер сделки на бирже id = trade_no = IntegerField('tradeno') # Номер заявки на бирже order_no = IntegerField('orderno') # Идентификатор борда board = StringField('board') # Код инструмента seccode = StringField('seccode') # Идентификатор клиента client = StringField('client') # B - покупка, S - продажа buysell = StringField('buysell', choices=('B', 'S')) # Время сделки time = DateTimeField('time', TIME_FORMAT) # Примечание broker_ref = StringField('brokerref') # Объем сделки value = FloatField('value') # Комиссия commission = FloatField('comission') # Цена price = FloatField('price') # Кол-во инструмента в сделках в штуках items = IntegerField('items') # Количество лотов quantity = IntegerField('quantity') # Доходность yld = IntegerField('yield') # НКД accrued_int = FloatField('accruedint') # тип сделки: ‘T’ – обычная ‘N’ – РПС ‘R’ – РЕПО ‘P’ – размещение trade_type = StringField('tradetype', choices=('T', 'N', 'R', 'P')) # Код поставки settle_code = StringField('settlecode') # Текущая позиция по инструменту current_position = IntegerField('currentpos')
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'))
def CustomDateTimeField(*args, **kwargs): # As of at least CommCare 2.20, the phone does not parse microseconds # in this particular handler (though it does everywhere else). # For now, we're going to continue sending down without microseconds return DateTimeField(format='%Y-%m-%dT%H:%M:%SZ', *args, **kwargs)
class Quotation(Entity): """ Котировки по инструменту. """ ROOT_NAME = 'quotation' id = secid = IntegerField('@secid') # Идентификатор режима торгов по умолчанию board = StringField('board') # Код инструмента seccode = StringField('seccode') # Стоимость пункта цены point_cost = FloatField('point_cost') # НКД на дату торгов в расчете на одну бумагу, руб. accrued = FloatField('accruedintvalue') # Цена первой сделки open = FloatField('open') # Средневзвешенная цена waprice = FloatField('waprice') # Кол-во лотов на покупку по лучшей цене bid_depth = IntegerField('biddepth') # Совокупный спрос demand = IntegerField('biddeptht') # Заявок на покупку numbids = IntegerField('numbids') # Кол-во лотов на продажу по лучшей цене offer_depth = IntegerField('offerdepth') # Совокупное предложение suply = IntegerField('offerdeptht') # Заявок на продажу numoffers = IntegerField('numoffers') # Лучшая котировка на покупку best_bid = FloatField('bid') # Лучшая котировка на продажу best_offer = FloatField('offer') # Кол-во сделок numtrades = IntegerField('numtrades') # Объем совершенных сделок в лотах volume_today = IntegerField('voltoday') # Общее количество открытых позиций(FORTS) open_positions = IntegerField('openpositions') # Изм.открытых позиций(FORTS) delta_positions = IntegerField('deltapositions') # Цена последней сделки last_price = FloatField('last') # Время заключения последней сделки last_time = DateTimeField('time', TIME_FORMAT) # Объем последней сделки, в лотах last_quantity = IntegerField('quantity') # Изменение цены последней сделки по отношению к цене # последней сделки предыдущего торгового дня change = FloatField('change') # Цена последней сделки к оценке предыдущего дня change_wa = FloatField('priceminusprevwaprice') # Объем совершенных сделок, млн. руб value_today = FloatField('valtoday') # Доходность, по цене последней сделки yld = FloatField('yield') # Доходность по средневзвешенной цене yld_wa = FloatField('yieldatwaprice') # Рыночная цена по результатам торгов сегодняшнего дня market_price_today = FloatField('marketpricetoday') # Наибольшая цена спроса в течение торговой сессии highest_bid = FloatField('highbid') # Наименьшая цена предложения в течение торговой сессии lowest_offer = FloatField('lowoffer') # Максимальная цена сделки high = FloatField('high') # Минимальная цена сделки low = FloatField('low') # Цена закрытия close = FloatField('closeprice') # Доходность по цене закрытия close_yld = FloatField('closeyield') # Статус «торговые операции разрешены/запрещены» status = StringField('status') # Состояние торговой сессии по инструменту trade_status = StringField('tradingstatus') # ГО покупок/покр buy_deposit = FloatField('buydeposit') # ГО продаж/непокр sell_deposit = FloatField('selldeposit') # Волатильность volatility = FloatField('volatility') # Теоретическая цена theory_price = FloatField('theoreticalprice')
def CustomDateTimeField(*args, **kwargs): return DateTimeField(format='%Y-%m-%dT%H:%M:%SZ', *args, **kwargs)