建玉の一覧
3種類の方法がありますが、tradesを使った方法が一番簡単でスッキリしています。
tradesを使った方法
res = trades.OpenTrades(accountID) api.request(res)
trades.OpenTrades
にaccountID
を渡すだけです。
- 売りの場合は、建玉数がマイナスになります。
- 建玉がない場合は、
lastTransactionID
のみ返してきます。
システム例
res = trades.OpenTrades(accountID) api.request(res) print(json.dumps(res.response, indent=2)) # { # "trades": [ # { # "id": "23748", # "instrument": "EUR_USD", # "price": "1.13582", # "openTime": "2020-07-09T06:16:44.882287602Z", # "initialUnits": "-1", # "initialMarginRequired": "4.8711", # "state": "OPEN", # "currentUnits": "-1", # "realizedPL": "0.0000", # "financing": "0.0000", # "dividendAdjustment": "0.0000", # "unrealizedPL": "-0.0032", # "marginUsed": "4.8711" # }, # { # "id": "23746", # "instrument": "USD_JPY", # "price": "107.235", # "openTime": "2020-07-09T06:14:23.060935016Z", # "initialUnits": "1000", # "initialMarginRequired": "4289.3200", # "state": "OPEN", # "currentUnits": "1000", # "realizedPL": "0.0000", # "financing": "0.0000", # "dividendAdjustment": "0.0000", # "unrealizedPL": "-23.0000", # "marginUsed": "4288.5600" # } # ], # "lastTransactionID": "23748" # }
positions.OpenPositionsを使った方法
通貨ペア毎に、買い(long
)と売り(short
)を個別に取得します。
res = positions.OpenPositions(accountID=accountID) api.request(res)
trades.OpenTrades
にaccountID
を渡すだけです。
- 買い(
long
)と売り(short
)を個別に返してきますが、両建てできませんので意味がないと思います。 - 建玉がない場合は、空の
positions
とlastTransactionID
を返してきます。
システム例
res = positions.OpenPositions(accountID=accountID) api.request(res) print(json.dumps(res.response, indent=2)) # { # "positions": [ # { # "instrument": "USD_JPY", # "long": { # "units": "1000", # "averagePrice": "107.280", # "pl": "-44515.2550", # "resettablePL": "-44515.2550", # "financing": "6406.7396", # "dividendAdjustment": "0.0000", # "guaranteedExecutionFees": "0.0000", # "tradeIDs": [ # "23766" # ], # "unrealizedPL": "-4.0000" # }, # "short": { # "units": "0", # "pl": "-70243.9790", # "resettablePL": "-70243.9790", # "financing": "-1004.0500", # "dividendAdjustment": "0.0000", # "guaranteedExecutionFees": "0.0000", # "unrealizedPL": "0.0000" # }, # "pl": "-114759.2340", # "resettablePL": "-114759.2340", # "financing": "5402.6896", # "commission": "0.0000", # "dividendAdjustment": "0.0000", # "guaranteedExecutionFees": "0.0000", # "unrealizedPL": "-4.0000", # "marginUsed": "4291.1200" # } # ], # "lastTransactionID": "23766" # }
positionsを使った方法
建玉がなくても、過去に取引した通貨ペアも取得します。ですので、この方法はおすすめしません。
import oandapyV20.endpoints.positions as positions
を使用します。
設定はありません。口座にある全ての建玉を取得します。
この取得はとてもクセがあるので、以下に注意事項を記載します。
- 建玉がなくても、過去に取引した通貨ペアが取得されてしまう。
- 1つのチケットごとにリストアップされるが、通貨ペアと売り買いが同一の場合、建玉の数量と損益は合計、価格は平均になる。
チケットのIDは個別にリストアップされますので、そのIDをもって建玉の詳細を取得するしか方法はないと思います。
以下は、合算の建玉として、もしくはチケット番号のみ取得の、どちらでもすぐに修正できるようにしているつもりです。
# APIのPythonラッパーをインポート from oandapyV20 import API import oandapyV20.endpoints.positions as positions import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIに接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- tickets = {} res = positions.PositionList(accountID=accountID) api.request(res) # print(json.dumps(res.response['positions'], indent=2)) for rsp in res.response['positions']: currency = rsp['instrument'] for kind in (["long", "short"]): units = int(rsp[kind]['units']) if units != 0 : for tradeID in rsp[kind]['tradeIDs']: averagePrice = rsp[kind]['averagePrice'] unrealizedPL = rsp[kind]['unrealizedPL'] tickets[tradeID] = {'currency':currency, 'kind':kind, 'units':units, 'averagePrice':averagePrice, 'unrealizedPL':unrealizedPL} import pprint pprint.pprint(tickets) # {'23345': {'averagePrice': '106.873', # 'currency': 'USD_JPY', # 'kind': 'long', # 'units': 30000, # 'unrealizedPL': '19279.0000'}, # '23417': {'averagePrice': '106.873', # 'currency': 'USD_JPY', # 'kind': 'long', # 'units': 30000, # 'unrealizedPL': '19279.0000'}}
建玉の詳細
import oandapyV20.endpoints.trades as trades
を利用します。
設定はチケット番号のみです。pl
は損益です。
# APIのPythonラッパーをインポート from oandapyV20 import API import oandapyV20.endpoints.trades as trades import settings # OANDA API アクセストークンと口座ID accountID = settings.ACCOUNT_ID access_token = settings.ACCESS_TOKEN # APIに接続 api = API(environment="practice", access_token=access_token) # ----------------------------------------------------------------------- # 設定情報 tradeID = 23345 # ----------------------------------------------------------------------- while True: try: res = trades.TradeDetails(accountID=accountID, tradeID=tradeID) api.request(res) break except Exception as e: messages = e.args[0] dic = ast.literal_eval(messages) if dic['errorCode'] == 'NO_SUCH_TRADE': id = dic['lastTransactionID'] currentUnits = None price = None else: count = self.error_except(e, "get_position_details",count) data = res.response['trade'] currency = data["instrument"] units = int(data['currentUnits']) price = float(data['price']) pl = float(data['unrealizedPL']) print ('tradeID:{} currency:{} price:{} units:{} pl:{}'.format(tradeID, currency, price, units, pl)) # tradeID:23345 currency:USD_JPY price:106.856 units:29000 pl:15805.0
コメント