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_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_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_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_selection_changes(chg): return { 'runner_id': chg.get('Id'), 'runner_name': chg.get('Name'), 'runner_display_order': chg.get('DisplayOrder'), 'runner_hidden': chg.get('IsHidden'), 'runner_status': SelectionStatus(int(chg.get('Status'))) if chg.get('Status') else None, 'reset_count': chg.get('ResetCount'), 'market_id': chg.get('MarketId'), 'withdrawal_factor': chg.get('WithdrawalFactor'), 'sequence_number': chg.get('SelectionSequenceNumber'), 'cancel_orders_time': make_tz_naive(chg.get('CancelOrdersTime')), 'settlement_info': [{'settled_time': make_tz_naive(stl.get('SettlementInformation', {}).get('SettledTime')), 'void_percentage': stl.get('SettlementInformation', {}).get('VoidPercentage'), 'result': stl.get('SettlementInformation', {}).get('SettlementResultString'), 'left_side_percentage': stl.get('SettlementInformation', {}).get('LeftSideFactor'), 'right_side_percentage': stl.get('SettlementInformation', {}).get('RightSideFactor') } for stl in chg.get('_value_1', [])] }
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 process_response(response, date_time_sent, result_target, error_handler=None): """ :param response: Response from request :param date_time_sent: Date time sent :param error_handler: function to parse _raw_elements from zeep response. :param result_target: name of the key to get response data from, changes per endpoint. """ date_time_received = make_tz_naive( response.get('Timestamp')) or datetime.datetime.utcnow() if error_handler and response.get('_raw_elements'): response = error_handler(response) return { 'data': response.get(result_target, []) if result_target else response, 'date_time_sent': date_time_sent, 'date_time_received': date_time_received, }
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_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'), }