目的
積立NISAの話をしていたら、母から「為替やってみたら?」と言われたので、任意の為替レートより下回ったり上回った場合にteamsに通知をするようなアプリを作成する事にした
完成形
設定ファイルの書き方
下のファイルの様に、プログラムを指定し、第1引数に価格を指定する。第2引数にdownかupを指定する事によってその価格より下回ったか上回った時に通知をするか指定する。
以下の場合だと
- 1ドル価格が154.9ドルを上回った場合
or - 1ドル価格が156.93ドルを下回った場合
の時に通知される様になる。通知する条件はいくらでも増やす事が可能である。
#!/bin/bash
source /home/shoma/money/bin/activate
process1(){
/home/shoma/money/mon2.py 154.9 up
}
process2(){
/home/shoma/money/mon2.py 156.93 down
}
# 各プロセスをバックグラウンドで起動する
process1 &
pid1=$!
process2 &
pid2=$!
# 各プロセスの終了を待つ
wait $pid1
wait $pid2
echo "全てのプロセスが完了しました。"
作り方
- mon.py (通知プログラム本体)
- money.sh (通知プログラム呼び出しスクリプト)
- mon.service (通知プログラム呼び出しスクリプト管理用ファイル)
mon.py
mon.pyimport requests
def download_file(url, local_filename):
# URLからファイルをダウンロード
with requests.get(url) as response:
response.raise_for_status() # エラーチェック
with open(local_filename, 'wb') as file:
file.write(response.content)
def extract_fields_from_third_line(file_path):
# ファイルから3行目を取り出し、13フィールド目と14フィールド目を抽出
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
if len(lines) >= 3:
third_line = lines[2]
fields = third_line.split() # スペースでフィールドを分割
if len(fields) >= 14:
return fields[12], fields[13] # インデックスは0から始まるため12 と13を使用
else:
return "3行目に14フィールドが存在しません。", None
else:
return "ファイルには3行目が存在しません。", None
# ファイルのURLと保存先のパスを指定
url = "https://www.rakuten-sec.co.jp/web/fx/RateData/RateData.dat"
local_filename = 'RateData.dat'
# ファイルをダウンロード
download_file(url, local_filename)
# 3行目から13フィールド目と14フィールド目を抽出して表示
field13, field14 = extract_fields_from_third_line(local_filename)
print(f"売値: {field13}")
print(f"買値: {field14}")
money.sh
以下の様にシェルから呼び出す事によって、複数条件で通知をする事が出来る様になる。
#!/bin/bash
source /home/shoma/money/bin/activate
process1(){
/home/shoma/money/mon2.py 154.9 up
}
process2(){
/home/shoma/money/mon2.py 156.93 down
}
# 各プロセスをバックグラウンドで起動する
process1 &
pid1=$!
process2 &
pid2=$!
# 各プロセスの終了を待つ
wait $pid1
wait $pid2
echo "全てのプロセスが完了しました。"
mon.service
pythonのプログラムをシェルスクリプトから呼び出し、systemdで管理する事にする。
ubuntuの場合、ファイルは/etc/systemd/system
配下に配置する。
mon.service
[Unit]
Description = 為替レート通知用プログラム管理
[Service]
Type=simple
User=root
Group=root
TimeoutStartSec=0
Restart=on-failure
RestartSec=30s
ExecStart = /home/shoma/money/money.sh
[Install]
WantedBy = multi-user.target
プログラム起動
systemctl daemon-reload
systemctl start mon
ステータス確認
systemctl status mon
起動確認
● mon.service - 為替レート通知用プログラム管理
Loaded: loaded (/etc/systemd/system/mon.service; disabled; preset: enabled)
Active: active (running) since Tue 2024-05-28 19:07:40 JST; 1s ago
Main PID: 75309 (money.sh)
Tasks: 11 (limit: 3910)
CPU: 2.386s
CGroup: /system.slice/mon.service
tq75309 /bin/bash /home/shoma/money/money.sh
tq75310 /bin/bash /home/shoma/money/money.sh
tq75311 /bin/bash /home/shoma/money/money.sh
tq75312 python /home/shoma/money/mon2.py 156.93 down
mq75313 python /home/shoma/money/mon2.py 154.9 up
May 28 19:07:40 raspberrypi systemd[1]: Started mon.service - 為替レート通知用プログラム管理.
マシン起動時にプログラムを自動起動する
以下の様にする事でマシン起動時に自動的にプログラムを起動する事が出来る。
systemctl enable mon
終わりに
デイトレーダーは、変わりゆく価格を常に追いたいと思います。既存のアプリを設定するのはめんどうだったので、自分で作ってみました。しばらく使ってみたいと思います。
反響が大きければ、teamsとpythonの接続等、もう少し詳細を書いて行きます。