mcpField
P
primary

primary

github.com/gauss314其他252220 次安装19 周前更新
代码仓库

关于 primary

通过 Primary Trading Platform 接入阿根廷 Matba ROFEX 期货与期权市场的交易 API,面向开发市场数据、订单及账户风险信息集成的开发者,支持期货、期权、股票、债券和 CEDEARs。

主要功能

  1. 01列出市场分段与工具详情
  2. 02获取实时快照和历史成交
  3. 03提交、替换、取消及查询订单
  4. 04通过 WebSocket 接收订单报告
  5. 05访问账户持仓与风险报告

适用场景

  1. 01构建 Matba ROFEX 行情数据集成
  2. 02下达并跟踪期货或期权订单
  3. 03监控账户持仓与保证金信息

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/gauss314/skills --skill primary

安装后在 Claude Code 中输入/primary确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
REFERENCE.md
scripts/
check_account.py
check_positions.py
instruments.py
market_data.py
place_order.py
websocket_md.py
websocket_orders.py
websocket_send_order.py

详细介绍

Primary — Matba ROFEX 交易 API

通过 Primary Trading Platform (PTP) 在阿根廷期货与期权市场(Matba ROFEX)进行交易的 API。支持期货(美元、大豆、小麦、玉米、指数)、期货期权、股票、债券和 CEDEARs。

Base URL: https://api.remarkets.primary.com.ar

文档: github.com/matbarofex — 官方开源示例仓库。


身份验证

获取凭据
环境URL描述
REMARKET(演示)remarkets.primary.ventures创建免费账户以进行模拟交易
LIVE(生产)联系 [email protected]向 MPI 团队申请访问权限

创建 REMARKET 账户后,你将获得:

  • 用户名:你注册时使用的用户名
  • 密码:你设置的密码
  • Account:你的账户号码(通常为 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 请求以续期。


交易板块

市场按交易板块(交易时段)组织。每种工具都属于一个交易板块。

交易板块描述
DDF金融衍生品(美元、指数期货)
DDA农产品衍生品(大豆、小麦、玉米)
DUAL在两个分区上市的工具
MERVMatba 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 Code
DLR/JUN262026 年 6 月美元期货FXXXSX
SOJ.ROS/MAY262026 年 5 月罗萨里奥大豆期货FXXXSX
DLR/JUN26 1460 C美元期货看涨期权OCAFXS
DLR/JUN26 1420 P美元期货看跌期权OPAFXS
GGALGrupo 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 Code 查询
GET https://api.remarkets.primary.com.ar/rest/instruments/byCFICode?CFICode=FXXXSX
CFI Code类型
FXXXSX期货
FXXXXX期货(通用)
OCAFXS期货看涨期权
OPAFXS期货看跌期权
OCEFXS欧式期货看涨期权
OPEFXS欧式期货看跌期权
ESXXXX股票
DBXXXX债券
EMXXXXCEDEAR
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买价(订单簿中的买入报价)
OF卖价(订单簿中的卖出报价)
LA最新价(最后成交价)
OP开盘价
CL收盘价(上一交易日收盘价)
SE结算价(仅限期货)
HI最高价(当日最高价)
LO最低价(当日最低价)
TV成交量(合约数量)
OI未平仓量(仅限期货)
IV指数值(仅限指数)
EV有效成交量(仅限 BYMA)
NV名义成交量(仅限 BYMA)
ACP集合竞价价格(当日收盘价)
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

参数:

参数类型必填描述
marketIdString✅ROFX
symbolString✅工具代码
sideString✅BUY 或 SELL
orderQtyInteger✅合约数量
ordTypeString✅LIMIT 或 MARKET
priceFloat条件必填LIMIT 类型必填
timeInForceString否DAY(默认)、IOC、FOK、GTD
accountInteger/String✅账户编号
cancelPreviousBoolean否取消同一合约、同一方向的先前订单
icebergBoolean否冰山订单(默认:false)
displayQtyInteger条件必填显示数量(用于冰山订单)
expireDateDate条件必填GTD 必填(格式:YYYYMMDD)

响应:

{"status":"OK","order":{"clientId":"21581341758","proprietary":"PBCP"}}

clientId 是用于查询/取消订单的 clOrdId(客户端订单 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 响应(执行报告):

{"type":"or","orderReport":{"orderId":"1128056","clOrdId":"user14545...",
 "status":"PENDING_NEW","text":"Enviada","wsClOrdId":"mioid-unico-123"}}

重要: wsClOrdId 仅出现在第一条执行报告中。之后应使用返回的 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=...按订单 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按执行 ID 查询状态
执行报告(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含义
noNew Order(发送订单)
coCancel Order(取消订单)
orOrder Report(收到的执行报告)
osOrder Subscription(订阅报告)
smdSubscribe Market Data(订阅市场数据)
MdMarket Data(收到的市场数据)
通过 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 检查 symbol
"Access Denied"没有该端点的权限检查 segment/method
"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

字段术语表

字段描述
clOrdIdClient Order ID — 发送至市场的请求 ID
orderIdOrder ID — 市场中的订单 ID
execIdExecution ID — 单笔成交的 ID
proprietary发送订单的 FIX 用户(PBCP 或 ISV_PBCP)
wsClOrdId通过 WebSocket 发送的订单 ID(仅出现在第 1 份报告中)
avgPx平均成交价格
cumQty累计成交数量
leavesQty剩余数量
lastPx最新成交价格
lastQty最新成交数量
transactTime交易日期和时间
tickSize最小数量增量
minPriceIncrement最小价格增量(价格跳动单位)
contractMultiplier合约乘数
maturityDate到期日
priceConvertionFactor单位价格换算系数
lowLimitPrice最低价格限制
highLimitPrice最高价格限制

评论

支持 Markdown