From 98071a8ee33a732105a0d68281b3936ca74e190e Mon Sep 17 00:00:00 2001 From: agentson Date: Sat, 21 Feb 2026 03:12:00 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=95=B4=EC=99=B8=EC=A3=BC=EC=8B=9D=20?= =?UTF-8?q?=EB=AA=A8=EC=9D=98=ED=88=AC=EC=9E=90=20SELL=20TR=5FID=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20VTTT1006U=20=E2=86=92?= =?UTF-8?q?=20VTTT1001U=20(#189)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KIS 공식 문서(20260221) '해외주식 주문' 시트 확인 결과: - 모의투자 미국 매수: VTTT1002U (기존 정상) - 모의투자 미국 매도: VTTT1001U (기존 VTTT1006U → 잘못된 TR_ID) VTTT1006U는 존재하지 않는 TR_ID로, 모든 해외 SELL 주문이 "모의투자에서는 해당업무가 제공되지 않습니다." 오류로 거부되었음. Co-Authored-By: Claude Sonnet 4.6 --- src/broker/overseas.py | 4 +++- tests/test_overseas_broker.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/broker/overseas.py b/src/broker/overseas.py index 3d37acb..fe9d448 100644 --- a/src/broker/overseas.py +++ b/src/broker/overseas.py @@ -230,7 +230,9 @@ class OverseasBroker: session = self._broker._get_session() # Virtual trading TR_IDs for overseas orders - tr_id = "VTTT1002U" if order_type == "BUY" else "VTTT1006U" + # Source: 한국투자증권 오픈API 전체문서 (20260221) — '해외주식 주문' 시트 + # VTTT1002U: 모의투자 미국 매수, VTTT1001U: 모의투자 미국 매도 + tr_id = "VTTT1002U" if order_type == "BUY" else "VTTT1001U" body = { "CANO": self._broker._account_no, diff --git a/tests/test_overseas_broker.py b/tests/test_overseas_broker.py index 620b98d..08f7fb5 100644 --- a/tests/test_overseas_broker.py +++ b/tests/test_overseas_broker.py @@ -414,7 +414,7 @@ class TestSendOverseasOrder: @pytest.mark.asyncio async def test_sell_limit_order(self, overseas_broker: OverseasBroker) -> None: - """Limit sell order should use VTTT1006U and ORD_DVSN=00.""" + """Limit sell order should use VTTT1001U and ORD_DVSN=00.""" mock_resp = AsyncMock() mock_resp.status = 200 mock_resp.json = AsyncMock(return_value={"rt_cd": "0"}) @@ -428,7 +428,7 @@ class TestSendOverseasOrder: result = await overseas_broker.send_overseas_order("NYSE", "MSFT", "SELL", 5, price=350.0) assert result["rt_cd"] == "0" - overseas_broker._broker._auth_headers.assert_called_with("VTTT1006U") + overseas_broker._broker._auth_headers.assert_called_with("VTTT1001U") call_args = mock_session.post.call_args body = call_args[1]["json"]