def test_format_order_requests_applies_correct_precision_to_price_price_bound_distance(instrument): order_request = OrderRequest(instrument='AUD_USD', price=50.1234567891234, price_bound=1234.123456789, distance=20.123456789) result = _format_order_request(order_request, instrument) for attr in (result.price, result.price_bound, result.distance): if instrument.display_precision == 0: assert re.findall(r'(?<=\.)\d+', str(attr))[0] == '0' else: assert len(re.findall(r'(?<=\.)\d+', str(attr))[0]) == instrument.display_precision
def test_format_order_requests_applies_correct_precision_to_take_profit_on_fill_stop_loss_on_fill(instrument): order_request = OrderRequest(instrument=instrument.name, take_profit_on_fill=50.123456789, stop_loss_on_fill=50.123456789) result = _format_order_request(order_request, instrument) for attr in (result.stop_loss_on_fill.price, result.take_profit_on_fill): if instrument.display_precision == 0: assert re.findall(r'(?<=\.)\d+', str(attr))[0] == '0' else: assert len(re.findall(r'(?<=\.)\d+', str(attr))[0]) == instrument.display_precision
def test_format_order_requests_applies_correct_precision_to_units(instrument): order_request = OrderRequest(instrument=instrument.name, units=50.1234567891234) result = _format_order_request(order_request, instrument) if instrument.trade_units_precision == 0: assert re.findall(r'(?<=\.)\d+', str(result.units))[0] == '0' else: assert len(re.findall(r'(?<=\.)\d+', str(result.units))[0]) == instrument.trade_units_precision order_request = OrderRequest(instrument=instrument.name, units=0.1234567891234) result = _format_order_request(order_request, instrument, clip=True) if instrument.trade_units_precision == 0: assert re.findall(r'(?<=\.)\d+', str(result.units))[0] == '0' else: assert len(re.findall(r'(?<=\.)\d+', str(result.units))[0]) == instrument.trade_units_precision
def test_ins_context_does_not_add_parameters_to_order_requests(instrument): order_request = OrderRequest( instrument=instrument.name, units=instrument.minimum_trade_size ) result = _format_order_request(order_request, instrument, clip=True) assert not hasattr(result, 'price_bound') assert not hasattr(result, 'trailing_stop_loss_on_fill') assert not hasattr(result, 'stop_loss_on_fill') assert not hasattr(result, 'take_profit_on_fill')
def test_format_order_requests_applies_correct_precision_to_trailing_stop_loss_on_fill(instrument): order_request = OrderRequest( instrument=instrument.name, trailing_stop_loss_on_fill=instrument.minimum_trailing_stop_distance + 0.123456789 ) result = _format_order_request(order_request, instrument) attr = result.trailing_stop_loss_on_fill.distance if instrument.display_precision == 0: assert re.findall(r'(?<=\.)\d+', str(attr))[0] == '0' else: assert len(re.findall(r'(?<=\.)\d+', str(attr))[0]) == instrument.display_precision
def test_format_order_requests_accepts_negative_values_for_units(instrument): order_request = OrderRequest( instrument=instrument.name, units=-instrument.minimum_trade_size ) result = _format_order_request(order_request, instrument, clip=False) assert result.units == -instrument.minimum_trade_size result = _format_order_request(order_request, instrument, clip=True) assert result.units == -instrument.minimum_trade_size
def test_format_order_requests_limits_trailing_stop_loss_on_fill_to_valid_range(instrument): order_request = OrderRequest( instrument=instrument.name, trailing_stop_loss_on_fill=0 ) if instrument.minimum_trailing_stop_distance > 0: with pytest.raises(InvalidOrderRequest): _format_order_request(order_request, instrument) result = _format_order_request(order_request, instrument, clip=True) assert result.trailing_stop_loss_on_fill.distance == instrument.minimum_trailing_stop_distance order_request = OrderRequest( instrument=instrument.name, trailing_stop_loss_on_fill=instrument.maximum_trailing_stop_distance + 10 ) with pytest.raises(InvalidOrderRequest): _format_order_request(order_request, instrument) result = _format_order_request(order_request, instrument, clip=True) assert result.trailing_stop_loss_on_fill.distance == instrument.maximum_trailing_stop_distance
def test_format_order_requests_limits_units_to_valid_range(instrument): order_request = OrderRequest( instrument=instrument.name, units=0 ) if instrument.minimum_trade_size > 0: with pytest.raises(InvalidOrderRequest): _format_order_request(order_request, instrument) result = _format_order_request(order_request, instrument, clip=True) assert result.units == instrument.minimum_trade_size order_request = OrderRequest( instrument=instrument.name, units=instrument.maximum_order_units + 10 ) with pytest.raises(InvalidOrderRequest): _format_order_request(order_request, instrument) result = _format_order_request(order_request, instrument, clip=True) assert result.units == instrument.maximum_order_units
async def test_create_request_kwargs(client, server, method, signature, kwargs): await client.initialize() client.format_order_requests = True args = construct_arguments(client, signature, **kwargs) if OrderRequest in args: args.update({OrderRequest: OrderRequest(instrument='AUD_USD', units=1)}) request_kwargs = create_request_kwargs(client, method.endpoint, args) # Make sure args are not empty assert request_kwargs.get('method', 1) assert request_kwargs.get('url', 1) assert request_kwargs.get('headers', 1) assert request_kwargs.get('params', 1) assert request_kwargs.get('json', 1) assert [request_kwargs['method']] in [['POST'], ['GET'], ['PUT'], ['PATCH'], ['DELETE']] auth_in_header = 'Authorization' in request_kwargs.get('headers', '') if Authorization in method.endpoint.parameters: assert auth_in_header else: assert not auth_in_header
def test_format_order_requests_raises_error_when_units_less_than_minimum(instrument): order_request = OrderRequest(instrument='XPT_USD', units=0.123456) with pytest.raises(InvalidOrderRequest): _format_order_request(order_request, instrument)
def test_format_order_requests_updates_units(instrument): order_request = OrderRequest(instrument='AUD_JPY', units=0.123456) result = _format_order_request(order_request, instrument, clip=True) assert result.units >= instrument.minimum_trade_size
async def test_request_body_does_not_raise_error_when_an_invalid_order_request_is_passed(client, server): await client.initialize() client.format_order_requests = True body = create_body(client, POSTOrders.request_schema, {OrderRequest: OrderRequest(instrument='AUD_USD', units=0)}) assert body['order']['units'] == '1.0'