def parse_market_prices(mkt): return {'market_id': mkt.get('Id'), 'market_name': mkt.get('Name'), 'market_type': MarketType(int(mkt.get('Type'))).name if mkt.get('Type') else None, 'market_start_time': make_tz_naive(mkt.get('StartTime')), 'runners': [parse_runner_prices(runner) for runner in mkt.get('Selections', [])], 'is_play_market': mkt.get('IsPlayMarket'), 'status': MarketStatus(int(mkt.get('Status'))).name if mkt.get('Status') else None, 'number_of_winners': floatify(mkt.get('NumberOfWinningSelections')), 'withdrawal_sequence_number': mkt.get('WithdrawalSequenceNumber'), 'market_display_order': mkt.get('DisplayOrder'), 'enabled_for_multiples': mkt.get('IsEnabledForMultiples'), 'in_play_available': mkt.get('IsInRunningAllowed'), 'race_grade': mkt.get('RaceGrade'), 'managed_in_running': mkt.get('IsManagedWhenInRunning'), 'in_play': mkt.get('IsCurrentlyInRunning'), 'in_running_delay': mkt.get('InRunningDelaySeconds'), 'event_id': mkt.get('EventClassifierId'), 'market_total_matched': floatify(mkt.get('TotalMatchedAmount')), 'place_payout': floatify(mkt.get('PlacePayout')), 'market_back_matched': floatify(mkt.get('MatchedMarketForStake')), 'market_lay_matched': floatify(mkt.get('MatchedMarketAgainstStake')), 'home_team_score': mkt.get('HomeTeamScore'), 'away_team_score': mkt.get('AwayTeamScore'), 'score_type': mkt.get('ScoreType'), }
def parse_orders_receipt(order): return { 'order_id': order.get('OrderHandle'), 'side': Polarity(int(order.get('Polarity'))).name if order.get('Polarity') else None, 'size_remaining': floatify(order.get('UnmatchedStake')), 'matched_price': floatify(order.get('MatchedPrice')), 'matched_size': floatify(order.get('MatchedStake')), 'matched_lay_size': floatify(order.get('MatchedAgainstStake')), 'sent_time': make_tz_naive(order.get('IssuedAt')), 'status': OrderStatus(int(order.get('Status'))) if order.get('Status') else None, 'runner_sequence_number': order.get('SequenceNumber'), 'runner_id': order.get('SelectionId'), 'customer_reference': order.get('PunterReferenceNumber'), 'return_code': order.get('ReturnCode'), }
def parse_trade_item(trade): trd = trade.get('TradeItems', {}) return { 'traded_time': make_tz_naive(trd.get('occurredAt')), 'price': floatify(trd.get('price')), 'size': floatify(trd.get('backersStake')), 'side': Polarity(int(trd.get('tradeType'))).name if trd.get('tradeType') else None, }
def parse_market_withdrawal(data): return { 'runner_id': data.get('SelectionId'), 'withdrawal_time': make_tz_naive(data.get('WithdrawalTime')), 'sequence_number': data.get('SequenceNumber'), 'reduction_factor': floatify(data.get('ReductionFactor')), 'compound_reduction_factor': floatify(data.get('CompoundReductionFactor')), }
def parse_account_balance(bal): return { 'currency': bal.get('Currency'), 'available_funds': floatify(bal.get('AvailableFunds')), 'balance': floatify(bal.get('Balance')), 'credit': floatify(bal.get('Credit')), 'exposure': floatify(bal.get('Exposure')), }
def parse_runners(data): return {'runner_id': data.get('Id'), 'runner_name': data.get('Name'), 'runner_status': SelectionStatus(int(data.get('Status'))).name if data.get('Status') else None, 'reset_count': data.get('ResetCount'), 'deduction_factor': floatify(data.get('DeductionFactor')), 'runner_display_order': data.get('DisplayOrder')}
def parse_account_postings(posts): return { 'postings_complete': posts.get('HaveAllPostingsBeenReturned'), 'currency': posts.get('Currency'), 'available_funds': floatify(posts.get('AvailableFunds')), 'balance': floatify(posts.get('Balance')), 'credit': floatify(posts.get('Credit')), 'exposure': floatify(posts.get('Exposure')), 'transactions': [{ 'transaction_time': make_tz_naive(order.get('PostedAt')), 'description': order.get('Description'), 'amount': floatify(order.get('Amount')), 'resulting_balance': floatify(order.get('ResultingBalance')), 'transaction_category': order.get('PostingCategory'), 'order_id': order.get('OrderId'), 'market_id': order.get('MarketId'), 'transaction_id': order.get('TransactionId') } for order in posts.get('Orders', {}).get('Order', []) if posts.get('Orders')] } if posts.get('Orders') and posts.get('Orders', {}).get('Order', []) else {}
def parse_runner_book(book): back_levels = [] lay_levels = [] order_book = {'batb': [], 'batl': []} for level in book: for side, order in level.items(): if order: side = price_side_map.get(side) if side == 'back': bisect.insort(back_levels, floatify(order.get('Price'))) order_book['batb'].append([ floatify(order.get('Price')), floatify(order.get('Stake')) ]) elif side == 'lay': bisect.insort_right(lay_levels, floatify(order.get('Price'))) order_book['batl'].append([ floatify(order.get('Price')), floatify(order.get('Stake')) ]) back_levels.reverse() order_book['batb'] = [[back_levels.index(x[0]), x[0], x[1]] for x in order_book['batb']] order_book['batl'] = [[lay_levels.index(x[0]), x[0], x[1]] for x in order_book['batl']] return order_book
def parse_market(mkt_data, other_info): return [{ **{ 'runners': [ parse_runners(runner) for runner in mkt.get('Selections', []) ], 'market_id': mkt.get('Id'), 'market_name': mkt.get('Name'), 'market_type': MarketType(int(mkt.get('Type'))).name if mkt.get('Type') else None, 'is_play_market': mkt.get('IsPlayMarket'), 'market_status': MarketStatus(int(mkt.get('Status'))).name if mkt.get('Status') else None, 'number_of_winners': mkt.get('NumberOfWinningSelections'), 'market_start_time': make_tz_naive(mkt.get('StartTime')), 'withdrawal_sequence_number': mkt.get('WithdrawalSequenceNumber'), 'market_display_order': mkt.get('DisplayOrder'), 'enabled_for_multiples': mkt.get('IsEnabledForMultiples'), 'in_play_available': mkt.get('IsInRunningAllowed'), 'race_grade': mkt.get('RaceGrade'), 'managed_in_running': mkt.get('IsManagedWhenInRunning'), 'in_play': mkt.get('IsCurrentlyInRunning'), 'in_play_delay': mkt.get('InRunningDelaySeconds'), 'event_id': mkt.get('EventClassifierId'), 'place_payout': floatify(mkt.get('PlacePayout')) }, **other_info } for mkt in mkt_data]
def parse_ladder(data): return [ {'price': floatify(ol.get('price')), 'value': ol.get('representation')} for ol in data]
def parse_runner_prices(runner): return { 'runner_book': parse_runner_book(runner.get('_value_1', [])), 'runner_id': runner.get('Id'), 'runner_name': runner.get('Name'), 'runner_status': SelectionStatus(int(runner.get('Status'))).name if runner.get('Status') else None, 'runner_reset_count': floatify(runner.get('ResetCount')), 'deduction_factor': floatify(runner.get('DeductionFactor')), 'runner_back_matched_size': floatify(runner.get('MatchedSelectionForStake')), 'runner_lay_matched_size': floatify(runner.get('MatchedSelectionAgainstStake')), 'runner_last_matched_time': make_tz_naive(runner.get('LastMatchedOccurredAt')), 'runner_last_matched_price': floatify(runner.get('LastMatchedPrice')), 'runner_last_matched_back_size': floatify(runner.get('LastMatchedForSideAmount')), 'runner_last_matched_lay_size': floatify(runner.get('LastMatchedAgainstSideAmount')), 'runner_open_interest': floatify(runner.get('SelectionOpenInterest')), 'runner_market_winnings': floatify(runner.get('MarketWinnings')), 'runner_positive_winnings': floatify(runner.get('MarketPositiveWinnings')), 'runner_back_matched_same_price': floatify(runner.get('MatchedForSideAmountAtSamePrice')), 'runner_lay_matched_same_price': floatify(runner.get('MatchedAgainstSideAmountAtSamePrice')), 'runner_last_traded_same_price': make_tz_naive(runner.get('FirstMatchAtSamePriceOccurredAt')), 'runner_total_matched_orders': floatify(runner.get('NumberOrders')), 'runner_total_matched_punters': floatify(runner.get('NumberPunters')), }
def parse_orders(order): return { 'order_id': order.get('Id'), 'commission_information': { 'gross_settlement_amount': floatify( order.get('OrderCommissionInformation', {}).get('GrossSettlementAmount')) if order.get( 'OrderCommissionInformation', {}).get('GrossSettlementAmount') else None, 'commission': floatify( order.get('OrderCommissionInformation', {}).get('OrderCommission')) if order.get( 'OrderCommissionInformation', {}).get('OrderCommission') else None, } if order.get('OrderCommissionInformation') else {}, 'runner_id': order.get('SelectionId'), 'market_id': order.get('MarketId'), 'sequence_number': order.get('SequenceNumber'), 'status': OrderStatus(int(order.get('Status'))).name if order.get('Status') else None, 'side': Polarity(int(order.get('Polarity'))).name if order.get('Polarity') else None, 'sent_time': make_tz_naive(order.get('IssuedAt')), 'price': floatify(order.get('RequestedPrice')), 'remaining_size': floatify(order.get('UnmatchedStake')), 'average_price': floatify(order.get('AveragePrice')), 'matched_price': floatify(order.get('MatchedPrice')), 'matched_size': floatify(order.get('MatchedStake')), 'matched_lay_size': floatify(order.get('MatchedAgainstStake')), 'back_take_size': floatify(order.get('TotalForSideTakeStake ')), 'back_make_size': floatify(order.get('TotalForSideMakeStake')), 'customer_reference': order.get('PunterReferenceNumber'), 'withdrawal_sequence_number': order.get('ExpectedWithdrawalSequenceNumber'), 'runner_reset_count': order.get('ExpectedSelectionResetCount'), 'in_play': order.get('IsCurrentlyInRunning'), 'order_fill_type': OrderKillType(int(order.get('OrderFillType'))).name if order.get('OrderFillType') else None, 'fill_or_kill_threshold': order.get('FillOrKillThreshold'), 'cancel_on_in_running': order.get('CancelOnInRunning'), 'cancel_if_selection_reset': order.get('CancelIfSelectionReset'), 'commission_base_rate': floatify(order.get('PunterCommissionBasis')), 'commission_take_rate': floatify(order.get('TakeCommissionRate')), 'commission_make_rate': floatify(order.get('MakeCommissionRate')), }
def parse_suspended_order(suspend): return { 'order_id': suspend.get('OrderId'), 'size_suspended': floatify(suspend.get('SuspendedForSideStake')), 'customer_reference': suspend.get('PunterReferenceNumber'), }
def parse_single_order(order): return { 'order_id': order.get('Id'), 'settlement_information': { 'gross_settlement_amount': floatify( order.get('OrderCommissionInformation', {}).get('GrossSettlementAmount')) if order.get('OrderCommissionInformation') else None, 'order_commission': floatify( order.get('OrderCommissionInformation', {}).get('OrderCommission')) if order.get('OrderCommissionInformation') else None, 'market_commission': floatify( order.get('OrderCommissionInformation', {}).get('MarketCommission')) if order.get('OrderCommissionInformation') else None, 'settlement_time': make_tz_naive( order.get('OrderCommissionInformation', {}).get('MarketSettledDate')) if order.get('OrderCommissionInformation') else None, }, 'audit_log': [{ 'timestamp': make_tz_naive(log.get('Time')), 'matched_size': floatify( log.get('MatchedOrderInformation', {}).get('MatchedStake')) if log.get('MatchedOrderInformation') else None, 'matched_lay_size': floatify( log.get('MatchedOrderInformation', {}).get('MatchedAgainstStake')) if log.get('MatchedOrderInformation') else None, 'matched_price': floatify( log.get('MatchedOrderInformation', {}).get('PriceMatched')) if log.get('MatchedOrderInformation') else None, 'matched_order_id': log.get('MatchedOrderInformation', {}).get('MatchedOrderID') if log.get('MatchedOrderInformation') else None, 'maker': log.get('MatchedOrderInformation', {}).get('WasMake') if log.get('MatchedOrderInformation') else None, 'order_commission': floatify( log.get('CommissionInformation', {}).get('OrderCommission')), 'gross_settlement_amount': floatify( log.get('CommissionInformation', {}).get('GrossSettlementAmount')), 'order_action': OrderActionType(int(log.get('OrderActionType'))).name, 'requested_size': floatify(log.get('RequestedStake')), 'total_size': floatify(log.get('TotalStake')), 'total_lay_size': floatify(log.get('TotalAgainstStake')), 'requested_price': floatify(log.get('RequestedPrice')), 'average_price': floatify(log.get('AveragePrice')), } for log in order.get('AuditLog', {}).get('AuditLog', [])], 'runner_id': order.get('SelectionId'), 'market_id': order.get('MarketId'), 'status': OrderStatus(int(order.get('OrderStatus'))).name if order.get('OrderStatus') else None, 'in_play': order.get('IsCurrentlyInRunning'), 'market_status': MarketStatus(int(order.get('MarketStatus'))).name if order.get('MarketStatus') else None, 'sent_time': make_tz_naive(order.get('IssuedAt')), 'last_update_time': make_tz_naive(order.get('LastChangedAt')), 'expiry_time': make_tz_naive(order.get('ExpiresAt')), 'valid_from': make_tz_naive(order.get('ValidFrom')), 'order_fill_type': OrderKillType(int(order.get('OrderFillType'))).name if order.get('OrderFillType') else None, 'fill_or_kill_threshold': floatify(order.get('FillOrKillThreshold')), 'requested_size': floatify(order.get('RequestedStake')), 'requested_price': floatify(order.get('RequestedPrice')), 'expected_selection_reset_count': order.get('ExpectedSelectionResetCount'), 'total_size': floatify(order.get('TotalStake')), 'remaining_size': floatify(order.get('UnmatchedStake')), 'matched_size': floatify(order.get('MatchedStake')), 'matched_lay_stake': floatify(order.get('MatchedAgainstStake')), 'matched_price': floatify(order.get('MatchedPrice')), 'average_price': floatify(order.get('AveragePrice')), 'matching_time': make_tz_naive(order.get('MatchingTimeStamp')), 'side': Polarity(int(order.get('Polarity'))) if order.get('Polarity') else None, 'withdrawal_reprice_option': order.get('WithdrawalRepriceOption'), 'cancel_on_in_running': order.get('CancelOnInRunning'), 'cancel_if_selection_reset': order.get('CancelIfSelectionReset'), 'sequence_number': order.get('SequenceNumber'), 'customer_reference': order.get('PunterReferenceNumber'), 'market_type': order.get('MarketType'), 'expected_withdrawal_sequence_number': order.get('ExpectedWithdrawalSequenceNumber'), }
def parse_cancelled_order(cancel): return { 'order_id': cancel.get('OrderHandle'), 'size_cancelled': floatify(cancel.get('cancelledForSideStake')), 'customer_reference': cancel.get('PunterReferenceNumber'), }