def close(self, accountID, instrument, **kwargs): """ Closeout the open Position for a specific instrument in an Account. Args: accountID: Account Identifier instrument: Name of the Instrument longUnits: Indication of how much of the long Position to closeout. Either the string "ALL", the string "NONE", or a DecimalNumber representing how many units of the long position to close using a PositionCloseout MarketOrder. The units specified must always be positive. longClientExtensions: The client extensions to add to the MarketOrder used to close the long position. shortUnits: Indication of how much of the short Position to closeout. Either the string "ALL", the string "NONE", or a DecimalNumber representing how many units of the short position to close using a PositionCloseout MarketOrder. The units specified must always be positive. shortClientExtensions: The client extensions to add to the MarketOrder used to close the short position. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/positions/{instrument}/close') request.set_path_param('accountID', accountID) request.set_path_param('instrument', instrument) body = EntityDict() if 'longUnits' in kwargs: body.set('longUnits', kwargs['longUnits']) if 'longClientExtensions' in kwargs: body.set('longClientExtensions', kwargs['longClientExtensions']) if 'shortUnits' in kwargs: body.set('shortUnits', kwargs['shortUnits']) if 'shortClientExtensions' in kwargs: body.set('shortClientExtensions', kwargs['shortClientExtensions']) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('longOrderCreateTransaction') is not None: parsed_body['longOrderCreateTransaction'] = \ self.ctx.transaction.MarketOrderTransaction.from_dict( jbody['longOrderCreateTransaction'], self.ctx ) if jbody.get('longOrderFillTransaction') is not None: parsed_body['longOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['longOrderFillTransaction'], self.ctx ) if jbody.get('longOrderCancelTransaction') is not None: parsed_body['longOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['longOrderCancelTransaction'], self.ctx ) if jbody.get('shortOrderCreateTransaction') is not None: parsed_body['shortOrderCreateTransaction'] = \ self.ctx.transaction.MarketOrderTransaction.from_dict( jbody['shortOrderCreateTransaction'], self.ctx ) if jbody.get('shortOrderFillTransaction') is not None: parsed_body['shortOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['shortOrderFillTransaction'], self.ctx ) if jbody.get('shortOrderCancelTransaction') is not None: parsed_body['shortOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['shortOrderCancelTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('longOrderRejectTransaction') is not None: parsed_body['longOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['longOrderRejectTransaction'], self.ctx ) if jbody.get('shortOrderRejectTransaction') is not None: parsed_body['shortOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['shortOrderRejectTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('longOrderRejectTransaction') is not None: parsed_body['longOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['longOrderRejectTransaction'], self.ctx ) if jbody.get('shortOrderRejectTransaction') is not None: parsed_body['shortOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['shortOrderRejectTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def set_dependent_orders(self, accountID, tradeSpecifier, **kwargs): """ Create, replace and cancel a Trade's dependent Orders (Take Profit, Stop Loss and Trailing Stop Loss) through the Trade itself Args: accountID: Account Identifier tradeSpecifier: Specifier for the Trade takeProfit: The specification of the Take Profit to create/modify/cancel. If takeProfit is set to null, the Take Profit Order will be cancelled if it exists. If takeProfit is not provided, the exisiting Take Profit Order will not be modified. If a sub- field of takeProfit is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. stopLoss: The specification of the Stop Loss to create/modify/cancel. If stopLoss is set to null, the Stop Loss Order will be cancelled if it exists. If stopLoss is not provided, the exisiting Stop Loss Order will not be modified. If a sub-field of stopLoss is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. trailingStopLoss: The specification of the Trailing Stop Loss to create/modify/cancel. If trailingStopLoss is set to null, the Trailing Stop Loss Order will be cancelled if it exists. If trailingStopLoss is not provided, the exisiting Trailing Stop Loss Order will not be modified. If a sub-field of trailngStopLoss is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeSpecifier}/orders') request.set_path_param('accountID', accountID) request.set_path_param('tradeSpecifier', tradeSpecifier) body = EntityDict() body.set('takeProfit', kwargs.get('takeProfit')) body.set('stopLoss', kwargs.get('stopLoss')) body.set('trailingStopLoss', kwargs.get('trailingStopLoss')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('takeProfitOrderCancelTransaction') is not None: parsed_body['takeProfitOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['takeProfitOrderCancelTransaction'], self.ctx ) if jbody.get('takeProfitOrderTransaction') is not None: parsed_body['takeProfitOrderTransaction'] = \ self.ctx.transaction.TakeProfitOrderTransaction.from_dict( jbody['takeProfitOrderTransaction'], self.ctx ) if jbody.get('takeProfitOrderFillTransaction') is not None: parsed_body['takeProfitOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['takeProfitOrderFillTransaction'], self.ctx ) if jbody.get( 'takeProfitOrderCreatedCancelTransaction') is not None: parsed_body['takeProfitOrderCreatedCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['takeProfitOrderCreatedCancelTransaction'], self.ctx ) if jbody.get('stopLossOrderCancelTransaction') is not None: parsed_body['stopLossOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['stopLossOrderCancelTransaction'], self.ctx ) if jbody.get('stopLossOrderTransaction') is not None: parsed_body['stopLossOrderTransaction'] = \ self.ctx.transaction.StopLossOrderTransaction.from_dict( jbody['stopLossOrderTransaction'], self.ctx ) if jbody.get('stopLossOrderFillTransaction') is not None: parsed_body['stopLossOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['stopLossOrderFillTransaction'], self.ctx ) if jbody.get('stopLossOrderCreatedCancelTransaction') is not None: parsed_body['stopLossOrderCreatedCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['stopLossOrderCreatedCancelTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderCancelTransaction') is not None: parsed_body['trailingStopLossOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['trailingStopLossOrderCancelTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderTransaction') is not None: parsed_body['trailingStopLossOrderTransaction'] = \ self.ctx.transaction.TrailingStopLossOrderTransaction.from_dict( jbody['trailingStopLossOrderTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('takeProfitOrderCancelRejectTransaction') is not None: parsed_body['takeProfitOrderCancelRejectTransaction'] = \ self.ctx.transaction.OrderCancelRejectTransaction.from_dict( jbody['takeProfitOrderCancelRejectTransaction'], self.ctx ) if jbody.get('takeProfitOrderRejectTransaction') is not None: parsed_body['takeProfitOrderRejectTransaction'] = \ self.ctx.transaction.TakeProfitOrderRejectTransaction.from_dict( jbody['takeProfitOrderRejectTransaction'], self.ctx ) if jbody.get('stopLossOrderCancelRejectTransaction') is not None: parsed_body['stopLossOrderCancelRejectTransaction'] = \ self.ctx.transaction.OrderCancelRejectTransaction.from_dict( jbody['stopLossOrderCancelRejectTransaction'], self.ctx ) if jbody.get('stopLossOrderRejectTransaction') is not None: parsed_body['stopLossOrderRejectTransaction'] = \ self.ctx.transaction.StopLossOrderRejectTransaction.from_dict( jbody['stopLossOrderRejectTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderCancelRejectTransaction' ) is not None: parsed_body['trailingStopLossOrderCancelRejectTransaction'] = \ self.ctx.transaction.OrderCancelRejectTransaction.from_dict( jbody['trailingStopLossOrderCancelRejectTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderRejectTransaction') is not None: parsed_body['trailingStopLossOrderRejectTransaction'] = \ self.ctx.transaction.TrailingStopLossOrderRejectTransaction.from_dict( jbody['trailingStopLossOrderRejectTransaction'], self.ctx ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def close( self, accountID, instrument, **kwargs ): """ Closeout the open Position for a specific instrument in an Account. Args: accountID: Account Identifier instrument: Name of the Instrument longUnits: Indication of how much of the long Position to closeout. Either the string "ALL", the string "NONE", or a DecimalNumber representing how many units of the long position to close using a PositionCloseout MarketOrder. The units specified must always be positive. longClientExtensions: The client extensions to add to the MarketOrder used to close the long position. shortUnits: Indication of how much of the short Position to closeout. Either the string "ALL", the string "NONE", or a DecimalNumber representing how many units of the short position to close using a PositionCloseout MarketOrder. The units specified must always be positive. shortClientExtensions: The client extensions to add to the MarketOrder used to close the short position. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/positions/{instrument}/close' ) request.set_path_param( 'accountID', accountID ) request.set_path_param( 'instrument', instrument ) body = EntityDict() if 'longUnits' in kwargs: body.set('longUnits', kwargs['longUnits']) if 'longClientExtensions' in kwargs: body.set('longClientExtensions', kwargs['longClientExtensions']) if 'shortUnits' in kwargs: body.set('shortUnits', kwargs['shortUnits']) if 'shortClientExtensions' in kwargs: body.set('shortClientExtensions', kwargs['shortClientExtensions']) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('longOrderCreateTransaction') is not None: parsed_body['longOrderCreateTransaction'] = \ self.ctx.transaction.MarketOrderTransaction.from_dict( jbody['longOrderCreateTransaction'], self.ctx ) if jbody.get('longOrderFillTransaction') is not None: parsed_body['longOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['longOrderFillTransaction'], self.ctx ) if jbody.get('longOrderCancelTransaction') is not None: parsed_body['longOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['longOrderCancelTransaction'], self.ctx ) if jbody.get('shortOrderCreateTransaction') is not None: parsed_body['shortOrderCreateTransaction'] = \ self.ctx.transaction.MarketOrderTransaction.from_dict( jbody['shortOrderCreateTransaction'], self.ctx ) if jbody.get('shortOrderFillTransaction') is not None: parsed_body['shortOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['shortOrderFillTransaction'], self.ctx ) if jbody.get('shortOrderCancelTransaction') is not None: parsed_body['shortOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['shortOrderCancelTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('longOrderRejectTransaction') is not None: parsed_body['longOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['longOrderRejectTransaction'], self.ctx ) if jbody.get('shortOrderRejectTransaction') is not None: parsed_body['shortOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['shortOrderRejectTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('longOrderRejectTransaction') is not None: parsed_body['longOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['longOrderRejectTransaction'], self.ctx ) if jbody.get('shortOrderRejectTransaction') is not None: parsed_body['shortOrderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['shortOrderRejectTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def close(self, accountID, tradeSpecifier, **kwargs): """ Close (partially or fully) a specific open Trade in an Account Args: accountID: Account Identifier tradeSpecifier: Specifier for the Trade units: Indication of how much of the Trade to close. Either the string "ALL" (indicating that all of the Trade should be closed), or a DecimalNumber representing the number of units of the open Trade to Close using a TradeClose MarketOrder. The units specified must always be positive, and the magnitude of the value cannot exceed the magnitude of the Trade's open units. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeSpecifier}/close') request.set_path_param('accountID', accountID) request.set_path_param('tradeSpecifier', tradeSpecifier) body = EntityDict() body.set('units', kwargs.get('units')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('orderCreateTransaction') is not None: parsed_body['orderCreateTransaction'] = \ self.ctx.transaction.MarketOrderTransaction.from_dict( jbody['orderCreateTransaction'], self.ctx ) if jbody.get('orderFillTransaction') is not None: parsed_body['orderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['orderFillTransaction'], self.ctx ) if jbody.get('orderCancelTransaction') is not None: parsed_body['orderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['orderCancelTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('orderRejectTransaction') is not None: parsed_body['orderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['orderRejectTransaction'], self.ctx ) if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('orderRejectTransaction') is not None: parsed_body['orderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['orderRejectTransaction'], self.ctx ) if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def set_client_extensions(self, accountID, tradeSpecifier, **kwargs): """ Update the Client Extensions for a Trade. Do not add, update, or delete the Client Extensions if your account is associated with MT4. Args: accountID: Account Identifier tradeSpecifier: Specifier for the Trade clientExtensions: The Client Extensions to update the Trade with. Do not add, update, or delete the Client Extensions if your account is associated with MT4. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeSpecifier}/clientExtensions' ) request.set_path_param('accountID', accountID) request.set_path_param('tradeSpecifier', tradeSpecifier) body = EntityDict() body.set('clientExtensions', kwargs.get('clientExtensions')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('tradeClientExtensionsModifyTransaction') is not None: parsed_body['tradeClientExtensionsModifyTransaction'] = \ self.ctx.transaction.TradeClientExtensionsModifyTransaction.from_dict( jbody['tradeClientExtensionsModifyTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('tradeClientExtensionsModifyRejectTransaction' ) is not None: parsed_body['tradeClientExtensionsModifyRejectTransaction'] = \ self.ctx.transaction.TradeClientExtensionsModifyRejectTransaction.from_dict( jbody['tradeClientExtensionsModifyRejectTransaction'], self.ctx ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def set_client_extensions(self, accountID, tradeID, **kwargs): """Set Trade Client Extensions Update the Client Extensions for a Trade Parameters ---------- accountID : ID of the Account. tradeID : ID of the Trade to update the Client Extension of. clientExtensions : None, optional The Client Extensions to update the Trade with. """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeID}/clientExtensions') request.set_path_param('accountID', accountID) request.set_path_param('tradeID', tradeID) body = EntityDict() body.set('clientExtensions', kwargs.get('clientExtensions')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} if response.status is 200: if jbody.get('tradeClientExtensionsModifyTransaction') is not None: parsed_body['tradeClientExtensionsModifyTransaction'] = \ transaction.TradeClientExtensionsModifyTransaction.from_dict( jbody['tradeClientExtensionsModifyTransaction'] ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if response.status is 400: if jbody.get('tradeClientExtensionsModifyRejectTransaction' ) is not None: parsed_body['tradeClientExtensionsModifyRejectTransaction'] = \ transaction.TradeClientExtensionsModifyRejectTransaction.from_dict( jbody['tradeClientExtensionsModifyRejectTransaction'] ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 401: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 404: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 405: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') response.body = parsed_body return response
def set_dependent_orders(self, accountID, tradeID, **kwargs): """Set Dependent Orders Create, replace and cancel a Trade's dependent Orders (Take Profit, Stop Loss and Trailing Stop Loss) through the Trade itself Parameters ---------- accountID : ID of the Account. tradeID : ID of the Trade to modify the dependent Orders of. takeProfit : None, optional The specification of the Take Profit to create/modify/cancel. If takeProfit is set to null, the Take Profit Order will be cancelled if it exists. If takeProfit is not provided, the exisiting Take Profit Order will not be modified. If a sub-field of takeProfit is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. stopLoss : None, optional The specification of the Stop Loss to create/modify/cancel. If stopLoss is set to null, the Stop Loss Order will be cancelled if it exists. If stopLoss is not provided, the exisiting Stop Loss Order will not be modified. If a sub-field of stopLoss is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. trailingStopLoss : None, optional The specification of the Trailing Stop Loss to create/modify/cancel. If trailingStopLoss is set to null, the Trailing Stop Loss Order will be cancelled if it exists. If trailingStopLoss is not provided, the exisiting Trailing Stop Loss Order will not be modified. If a sub-field of trailngStopLoss is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. """ request = Request('PUT', '/v3/accounts/{accountID}/trades/{tradeID}/orders') request.set_path_param('accountID', accountID) request.set_path_param('tradeID', tradeID) body = EntityDict() body.set('takeProfit', kwargs.get('takeProfit')) body.set('stopLoss', kwargs.get('stopLoss')) body.set('trailingStopLoss', kwargs.get('trailingStopLoss')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} if response.status is 200: if jbody.get('takeProfitOrderCancelTransaction') is not None: parsed_body['takeProfitOrderCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['takeProfitOrderCancelTransaction'] ) if jbody.get('takeProfitOrderTransaction') is not None: parsed_body['takeProfitOrderTransaction'] = \ transaction.TakeProfitOrderTransaction.from_dict( jbody['takeProfitOrderTransaction'] ) if jbody.get('takeProfitOrderFillTransaction') is not None: parsed_body['takeProfitOrderFillTransaction'] = \ transaction.OrderFillTransaction.from_dict( jbody['takeProfitOrderFillTransaction'] ) if jbody.get( 'takeProfitOrderCreatedCancelTransaction') is not None: parsed_body['takeProfitOrderCreatedCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['takeProfitOrderCreatedCancelTransaction'] ) if jbody.get('stopLossOrderCancelTransaction') is not None: parsed_body['stopLossOrderCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['stopLossOrderCancelTransaction'] ) if jbody.get('stopLossOrderTransaction') is not None: parsed_body['stopLossOrderTransaction'] = \ transaction.StopLossOrderTransaction.from_dict( jbody['stopLossOrderTransaction'] ) if jbody.get('stopLossOrderFillTransaction') is not None: parsed_body['stopLossOrderFillTransaction'] = \ transaction.OrderFillTransaction.from_dict( jbody['stopLossOrderFillTransaction'] ) if jbody.get('stopLossOrderCreatedCancelTransaction') is not None: parsed_body['stopLossOrderCreatedCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['stopLossOrderCreatedCancelTransaction'] ) if jbody.get('trailingStopLossOrderCancelTransaction') is not None: parsed_body['trailingStopLossOrderCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['trailingStopLossOrderCancelTransaction'] ) if jbody.get('trailingStopLossOrderTransaction') is not None: parsed_body['trailingStopLossOrderTransaction'] = \ transaction.TrailingStopLossOrderTransaction.from_dict( jbody['trailingStopLossOrderTransaction'] ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if response.status is 400: if jbody.get('takeProfitOrderCancelRejectTransaction') is not None: parsed_body['takeProfitOrderCancelRejectTransaction'] = \ transaction.OrderCancelRejectTransaction.from_dict( jbody['takeProfitOrderCancelRejectTransaction'] ) if jbody.get('takeProfitOrderRejectTransaction') is not None: parsed_body['takeProfitOrderRejectTransaction'] = \ transaction.TakeProfitOrderRejectTransaction.from_dict( jbody['takeProfitOrderRejectTransaction'] ) if jbody.get('stopLossOrderCancelRejectTransaction') is not None: parsed_body['stopLossOrderCancelRejectTransaction'] = \ transaction.OrderCancelRejectTransaction.from_dict( jbody['stopLossOrderCancelRejectTransaction'] ) if jbody.get('stopLossOrderRejectTransaction') is not None: parsed_body['stopLossOrderRejectTransaction'] = \ transaction.StopLossOrderRejectTransaction.from_dict( jbody['stopLossOrderRejectTransaction'] ) if jbody.get('trailingStopLossOrderCancelRejectTransaction' ) is not None: parsed_body['trailingStopLossOrderCancelRejectTransaction'] = \ transaction.OrderCancelRejectTransaction.from_dict( jbody['trailingStopLossOrderCancelRejectTransaction'] ) if jbody.get('trailingStopLossOrderRejectTransaction') is not None: parsed_body['trailingStopLossOrderRejectTransaction'] = \ transaction.TrailingStopLossOrderRejectTransaction.from_dict( jbody['trailingStopLossOrderRejectTransaction'] ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 401: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 404: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 405: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') response.body = parsed_body return response
def close(self, accountID, tradeID, **kwargs): """Close Trade Close (partially or fully) a specific open Trade in an Account Parameters ---------- accountID : ID of the Account to close a Trade in. tradeID : ID of the Trade to close. units : string, optional Indication of how much of the Trade to close. Either the string "ALL" (indicating that all of the Trade should be closed), or a DecimalNumber representing the number of units of the open Trade to Close using a TradeClose MarketOrder. The units specified must always be positive, and the magnitude of the value cannot exceed the magnitude of the Trade's open units. """ request = Request('PUT', '/v3/accounts/{accountID}/trades/{tradeID}/close') request.set_path_param('accountID', accountID) request.set_path_param('tradeID', tradeID) body = EntityDict() body.set('units', kwargs.get('units')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} if response.status is 200: if jbody.get('orderCreateTransaction') is not None: parsed_body['orderCreateTransaction'] = \ transaction.MarketOrderTransaction.from_dict( jbody['orderCreateTransaction'] ) if jbody.get('orderFillTransaction') is not None: parsed_body['orderFillTransaction'] = \ transaction.OrderFillTransaction.from_dict( jbody['orderFillTransaction'] ) if jbody.get('orderCancelTransaction') is not None: parsed_body['orderCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['orderCancelTransaction'] ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if response.status is 400: if jbody.get('orderRejectTransaction') is not None: parsed_body['orderRejectTransaction'] = \ transaction.MarketOrderRejectTransaction.from_dict( jbody['orderRejectTransaction'] ) if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 401: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 404: if jbody.get('orderRejectTransaction') is not None: parsed_body['orderRejectTransaction'] = \ transaction.MarketOrderRejectTransaction.from_dict( jbody['orderRejectTransaction'] ) if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if response.status is 405: if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') response.body = parsed_body return response
def set_client_extensions( self, accountID, tradeSpecifier, **kwargs ): """ Update the Client Extensions for a Trade. Do not add, update, or delete the Client Extensions if your account is associated with MT4. Args: accountID: Account Identifier tradeSpecifier: Specifier for the Trade clientExtensions: The Client Extensions to update the Trade with. Do not add, update, or delete the Client Extensions if your account is associated with MT4. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeSpecifier}/clientExtensions' ) request.set_path_param( 'accountID', accountID ) request.set_path_param( 'tradeSpecifier', tradeSpecifier ) body = EntityDict() if 'clientExtensions' in kwargs: body.set('clientExtensions', kwargs['clientExtensions']) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('tradeClientExtensionsModifyTransaction') is not None: parsed_body['tradeClientExtensionsModifyTransaction'] = \ self.ctx.transaction.TradeClientExtensionsModifyTransaction.from_dict( jbody['tradeClientExtensionsModifyTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('tradeClientExtensionsModifyRejectTransaction') is not None: parsed_body['tradeClientExtensionsModifyRejectTransaction'] = \ self.ctx.transaction.TradeClientExtensionsModifyRejectTransaction.from_dict( jbody['tradeClientExtensionsModifyRejectTransaction'], self.ctx ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('tradeClientExtensionsModifyRejectTransaction') is not None: parsed_body['tradeClientExtensionsModifyRejectTransaction'] = \ self.ctx.transaction.TradeClientExtensionsModifyRejectTransaction.from_dict( jbody['tradeClientExtensionsModifyRejectTransaction'], self.ctx ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def close( self, accountID, tradeSpecifier, **kwargs ): """ Close (partially or fully) a specific open Trade in an Account Args: accountID: Account Identifier tradeSpecifier: Specifier for the Trade units: Indication of how much of the Trade to close. Either the string "ALL" (indicating that all of the Trade should be closed), or a DecimalNumber representing the number of units of the open Trade to Close using a TradeClose MarketOrder. The units specified must always be positive, and the magnitude of the value cannot exceed the magnitude of the Trade's open units. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeSpecifier}/close' ) request.set_path_param( 'accountID', accountID ) request.set_path_param( 'tradeSpecifier', tradeSpecifier ) body = EntityDict() if 'units' in kwargs: body.set('units', kwargs['units']) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('orderCreateTransaction') is not None: parsed_body['orderCreateTransaction'] = \ self.ctx.transaction.MarketOrderTransaction.from_dict( jbody['orderCreateTransaction'], self.ctx ) if jbody.get('orderFillTransaction') is not None: parsed_body['orderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['orderFillTransaction'], self.ctx ) if jbody.get('orderCancelTransaction') is not None: parsed_body['orderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['orderCancelTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('orderRejectTransaction') is not None: parsed_body['orderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['orderRejectTransaction'], self.ctx ) if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('orderRejectTransaction') is not None: parsed_body['orderRejectTransaction'] = \ self.ctx.transaction.MarketOrderRejectTransaction.from_dict( jbody['orderRejectTransaction'], self.ctx ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def set_dependent_orders( self, accountID, tradeSpecifier, **kwargs ): """ Create, replace and cancel a Trade's dependent Orders (Take Profit, Stop Loss and Trailing Stop Loss) through the Trade itself Args: accountID: Account Identifier tradeSpecifier: Specifier for the Trade takeProfit: The specification of the Take Profit to create/modify/cancel. If takeProfit is set to null, the Take Profit Order will be cancelled if it exists. If takeProfit is not provided, the exisiting Take Profit Order will not be modified. If a sub- field of takeProfit is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. stopLoss: The specification of the Stop Loss to create/modify/cancel. If stopLoss is set to null, the Stop Loss Order will be cancelled if it exists. If stopLoss is not provided, the exisiting Stop Loss Order will not be modified. If a sub-field of stopLoss is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. trailingStopLoss: The specification of the Trailing Stop Loss to create/modify/cancel. If trailingStopLoss is set to null, the Trailing Stop Loss Order will be cancelled if it exists. If trailingStopLoss is not provided, the exisiting Trailing Stop Loss Order will not be modified. If a sub-field of trailngStopLoss is not specified, that field will be set to a default value on create, and be inherited by the replacing order on modify. Returns: v20.response.Response containing the results from submitting the request """ request = Request( 'PUT', '/v3/accounts/{accountID}/trades/{tradeSpecifier}/orders' ) request.set_path_param( 'accountID', accountID ) request.set_path_param( 'tradeSpecifier', tradeSpecifier ) body = EntityDict() if 'takeProfit' in kwargs: body.set('takeProfit', kwargs['takeProfit']) if 'stopLoss' in kwargs: body.set('stopLoss', kwargs['stopLoss']) if 'trailingStopLoss' in kwargs: body.set('trailingStopLoss', kwargs['trailingStopLoss']) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} # # Parse responses as defined by the API specification # if str(response.status) == "200": if jbody.get('takeProfitOrderCancelTransaction') is not None: parsed_body['takeProfitOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['takeProfitOrderCancelTransaction'], self.ctx ) if jbody.get('takeProfitOrderTransaction') is not None: parsed_body['takeProfitOrderTransaction'] = \ self.ctx.transaction.TakeProfitOrderTransaction.from_dict( jbody['takeProfitOrderTransaction'], self.ctx ) if jbody.get('takeProfitOrderFillTransaction') is not None: parsed_body['takeProfitOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['takeProfitOrderFillTransaction'], self.ctx ) if jbody.get('takeProfitOrderCreatedCancelTransaction') is not None: parsed_body['takeProfitOrderCreatedCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['takeProfitOrderCreatedCancelTransaction'], self.ctx ) if jbody.get('stopLossOrderCancelTransaction') is not None: parsed_body['stopLossOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['stopLossOrderCancelTransaction'], self.ctx ) if jbody.get('stopLossOrderTransaction') is not None: parsed_body['stopLossOrderTransaction'] = \ self.ctx.transaction.StopLossOrderTransaction.from_dict( jbody['stopLossOrderTransaction'], self.ctx ) if jbody.get('stopLossOrderFillTransaction') is not None: parsed_body['stopLossOrderFillTransaction'] = \ self.ctx.transaction.OrderFillTransaction.from_dict( jbody['stopLossOrderFillTransaction'], self.ctx ) if jbody.get('stopLossOrderCreatedCancelTransaction') is not None: parsed_body['stopLossOrderCreatedCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['stopLossOrderCreatedCancelTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderCancelTransaction') is not None: parsed_body['trailingStopLossOrderCancelTransaction'] = \ self.ctx.transaction.OrderCancelTransaction.from_dict( jbody['trailingStopLossOrderCancelTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderTransaction') is not None: parsed_body['trailingStopLossOrderTransaction'] = \ self.ctx.transaction.TrailingStopLossOrderTransaction.from_dict( jbody['trailingStopLossOrderTransaction'], self.ctx ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') elif str(response.status) == "400": if jbody.get('takeProfitOrderCancelRejectTransaction') is not None: parsed_body['takeProfitOrderCancelRejectTransaction'] = \ self.ctx.transaction.OrderCancelRejectTransaction.from_dict( jbody['takeProfitOrderCancelRejectTransaction'], self.ctx ) if jbody.get('takeProfitOrderRejectTransaction') is not None: parsed_body['takeProfitOrderRejectTransaction'] = \ self.ctx.transaction.TakeProfitOrderRejectTransaction.from_dict( jbody['takeProfitOrderRejectTransaction'], self.ctx ) if jbody.get('stopLossOrderCancelRejectTransaction') is not None: parsed_body['stopLossOrderCancelRejectTransaction'] = \ self.ctx.transaction.OrderCancelRejectTransaction.from_dict( jbody['stopLossOrderCancelRejectTransaction'], self.ctx ) if jbody.get('stopLossOrderRejectTransaction') is not None: parsed_body['stopLossOrderRejectTransaction'] = \ self.ctx.transaction.StopLossOrderRejectTransaction.from_dict( jbody['stopLossOrderRejectTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderCancelRejectTransaction') is not None: parsed_body['trailingStopLossOrderCancelRejectTransaction'] = \ self.ctx.transaction.OrderCancelRejectTransaction.from_dict( jbody['trailingStopLossOrderCancelRejectTransaction'], self.ctx ) if jbody.get('trailingStopLossOrderRejectTransaction') is not None: parsed_body['trailingStopLossOrderRejectTransaction'] = \ self.ctx.transaction.TrailingStopLossOrderRejectTransaction.from_dict( jbody['trailingStopLossOrderRejectTransaction'], self.ctx ) if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "404": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') elif str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') # # Unexpected response status # else: parsed_body = jbody response.body = parsed_body return response
def close(self, accountID, instrument, **kwargs): """Close Position Closeout the open Position for a specific instrument in an Account. Parameters ---------- accountID : ID of the Account to close a Position in. instrument : Name of the Instrument to close the Positon of. longUnits : string, optional Indication of how much of the long Position to closeout. Either the string "ALL", the string "NONE", or a DecimalNumber representing how many units of the long position to close using a PositionCloseout MarketOrder. The units specified must always be positive. longClientExtensions : None, optional The client extensions to add to the MarketOrder used to close the long position. shortUnits : string, optional Indication of how much of the short Position to closeout. Either the string "ALL", the string "NONE", or a DecimalNumber representing how many units of the short position to close using a PositionCloseout MarketOrder. The units specified must always be positive. shortClientExtensions : None, optional The client extensions to add to the MarketOrder used to close the short position. """ request = Request( 'PUT', '/v3/accounts/{accountID}/positions/{instrument}/close') request.set_path_param('accountID', accountID) request.set_path_param('instrument', instrument) body = EntityDict() body.set('longUnits', kwargs.get('longUnits')) body.set('longClientExtensions', kwargs.get('longClientExtensions')) body.set('shortUnits', kwargs.get('shortUnits')) body.set('shortClientExtensions', kwargs.get('shortClientExtensions')) request.set_body_dict(body.dict) response = self.ctx.request(request) if response.content_type is None: return response if not response.content_type.startswith("application/json"): return response jbody = json.loads(response.raw_body) parsed_body = {} if str(response.status) == "200": if jbody.get('longOrderCreateTransaction') is not None: parsed_body['longOrderCreateTransaction'] = \ transaction.MarketOrderTransaction.from_dict( jbody['longOrderCreateTransaction'] ) if jbody.get('longOrderFillTransaction') is not None: parsed_body['longOrderFillTransaction'] = \ transaction.OrderFillTransaction.from_dict( jbody['longOrderFillTransaction'] ) if jbody.get('longOrderCancelTransaction') is not None: parsed_body['longOrderCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['longOrderCancelTransaction'] ) if jbody.get('shortOrderCreateTransaction') is not None: parsed_body['shortOrderCreateTransaction'] = \ transaction.MarketOrderTransaction.from_dict( jbody['shortOrderCreateTransaction'] ) if jbody.get('shortOrderFillTransaction') is not None: parsed_body['shortOrderFillTransaction'] = \ transaction.OrderFillTransaction.from_dict( jbody['shortOrderFillTransaction'] ) if jbody.get('shortOrderCancelTransaction') is not None: parsed_body['shortOrderCancelTransaction'] = \ transaction.OrderCancelTransaction.from_dict( jbody['shortOrderCancelTransaction'] ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if str(response.status) == "400": if jbody.get('longOrderRejectTransaction') is not None: parsed_body['longOrderRejectTransaction'] = \ transaction.MarketOrderRejectTransaction.from_dict( jbody['longOrderRejectTransaction'] ) if jbody.get('shortOrderRejectTransaction') is not None: parsed_body['shortOrderRejectTransaction'] = \ transaction.MarketOrderRejectTransaction.from_dict( jbody['shortOrderRejectTransaction'] ) if jbody.get('relatedTransactionIDs') is not None: parsed_body['relatedTransactionIDs'] = \ jbody.get('relatedTransactionIDs') if jbody.get('lastTransactionID') is not None: parsed_body['lastTransactionID'] = \ jbody.get('lastTransactionID') if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if str(response.status) == "401": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if str(response.status) == "404": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') if str(response.status) == "405": if jbody.get('errorCode') is not None: parsed_body['errorCode'] = \ jbody.get('errorCode') if jbody.get('errorMessage') is not None: parsed_body['errorMessage'] = \ jbody.get('errorMessage') response.body = parsed_body return response