トレーディングBotをマルチプロセス化する、ほぼ最小のPython実装

トレーディングBotをマルチプロセス化する、ほぼ最小のPython実装

yuza

マルチプロセス構造の小さな実用例です。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文字

トレーディングBotをマルチプロセス化する、ほぼ最小のPython実装

yuza

100円

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
yuza
Akagami lounge で産声を上げたコーヒーの蓋です。 https://twitter.com/CcYuza