公開プログラムのtrailingStop解説します
けっこう、読者の方から技術解説系の記事の反応があるようなので、最近公開した、Pythonで作ったトレーリングストップのプログラムについて、解説の記事を書いていこうと思います。
概念図
メイン処理から、各モジュールを呼び出すかたちで、
- Token取得
- WebSocket(PUSH API)監視銘柄登録
- WebSocket(PUSH API)で株価情報を受信
株価がこれまでの最安値(最高値)から指定しれた価格以上に値上がり(値下がり)していたら終了 - 成行き注文発注
という流れになってます。
数珠繋ぎ方式止めました
最初に作ったプログラムは、
「モジュール間呼び出し時のエラーハンドリング考えるのうぜ~」といって、
モジュールA → モジュールB → モジュールC
と数珠繋ぎで呼び出すようなかたちでプログラムを書いていました。
しかし、上の記事でも書きましたが、数珠繋ぎ方式だと、必然的に一つのモジュールから次のモジュールを呼び出すところが固有の処理になってしまい、モジュールが別のプログラムで再利用できません。
そこで、私は2つ目のプログラムを作るときにもう嫌になってしまい、敢え無く数珠繋ぎ方式は止めることにしました。
メイン→サブ呼び出しという、普通の方式へ変更
そこで私はやはり、kabuステーションの各API呼び出し用のサブモジュールを個別に作り、メインのプログラムから、そのときやりたいロジックによって、各モジュールを呼び出すという、オーソドックスな方式をとることにしました。
そこでポイントとしたことは2つです。
- 各サブAPIの呼び出しは引数を用いず、すべてグローバル変数格納用モジュールの(settings.py)を経由する
- 各サブAPIで何かエラーが発生した場合は、直ちにブログラム自体を終了する
1つめのほうは、前から採用していた考え方です。このことにより、関数のインタフェース(引数)がその時の投資ロジック固有のものにならず、各API用のサブモジュールが再利用しやすいものになります。
2つめのほうは、もともとは私がPythonでの書き方がよくわからなかったもので、しかたなく、数珠繋ぎ方式では、「次のモジュールを呼び出さなかったら自然終了」としていました。
しかし、考えてみたらなんてことはなく、以下のように書けばよいだけでした。
import sys
def サブ関数():
try:
API呼び出し処理
return
except urllib.error.HTTPError as e:
print(e)
content = json.loads(e.read())
pprint.pprint(content)
except Exception as e:
print(e)
sys.exit()
何もなければ、6行目のreturnでメインに処理が戻りますが、何かエラーが発生すれば最後のsys.exit()でプログラムが終了します。
今回のプログラムから、今思うと愚の骨頂としか思いない数珠繋ぎ方式はやめ、メイン→サブ呼び出し方式を採るようにしました。
つづく
コメント