夜のジョブが全部「成功」なのに、注文の通知が届かなかった|同じ PC の作業で処理が17秒から9分に延びた

夜のジョブが全部「成功」なのに、注文の通知が届かなかった|同じ PC の作業で処理が17秒から9分に延びた 開発記録

開発記録(第13回)。AI に日本株の売買判断をさせる投資システム investTool を個人で開発しています。全体像は目次記事にまとめています。

この記事の位置づけ:段階3(通知・仮想売買)の稼働確認の話

この記事の要点
  • 売買判定のジョブが、同じ PC の重い作業のせいで17秒から約9分に延びました
  • 後に続く通知のジョブは判定の終わりを待たずに動き、「0件送信」のまま成功で終わりました。エラーはどこにも出ていません
  • ほかに、Bot の再起動の確かめ方と、Discord の入力フォームの制約でもつまずきました

動作環境

項目 内容
実行する場所 自宅の Windows PC。定時の処理は Windows のタスクスケジューラで起動
言語 Python 3.12(uv で管理)
通知 Discord(Bot とボタン)

やりたかったこと

第8回で書いたとおり、仮想売買の稼働確認は1日目に表示の不具合が見つかり、直したので数え直しになりました。「手作業の修正なしで10営業日続けて回る」ことを確かめ直す、その初日が2026年9月24日です。

平日の夜は、次の順にジョブが動きます。

時刻 ジョブ 内容
21:00 スクリーニング 売買ルールに合う銘柄を選ぶ
21:10 仮想売買の判定 翌営業日の注文の指示を作る。いつもは17秒ほど
21:15 注文の通知 まだ送っていない注文の指示を Discord に送る
21:30 日次レポート その日の結果を送る

つまずいた点と解決

1. 判定が9分かかり、通知が先に動いた

症状
夜のジョブはすべて成功で終わったのに、その日の注文の指示4件が Discord に届かなかった
原因
同じ PC の重い作業で判定が約9分かかり、21:15 の通知のジョブが判定の終わりを待たずに動いた
対処
その日は画面から回答した。判定の時間帯(21:00〜21:30)は、同じ PC で重い作業をしないことにした

この日は21時ごろから、同じ PC で画面のビルド(Next.js の本番ビルド)を動かしていました。使い方マニュアルに載せる画面を撮るためです。

実行記録を見ると、次の順に動いていました。

21:10 の判定は 21:13 に始まり 21:22 まで続いた。21:15 の予定だった通知は 21:19 に動き、その時点では注文の指示がまだなかった

時刻 起きたこと
21:13:56 判定が始まる(予定より約4分遅れ)
21:19:43 通知のジョブが動く。送る注文の指示がないので「0件送信」で成功
21:22:58 判定が注文の指示を4件作る
21:22:59 判定が終わる。所要542秒

通知のジョブは「まだ送っていない注文の指示」を探して送ります。探した時点ではまだ1件もなかったので、正常に0件を送って終わりました。後から作られた4件は、誰にも送られないまま残りました。

気づいたのは23時過ぎ、稼働確認の記録を付けるために実行記録を見たときです。ジョブの状態はすべて成功で、エラーの通知もありません。通知の件数が0だったことだけが手がかりでした。

原因は仕組みにあります。ジョブの二重起動を防ぐロックはジョブ名ごとにかかるので、別のジョブの終わりは待ちません。判定がいつも17秒で終わるので、5分の間隔で困ることがありませんでした。

その日は、翌朝9時の締め切りまでに Web の画面から4件に回答しました。ジョブを手で動かし直すことはしていません。稼働確認の規則では「送信に失敗したがジョブは続いた」場合は1日として数えるので、この日も数えることにしました。

前のジョブが終わっているかを確かめてから動く仕組みは、次の段階(AI の判断を加える段階)で時間割を組み直すときに入れる予定です。AI の処理は時間が読めないので、どのみち必要になります。それまでは、21時台に同じ PC で重い作業をしないことで避けています。

2. プロセスの一覧で、Bot が二重に動いているように見えた

症状
Get-Process python で見ると、前日と当日に起動した python が2組あり、古い Bot が残っているように見えた
原因
前日の2つは VS Code の拡張機能(isort)だった。uv の仮想環境の python は、1つのコマンドで2つのプロセスになる
対処
プロセス名ではなく、コマンドラインに invest.exe bot を含むものだけを表示するようにした

コードを直した後は、常駐している Bot も再起動しないと古いコードのまま動き続けます。再開の前に、Bot のプロセスの起動時刻を Get-Process python で確かめる手順にしていました。

表示されたのは、前日 18:50 と当日 20:51 に起動した2組でした。前日の組が古い Bot なら、同じ Bot が2つ同時に Discord に接続していることになります。

コマンドラインまで表示すると、前日の2つは VS Code の拡張機能の isort が動かしている python でした。プロジェクトの仮想環境の python を使うので、プロセス名だけでは区別が付きません。

もう1つ紛らわしかったのが、1つのコマンドが2つのプロセスに見えることです。uv の仮想環境の python.exe は、実体の python を子プロセスとして起こします。Bot 1つにつき2つ出るのが正常でした。

手順書のコマンドは、次のように直しました。

Get-CimInstance Win32_Process -Filter "Name='python.exe'" |
  Where-Object CommandLine -like '*invest.exe*bot*' |
  Select-Object ProcessId, CreationDate

3. Discord の入力欄が足りず、損切りと利確を1つの欄にまとめていた

症状
「発注した」のフォームで、損切りと利確が1つの欄にあり、使い方が分からなかった
原因
Discord の入力フォームには、欄を5つまでしか置けない
対処
その場では直さず、使い方マニュアルに書き方を載せた。画面から回答すれば欄は分かれている

注文の指示には「発注した」「見送った」のボタンがあり、押すと実際に出した注文を記録するフォームが開きます。記録したいのは、価格・数量・損切り・利確・判断理由・理由のタグと確信度の6つでした。

Discord のフォームは欄が5つまでなので、損切りと利確を1つの欄にまとめています。書き方は 損切り / 利確1, 利確2(例:2710 / 3130, 3270)です。作った側は分かっていても、使う側から「損切りと利確は1つずつ欄が要るのでは」と聞かれました。

直すとコードの修正になり、稼働確認がまた数え直しになります。そのため欄の名前は変えず、使い方マニュアルに書き方を載せました。Web の画面から回答する場合は、欄が分かれています。

実際にどう使っているか

稼働確認の初日は、この3つのほかは予定どおりに進みました。2日目(9月25日)は、判定が17秒で終わり、注文の指示3件が21:15に届いています。

1つ目の件の後は、毎朝の確認で「ジョブが成功したか」に加えて、通知の件数と注文の指示の件数が合っているかも見ています。成功の表示だけでは、この日の問題は見つかりませんでした。


前回:WordPress の表示でつまずいた5点|リンクの変換、日本語の太字、共有用の画像、テーマの部品の流用

次回:損切りを3円下に置いた取引は、買ったその日に終わった|損切りの幅と R 倍数

当サイトは情報提供を目的としており、投資助言を行うものではありません。掲載している売買記録は仮想売買(ペーパートレード)であり、実際の取引の結果ではありません。投資判断はご自身の責任で行ってください。詳しくは免責事項をご覧ください。

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