primary について
Primary Trading Platform を通じてアルゼンチンの Matba ROFEX 先物・オプション市場に接続する取引 API です。先物、オプション、株式、債券、CEDEARs の市場データ、注文、口座リスク情報を扱う連携機能の開発者向けです。
主な機能
- 01市場セグメントと銘柄詳細の一覧
- 02リアルタイムスナップショットと過去約定の取得
- 03注文の送信、変更、取消、照会
- 04WebSocket による注文レポート受信
- 05口座ポジションとリスクレポートへのアクセス
活用シーン
- 01Matba ROFEX の市場データ連携の構築
- 02先物またはオプション注文の発注と追跡
- 03口座ポジションと証拠金情報の監視
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gauss314/ skills --skill primaryインストール後、Claude Code で/primaryを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/REFERENCE.mdscripts/check_account.pycheck_positions.pyinstruments.pymarket_data.pyplace_order.pywebsocket_md.pywebsocket_orders.pywebsocket_send_order.py詳細
Primary — Matba ROFEX 取引 API
Primary Trading Platform(PTP)を通じて、アルゼンチン先物・オプション市場(Matba ROFEX)で取引するための API です。先物(ドル、大豆、小麦、トウモロコシ、指数)、先物オプション、株式、債券、CEDEAR に対応しています。
Base URL: https://api.remarkets.primary.com.ar
ドキュメント: github.com/matbarofex — オープンソースのサンプルを含む公式リポジトリです。
認証
認証情報の取得
| 環境 | URL | 説明 |
|---|---|---|
| REMARKET(デモ) | remarkets.primary.ventures | ペーパートレード用の無料アカウントを作成します |
| LIVE(本番環境) | [email protected] に問い合わせる | MPI チームにアクセスを申請します |
REMARKET アカウントを作成すると、次の情報を取得できます。
- ユーザー名:登録したユーザー名
- パスワード:設定したパスワード
- アカウント:アカウント番号(通常はユーザー名の末尾の数字に
REMを付けたものです)
トークンの取得
import requests
r = requests.post("https://api.remarkets.primary.com.ar/auth/getToken",
headers={"X-Username": tu_usuario, "X-Password": tu_password})
token = r.headers["X-Auth-Token"]
以降、すべてのリクエストでトークンを X-Auth-Token ヘッダーとして送信します。
⚠️ 認証情報をハードコードしないでください。環境変数または CLI パラメーターを使用してください。
import os
TOKEN = os.getenv("PRIMARY_TOKEN") # Opcional: cachear token
USER = os.getenv("PRIMARY_USER")
PASS = os.getenv("PRIMARY_PASSWORD")
ACCOUNT = os.getenv("PRIMARY_ACCOUNT") # Ej: 12345 o REM12345
トークンの更新
401 が返された場合、トークンの有効期限が切れています。/auth/getToken に新しい POST を送信して更新してください。
セグメント
市場はセグメント(取引市場)で構成されています。各銘柄は 1 つのセグメントに属します。
| セグメント | 説明 |
|---|---|
DDF | 金融デリバティブ(ドル先物、指数) |
DDA | 農産物デリバティブ(大豆、小麦、トウモロコシ) |
DUAL | 両方の部門に上場している銘柄 |
MERV | Matba ROFEX 外部の市場(BYMA) |
MAE | 電子取引市場 |
TEST | テスト環境 |
U-DDF、U-DDA、U-DUAL、U-FIN、U-COMM、U-STOCK | ユーザーのサブセグメント |
TIVA、AVS | その他のセグメント |
セグメントの一覧表示
GET https://api.remarkets.primary.com.ar/rest/segment/all
r = requests.get("https://api.remarkets.primary.com.ar/rest/segment/all",
headers={"X-Auth-Token": token})
print(r.json()["segments"])
レスポンス:
{"status":"OK","segments":[
{"marketSegmentId":"DDF","marketId":"ROFX"},
{"marketSegmentId":"DDA","marketId":"ROFX"},
...
]}
銘柄(Securities)
銘柄はシンボルと marketId で識別されます。例:
| シンボル | 説明 | CFI コード |
|---|---|---|
DLR/JUN26 | 2026 年 6 月限ドル先物 | FXXXSX |
SOJ.ROS/MAY26 | 2026 年 5 月限ロサリオ大豆先物 | FXXXSX |
DLR/JUN26 1460 C | ドル先物のコールオプション | OCAFXS |
DLR/JUN26 1420 P | ドル先物のプットオプション | OPAFXS |
GGAL | Grupo Galicia 株式 | ESXXXX |
すべての銘柄
GET https://api.remarkets.primary.com.ar/rest/instruments/all
詳細情報付きの銘柄
GET https://api.remarkets.primary.com.ar/rest/instruments/details
次の情報を返します:symbol、segment、lowLimitPrice、highLimitPrice、minPriceIncrement、minTradeVol、maxTradeVol、tickSize、contractMultiplier、roundLot、maturityDate、currency、orderTypes、timesInForce、cficode。
銘柄の詳細
GET https://api.remarkets.primary.com.ar/rest/instruments/detail?symbol=DLR/JUN26&marketId=ROFX
CFI コード別
GET https://api.remarkets.primary.com.ar/rest/instruments/byCFICode?CFICode=FXXXSX
| CFI コード | 種類 |
|---|---|
FXXXSX | 先物 |
FXXXXX | 先物(汎用) |
OCAFXS | 先物のコールオプション |
OPAFXS | 先物のプットオプション |
OCEFXS | 先物のヨーロピアン・コールオプション |
OPEFXS | 先物のヨーロピアン・プットオプション |
ESXXXX | 株式 |
DBXXXX | 債券 |
EMXXXX | CEDEAR |
OCASPS | 株式のコールオプション |
OPASPS | 株式のプットオプション |
DBXXFR | 交渉可能債券 |
セグメント別
GET https://api.remarkets.primary.com.ar/rest/instruments/bySegment?MarketSegmentID=DDF&MarketID=ROFX
マーケットデータ
リアルタイム(REST スナップショット)
GET https://api.remarkets.primary.com.ar/rest/marketdata/get
?marketId=ROFX
&symbol=DLR/JUN26
&entries=BI,OF,LA,OP,CL,SE,OI
&depth=3
| エントリー | 意味 |
|---|---|
BI | Bids(板の買い注文) |
OF | Offers(板の売り注文) |
LA | Last(直近約定価格) |
OP | Opening Price(始値) |
CL | Closing Price(前取引日の終値) |
SE | Settlement Price(清算価格、先物のみ) |
HI | High Price(取引日の最高値) |
LO | Low Price(取引日の最安値) |
TV | Trade Volume(約定枚数) |
OI | Open Interest(建玉、先物のみ) |
IV | Index Value(指数のみ) |
EV | Effective Volume(BYMA のみ) |
NV | Nominal Volume(BYMA のみ) |
ACP | Auction Price(当日の終値) |
r = requests.get("https://api.remarkets.primary.com.ar/rest/marketdata/get",
headers={"X-Auth-Token": token},
params={"marketId": "ROFX", "symbol": "DLR/JUN26",
"entries": "BI,OF,LA,OP,CL,SE,OI", "depth": 3})
data = r.json()["marketData"]
print(f"Bid: {data['BI']} | Offer: {data['OF']}")
print(f"Last: {data['LA']} | Settle: {data['SE']}")
履歴(約定)
GET https://api.remarkets.primary.com.ar/rest/data/getTrades
?marketId=ROFX
&symbol=DLR/JUN26
&dateFrom=2026-06-01
&dateTo=2026-06-08
パラメーター:marketId、symbol、date(単一の日付)、dateFrom/dateTo(期間)、external(外部市場の場合)、environment(REMARKETS)。
r = requests.get("https://api.remarkets.primary.com.ar/rest/data/getTrades",
headers={"X-Auth-Token": token},
params={"marketId": "ROFX", "symbol": "DLR/JUN26",
"date": "2026-06-05"})
trades = r.json()["trades"]
for t in trades[:3]:
print(f"{t['datetime']} {t['price']} {t['size']}")
注文
注文タイプ
| タイプ | 説明 |
|---|---|
LIMIT | 指値注文 |
MARKET | 成行注文 |
STOP_LIMIT | 指値注文として有効になるストップ注文 |
MARKET_TO_LIMIT | 指値注文に変換される成行注文 |
注:STOP_LIMIT と MARKET_TO_LIMIT は、すべての銘柄で利用できるわけではありません。銘柄の詳細で orderTypes を確認してください。
執行条件(TIF)
| TIF | 説明 |
|---|---|
DAY | 当日のみ有効です。取引終了時に失効します |
IOC | 即時約定またはキャンセル |
FOK | 全量約定またはキャンセル |
GTD | 指定日まで有効(expireDate が必要です) |
注文の送信(REST)
GET https://api.remarkets.primary.com.ar/rest/order/newSingleOrder
?marketId=ROFX
&symbol=DLR/JUN26
&side=BUY
&orderQty=10
&ordType=LIMIT
&price=1450.0
&timeInForce=DAY
&account=TU_CUENTA
&cancelPrevious=False
&iceberg=False
パラメーター:
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
marketId | String | ✅ | ROFX |
symbol | String | ✅ | 銘柄のシンボル |
side | String | ✅ | BUY または SELL |
orderQty | Integer | ✅ | 契約数 |
ordType | String | ✅ | LIMIT または MARKET |
price | Float | 条件付き | LIMIT の場合に必須 |
timeInForce | String | いいえ | DAY(デフォルト)、IOC、FOK、GTD |
account | Integer/String | ✅ | 口座番号 |
cancelPrevious | Boolean | いいえ | 同一契約・同一売買方向の以前の注文をキャンセルします |
iceberg | Boolean | いいえ | Iceberg 注文(デフォルト:false) |
displayQty | Integer | 条件付き | 表示する数量(Iceberg 注文の場合) |
expireDate | Date | 条件付き | GTD の場合に必須(形式:YYYYMMDD) |
応答:
{"status":"OK","order":{"clientId":"21581341758","proprietary":"PBCP"}}
clientId は、注文の照会やキャンセルに使用する clOrdId(Client Order ID)です。
注文の送信(WebSocket)
{"type":"no","product":{"marketId":"ROFX","symbol":"DLR/JUN26"},
"price":185,"quantity":23,"side":"BUY","account":"20","iceberg":false}
WebSocket 経由で注文を識別するには、wsClOrdId を含めます:
{"type":"no","product":{"marketId":"ROFX","symbol":"DLR/JUN26"},
"price":185,"quantity":23,"side":"BUY","account":"20",
"iceberg":false,"wsClOrdId":"mioid-unico-123"}
WebSocket 応答(Execution Report):
{"type":"or","orderReport":{"orderId":"1128056","clOrdId":"user14545...",
"status":"PENDING_NEW","text":"Enviada","wsClOrdId":"mioid-unico-123"}}
重要:
wsClOrdIdは最初の Execution Report にのみ表示されます。それ以降の追跡には、返されたclOrdIdを使用してください。
注文の変更
GET https://api.remarkets.primary.com.ar/rest/order/replaceById
?clOrdId=user144733478280357
&proprietary=api
&price=17
&orderQty=10
注文のキャンセル
GET https://api.remarkets.primary.com.ar/rest/order/cancelById
?clOrdId=ajduj3l13ieci2jr4ck
&proprietary=PBCP
WebSocket によるキャンセル
{"type":"co","clientId":"user114121092035207","proprietary":"PBCP"}
注文ステータスの照会(REST)
| エンドポイント | 説明 |
|---|---|
GET /rest/order/id?clOrdId=...&proprietary=api | リクエストの最新ステータス |
GET /rest/order/allById?clOrdId=...&proprietary=api | リクエストのすべてのステータス |
GET /rest/order/byOrderId?orderId=... | Order ID によるステータス |
GET /rest/order/actives?accountId=10 | 有効な注文(NEW または PARTIALLY_FILLED) |
GET /rest/order/filleds?accountId=10 | 全量または一部約定した注文 |
GET /rest/order/all?accountId=10 | 口座のすべてのステータス |
GET /rest/order/byExecId?execId=T1234567 | Execution ID によるステータス |
Execution Reports(WebSocket)
口座を購読します:
{"type":"os","account":{"id":"40"}}
複数の口座:
{"type":"os","accounts":[{"id":"40"},{"id":"4000"}]}
すべての口座:
{"type":"os"}
有効な注文のみ:
{"type":"os","snapshotOnlyActive":true}
Risk API
Risk API はトークンではなく、同じユーザー名/パスワードを使った HTTP Basic Auth を使用します。X-Auth-Token に加えて、Authorization: Basic <base64> ヘッダーが必要です。
import base64
auth = base64.b64encode(f"{user}:{password}".encode()).decode()
headers = {"X-Auth-Token": token, "Authorization": f"Basic {auth}"}
口座のポジション
GET https://api.remarkets.primary.com.ar/rest/risk/position/getPositions/{accountName}
r = requests.get(f"https://api.remarkets.primary.com.ar/rest/risk/position/getPositions/TU_CUENTA",
headers=headers)
positions = r.json()["positions"]
for p in positions:
print(f"{p['symbol']} Buy:{p['buySize']} Sell:{p['sellSize']} Diff:{p['totalDiff']}")
詳細ポジション
GET https://api.remarkets.primary.com.ar/rest/risk/detailedPosition/{accountName}
銘柄ごとの内訳を返します。項目は contractType、marketPrice、currency、exchangeRate、contractMultiplier、buyCurrentSize、sellCurrentSize、detailedDailyDiff です。
口座レポート
GET https://api.remarkets.primary.com.ar/rest/risk/accountReport/{accountName}
import base64
auth = base64.b64encode(f"{user}:{password}".encode()).decode()
headers = {"X-Auth-Token": token, "Authorization": f"Basic {auth}"}
r = requests.get(f"https://api.remarkets.primary.com.ar/rest/risk/accountReport/TU_CUENTA",
headers=headers)
data = r.json()["accountData"]
print(f"Colateral: {data['collateral']}")
print(f"Margen: {data['margin']}")
print(f"Disponible: {data['availableToCollateral']}")
# Saldos por moneda
for moneda, saldo in data['detailedAccountReports']['0']['currencyBalance']['detailedCurrencyBalance'].items():
print(f" {moneda}: consumido={saldo['consumed']} disponible={saldo['available']}")
WebSocket
URL: wss://api.remarkets.primary.com.ar/
WebSocket API は非同期メッセージを受信します。接続時にトークンを ヘッダー として送信します。
import websocket
ws = websocket.WebSocketApp(
"wss://api.remarkets.primary.com.ar/",
header=[f"X-Auth-Token: {token}"],
on_open=on_open,
on_message=on_message,
...
)
ws.run_forever()
メッセージの形式は次のとおりです。
| type | 意味 |
|---|---|
no | 新規注文(注文を送信) |
co | 注文取消(注文を取り消し) |
or | 注文レポート(受信した執行レポート) |
os | 注文サブスクリプション(レポートを購読) |
smd | マーケットデータを購読 |
Md | マーケットデータ(受信) |
WebSocket によるマーケットデータ
{"type":"smd","level":1,"entries":["OF","BI","LA"],
"products":[{"symbol":"DLR/JUN26","marketId":"ROFX"}],"depth":2}
応答:
{"type":"Md","instrumentId":{"marketId":"ROFX","symbol":"DLR/JUN26"},
"marketData":{"OF":[{"price":189,"size":21},{"price":188,"size":13}]}}
注文の状態
| 状態 | 意味 |
|---|---|
PENDING_NEW | 市場に送信済みで、まだ処理されていません |
NEW | 承認済みで、板で有効です |
PARTIALLY_FILLED | 一部約定しています |
FILLED | 全数量が約定しています |
CANCELLED | 取り消されました |
REJECTED | 拒否されました(理由は text を確認してください) |
PENDING_CANCEL | 取消処理中です |
PENDING_REPLACE | 置換処理中です |
REPLACED | 置換されました |
PENDING_APPROVAL | 承認待ちです |
よくあるエラー
| エラー | 原因 | 解決方法 |
|---|---|---|
| 401 Unauthorized | トークンが無効または期限切れです | /auth/getToken で更新します |
"No tiene acceso a la cuenta" | Account ID が正しくありません | accountId を確認します |
"Product doesn't exist" | Symbol が正しくありません | instruments/all でシンボルを確認します |
"Access Denied" | エンドポイントを利用する権限がありません | セグメント/メソッドを確認します |
"Ruta invalida" | エンドポイントが存在しません | URL を確認します |
| Bid/Offer が空 | 市場が閉まっているか、流動性がありません | 取引時間中に確認します |
サンプルスクリプト
./scripts/ を参照してください。
# Autenticación y token (opcional, los scripts hacen login automático)
export PRIMARY_USER="tu_usuario"
export PRIMARY_PASSWORD="tu_password"
export PRIMARY_ACCOUNT="TU_CUENTA"
# Listar segmentos e instrumentos
python scripts/instruments.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD
# Market data de un futuro
python scripts/market_data.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--symbol DLR/JUN26 --entries BI,OF,LA
# Ver reporte de cuenta
python scripts/check_account.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--account TU_CUENTA
# Ver posiciones
python scripts/check_positions.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--account TU_CUENTA
# Enviar orden (¡cuidado! orden real en live)
python scripts/place_order.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--symbol DLR/JUN26 --side BUY --qty 1 --type LIMIT --price 1450 --account TU_CUENTA
# WebSocket: Market Data en tiempo real
python scripts/websocket_md.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--symbols DLR/JUN26 --entries BI,OF,LA --depth 3
# WebSocket: Execution Reports
python scripts/websocket_orders.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--account TU_CUENTA
# WebSocket: Enviar orden (requiere suscripción a execution reports aparte)
python scripts/websocket_send_order.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--symbol DLR/JUN26 --side BUY --qty 1 --type LIMIT --price 1450 --account TU_CUENTA
# WebSocket: Cancelar orden
python scripts/websocket_send_order.py --user $PRIMARY_USER --password $PRIMARY_PASSWORD \
--cancel --clordid user12345... --proprietary PBCP
フィールド用語集
| フィールド | 説明 |
|---|---|
clOrdId | Client Order ID — 市場へのリクエスト ID |
orderId | Order ID — 市場での注文 ID |
execId | Execution ID — 個別の約定 ID |
proprietary | 注文を送信した FIX ユーザー(PBCP または ISV_PBCP) |
wsClOrdId | WebSocket で送信された注文 ID(1 回目のレポートのみ) |
avgPx | 約定平均価格 |
cumQty | 累計約定数量 |
leavesQty | 残数量 |
lastPx | 最終約定価格 |
lastQty | 最終約定数量 |
transactTime | 取引日時 |
tickSize | 数量の最小刻み |
minPriceIncrement | 価格の最小刻み(ティック価格) |
contractMultiplier | 契約乗数 |
maturityDate | 満期日 |
priceConvertionFactor | 単価換算係数 |
lowLimitPrice | 価格の下限 |
highLimitPrice | 価格の上限 |