トレーディングBotをマルチプロセス化する、ほぼ最小のPython実装
マルチプロセス構造の小さな実用例です。Bot開発のお供にどうぞ。
価値を感じたら、サポート・投げ銭・購入などで応援をお願いします。
(記事自体は無料部分で全てです)
概要:
価格取得 / ロジック動作 / 注文処理について、それぞれ専用のプロセスを起動し、連携して動作させます。
プロセス間のデータのやりとりには、標準モジュールに含まれる multiprocessing.Manager という専用の仕組みを使っています。
スレッドとの違い:
Pythonではスレッドを複数立ち上げることはできますが、ファイルの読み込みなどのI/O処理を除き、実質使えるCPUコアは1つに制限されています。
マルチプロセス実装にすると「Websocketから大量のデータを受け取りつつ、ロジック計算もしつつ、注文も出す」という動作を同時に実行でき、トータルの反応速度を上げることができます。
※t2.micro 等の 1CPU 環境では、スレッドに対する優位性は薄いです
下準備:
なし。全て標準モジュールで書いてあります。
実装サンプル:
最後の10行以外はスレッドと同じです。Pythonのこういう所は好き。
#!/usr/bin/python3
# coding: utf-8
#----------------------------------------------------------
# BTC tip先:36ds4QZByQ1PdA2MXtQ8EGg4doci5w5hky
#----------------------------------------------------------
import datetime
import random
import time
import queue
# データ受信プロセス(このサンプルではランダムウォーク)
def recv_proc(data):
ltp = 700000
while True:
ltp += random.randrange(-20, 20)
data['ticker'] = { 'ltp': ltp }
time.sleep(0.05)
# データ処理プロセス(終値が100円動いたら取引プロセスにデータを渡す)
def calc_proc(data, cmdq):
while 0 == len(data): time.sleep(1) # データ到着待ち
last_ltp = 0
while True:
time.sleep(0.2)
ltp = data['ticker']['ltp']
if abs(ltp - last_ltp) > 100:
cmdq.put((last_ltp, ltp))
last_ltp = ltp
# 取引プロセス(データが来たら表示、5秒来ない時は'→'を表示)
def deal_proc(data, cmdq):
while True:
try:
last_ltp, ltp = cmdq.get(timeout=5)
print(datetime.datetime.now(), last_ltp, ltp,
'↑' if ltp > last_ltp else '↓')
except queue.Empty:
print(datetime.datetime.now(), '→')
# 全部起動する
if __name__ == '__main__':
import multiprocessing as mp
# プロセス間共有情報の作成
manager = mp.Manager()
data = manager.dict()
cmdq = manager.Queue()
# 各プロセスの起動
mp.Process(target=recv_proc, args=[data], daemon=True).start()
mp.Process(target=calc_proc, args=[data, cmdq], daemon=True).start()
mp.Process(target=deal_proc, args=[data, cmdq], daemon=True).start()
while True: time.sleep(60)
ご武運を!
ここから先は
0字
¥ 100
期間限定!PayPayで支払うと抽選でお得
この記事が気に入ったらチップで応援してみませんか?