@@ -36,6 +36,7 @@ class WealthsimpleAPIBase:
3636 'FetchIdentityHistoricalFinancials' : "query FetchIdentityHistoricalFinancials($identityId: ID!, $currency: Currency!, $startDate: Date, $endDate: Date, $first: Int, $cursor: String, $accountIds: [ID!]) {\n identity(id: $identityId) {\n id\n financials(filter: {accounts: $accountIds}) {\n historicalDaily(\n currency: $currency\n startDate: $startDate\n endDate: $endDate\n first: $first\n after: $cursor\n ) {\n edges {\n node {\n ...IdentityHistoricalFinancials\n __typename\n }\n __typename\n }\n pageInfo {\n hasNextPage\n endCursor\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n }\n \n fragment IdentityHistoricalFinancials on IdentityHistoricalDailyFinancials {\n date\n netLiquidationValueV2 {\n amount\n currency\n __typename\n }\n netDepositsV2 {\n amount\n currency\n __typename\n }\n __typename\n }" ,
3737 'FetchCorporateActionChildActivities' : "query FetchCorporateActionChildActivities($activityCanonicalId: String!) {\n corporateActionChildActivities(\n condition: {activityCanonicalId: $activityCanonicalId}\n ) {\n nodes {\n ...CorporateActionChildActivity\n __typename\n }\n __typename\n }\n }\n \n fragment CorporateActionChildActivity on CorporateActionChildActivity {\n canonicalId\n activityCanonicalId\n assetName\n assetSymbol\n assetType\n entitlementType\n quantity\n currency\n price\n recordDate\n __typename\n }" ,
3838 'FetchBrokerageMonthlyStatementTransactions' : "query FetchBrokerageMonthlyStatementTransactions($period: String!, $accountId: String!) {\n brokerageMonthlyStatements(period: $period, accountId: $accountId) {\n id\n statementType\n createdAt\n data {\n ... on BrokerageMonthlyStatementObject {\n ...BrokerageMonthlyStatementObject\n __typename\n }\n __typename\n }\n __typename\n }\n }\n \n fragment BrokerageMonthlyStatementObject on BrokerageMonthlyStatementObject {\n custodianAccountId\n activitiesPerCurrency {\n currency\n currentTransactions {\n ...BrokerageMonthlyStatementTransactions\n __typename\n }\n __typename\n }\n currentTransactions {\n ...BrokerageMonthlyStatementTransactions\n __typename\n }\n isMultiCurrency\n __typename\n }\n \n fragment BrokerageMonthlyStatementTransactions on BrokerageMonthlyStatementTransactions {\n balance\n cashMovement\n unit\n description\n transactionDate\n transactionType\n __typename\n }" ,
39+ 'FetchIdentityPositions' : "query FetchIdentityPositions($identityId: ID!, $currency: Currency!, $first: Int, $cursor: String, $accountIds: [ID!], $aggregated: Boolean, $currencyOverride: CurrencyOverride, $sort: PositionSort, $sortDirection: PositionSortDirection, $filter: PositionFilter, $since: PointInTime, $includeSecurity: Boolean = false, $includeAccountData: Boolean = false, $includeOneDayReturnsBaseline: Boolean = false) {\n identity(id: $identityId) {\n id\n financials(filter: {accounts: $accountIds}) {\n current(currency: $currency) {\n id\n positions(\n first: $first\n after: $cursor\n aggregated: $aggregated\n filter: $filter\n sort: $sort\n sortDirection: $sortDirection\n ) {\n edges {\n node {\n ...PositionV2\n __typename\n }\n __typename\n }\n pageInfo {\n hasNextPage\n endCursor\n __typename\n }\n totalCount\n status\n hasOptionsPosition\n hasCryptoPositionsOnly\n securityTypes\n securityCurrencies\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n }\n \n fragment SecuritySummary on Security {\n ...SecuritySummaryDetails\n stock {\n ...StockSummary\n __typename\n }\n quoteV2(currency: null) {\n ...SecurityQuoteV2\n __typename\n }\n optionDetails {\n ...OptionSummary\n __typename\n }\n __typename\n }\n \n fragment SecuritySummaryDetails on Security {\n id\n currency\n inactiveDate\n status\n wsTradeEligible\n equityTradingSessionType\n securityType\n active\n securityGroups {\n id\n name\n __typename\n }\n features\n logoUrl\n __typename\n }\n \n fragment StockSummary on Stock {\n name\n symbol\n primaryMic\n primaryExchange\n __typename\n }\n \n fragment StreamedSecurityQuoteV2 on UnifiedQuote {\n __typename\n securityId\n ask\n bid\n currency\n price\n sessionPrice\n quotedAsOf\n ... on EquityQuote {\n marketStatus\n askSize\n bidSize\n close\n high\n last\n lastSize\n low\n open\n mid\n volume: vol\n referenceClose\n __typename\n }\n ... on OptionQuote {\n marketStatus\n askSize\n bidSize\n close\n high\n last\n lastSize\n low\n open\n mid\n volume: vol\n breakEven\n inTheMoney\n liquidityStatus\n openInterest\n underlyingSpot\n __typename\n }\n }\n \n fragment SecurityQuoteV2 on UnifiedQuote {\n ...StreamedSecurityQuoteV2\n previousBaseline\n __typename\n }\n \n fragment OptionSummary on Option {\n underlyingSecurity {\n ...UnderlyingSecuritySummary\n __typename\n }\n maturity\n osiSymbol\n expiryDate\n multiplier\n optionType\n strikePrice\n __typename\n }\n \n fragment UnderlyingSecuritySummary on Security {\n id\n stock {\n name\n primaryExchange\n primaryMic\n symbol\n __typename\n }\n __typename\n }\n \n fragment PositionLeg on PositionLeg {\n security {\n id\n ...SecuritySummary @include(if: $includeSecurity)\n __typename\n }\n quantity\n positionDirection\n bookValue {\n amount\n currency\n __typename\n }\n totalValue(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n averagePrice {\n amount\n currency\n __typename\n }\n percentageOfAccount\n unrealizedReturns(since: $since) {\n amount\n currency\n __typename\n }\n marketAveragePrice: averagePrice(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n marketBookValue: bookValue(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n marketUnrealizedReturns: unrealizedReturns(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n oneDayReturnsBaselineV2(currencyOverride: $currencyOverride) @include(if: $includeOneDayReturnsBaseline) {\n baseline {\n currency\n amount\n __typename\n }\n useDailyPriceChange\n __typename\n }\n __typename\n }\n \n fragment PositionV2 on PositionV2 {\n id\n quantity\n accounts @include(if: $includeAccountData) {\n id\n __typename\n }\n percentageOfAccount\n positionDirection\n bookValue {\n amount\n currency\n __typename\n }\n averagePrice {\n amount\n currency\n __typename\n }\n marketAveragePrice: averagePrice(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n marketBookValue: bookValue(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n totalValue(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n unrealizedReturns(since: $since) {\n amount\n currency\n __typename\n }\n marketUnrealizedReturns: unrealizedReturns(currencyOverride: $currencyOverride) {\n amount\n currency\n __typename\n }\n security {\n id\n ...SecuritySummary @include(if: $includeSecurity)\n __typename\n }\n oneDayReturnsBaselineV2(currencyOverride: $currencyOverride) @include(if: $includeOneDayReturnsBaseline) {\n baseline {\n currency\n amount\n __typename\n }\n useDailyPriceChange\n __typename\n }\n strategyType\n legs {\n ...PositionLeg\n __typename\n }\n __typename\n }" ,
3940 }
4041
4142 def __init__ (self , sess : WSAPISession | None = None ):
@@ -811,3 +812,34 @@ def get_statement_transactions(self, account_id: str, period: str) -> list[Any]:
811812 raise WSApiException (f"Unexpected response format: { self .get_statement_transactions .__name__ } " , transactions )
812813
813814 return transactions
815+
816+ def get_identity_positions (self , security_ids : list [str ] | None , currency : str ) -> list [Any ]:
817+ """Retrieve information on specific positions
818+
819+ Args:
820+ security_ids: list of Wealthsimple security ids, None will return all owened securities
821+ currency: currency to return the amoutns in (CAD or USD)
822+
823+ Returns:
824+ list[Any]: a list of positions by account
825+
826+ Raises:
827+ WSApiException: If the response format is unexpected.
828+ """
829+ positions = self .do_graphql_query (
830+ "FetchIdentityPositions" ,
831+ {
832+ "identityId" : self .get_token_info ().get ("identity_canonical_id" ),
833+ "currency" : currency ,
834+ "filter" : {"securityIds" : security_ids },
835+ "includeAccountData" : True ,
836+ },
837+ "identity.financials.current.positions.edges" ,
838+ "array" ,
839+ )
840+
841+ if not isinstance (positions , list ):
842+ raise WSApiException (f"Unexpected response format: { self .get_identity_positions .__name__ } " , positions )
843+
844+ return positions
845+
0 commit comments