OANDA API 建玉の取得

スポンサーリンク
スポンサーリンク

建玉の一覧

3種類の方法がありますが、tradesを使った方法が一番簡単でスッキリしています。

tradesを使った方法

res = trades.OpenTrades(accountID)
api.request(res)

trades.OpenTradesaccountIDを渡すだけです。

  • 売りの場合は、建玉数がマイナスになります。
  • 建玉がない場合は、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.OpenTradesaccountIDを渡すだけです。

  • 買い(long)と売り(short)を個別に返してきますが、両建てできませんので意味がないと思います。
  • 建玉がない場合は、空のpositionslastTransactionIDを返してきます。

システム例

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

 

コメント

タイトルとURLをコピーしました