楽天RSS(楽天証券が提供するAPI)を利用して自動売買システムを構築する際、「既にIDが使用されています」というエラーに遭遇するケースがあります。特に、注文を出した覚えがないのに発生する場合、システムの誤動作やコードの設計に見直しが必要です。本記事では、このエラーの原因とその対処法を、実例を交えて詳しく解説します。
「既にIDが使用されています」エラーの概要
楽天RSSの発注関数(例えば「SendOrder」)を使用して注文処理を行うとき、同一の注文IDを短時間に複数回使用すると、サーバー側で「既にIDが使用されています」とエラーが返ることがあります。
このエラーは、注文の整合性を保つための仕組みであり、特定の注文IDがすでにサーバーに認識された状態で再送信されたことを意味します。
よくある原因とその確認ポイント
- 発注直後に再送信処理が動いている:プログラムのループ処理やエラーリトライ機能によって、同じ注文を連続で送信してしまう。
- 注文完了を確認せずにID再利用している:注文ステータスの確認をせず、別の場面で同じIDを流用してしまっている。
- 非同期処理の中で重複送信:複数スレッドやタイマー処理で同時に注文処理が動いている。
たとえば、以下のようなコードが原因になりやすいです。
For i = 1 To 5
If 条件 Then
Call SendOrder("注文ID01", ...)
End If
Next
上記ではループ中に複数回、同一の注文IDが使われてしまう可能性があります。
正しい注文ID管理の方法
楽天RSSでは「注文ID」はユニークでなければならず、同じIDを使いまわさずに逐次更新していく設計が必要です。たとえば、日付や時刻を元にしたユニークなIDの生成を行うと良いでしょう。
Dim orderID As String
orderID = "ID" & Format(Now, "yyyymmddhhmmss")
また、発注結果が返るまで待機処理を入れ、サーバー応答を確認してから次の注文処理に進むのが基本です。
エラー発生時のリカバリー処理の実装
エラーが返った場合でも、ログを記録し、ユーザーに通知した上で次の注文処理へ移行できるようにしておくと、安定性が向上します。再送信する場合は、新しいIDで再注文することが推奨されます。
また、ログには以下のような情報を残すようにしましょう。
- 注文時刻
- 使用した注文ID
- 注文内容
- 楽天RSSから返された応答コードとメッセージ
楽天証券側の通信遅延にも注意
楽天RSSはあくまでクライアントベースのツールであり、ネットワーク状況によっては応答が遅れることもあります。一度注文を送った後、応答を待たずに次の処理を実行しないように、必ず待機処理を入れるなどの工夫が必要です。
また、楽天証券のサーバー側でのステータス反映が遅れるケースもあるため、一定時間をおいてからステータス確認APIなどで注文状況を取得しましょう。
まとめ:安定運用のために必要な工夫
「既にIDが使用されています」というエラーは、発注IDの管理ミスや処理の重複によって発生します。ユニークなID管理とサーバー応答の確認、そしてログ管理とエラー処理の実装が、安定した自動売買システム運用のカギになります。
トレーディングは1秒の処理ミスが大きな損失につながる世界です。コードと設計に丁寧な見直しを入れ、堅牢な注文システムを構築していきましょう。

こんにちは!利益の管理人です。このブログは投資する人を増やしたいという思いから開設し運営しています。株式投資をメインに分散投資をしています。
コメント