建玉の一覧
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

コメント