私のauカブコム証券のkabuステーションで自動売買プログラムの説明(3) 現在の株価を監視 (board.py)

スポンサーリンク

board.pyのソースコード

import urllib.request
import json
import pprint
import time
import pandas as pd
import numpy as np
import settings
import sqlite3
from statistics import mean 
import datetime
import sendorder_entry

def board():
  url = 'http://localhost:' + settings.port + '/kabusapi/board/' + settings.symbol + '@1'
  req = urllib.request.Request(url, method='GET')
  req.add_header('Content-Type', 'application/json')
  req.add_header('X-API-KEY', settings.token)

  curPriceList = []

  #標準偏差初期化
  std_val = 0

 #無限ループ
  while True:
    try:
      print('###board')
      with urllib.request.urlopen(req) as res:
        content = json.loads(res.read())

        #現在価格を取得
        curPrice = content["CurrentPrice"]
        if curPrice is None:
          #現在価格が取れない場合はまだ相場が開いてないのでスキップ
          time.sleep(60)
          continue
    
    if エントリ条件に合致したら
            # 指定時間を超えていたらエントリしない
            nowtime = datetime.datetime.now()
            if (nowtime > settings.morningStartTime \
                and nowtime < settings.morningStopTime):

             # エントリ
             sendorder_entry.sendorder_entry()

    except urllib.error.HTTPError as e:
      print(e)
      content = json.loads(e.read())
      pprint.pprint(content)
    except Exception as e:
      print(e)
    
    #1分足なので60秒スリープ
    time.sleep(60)

if __name__ == "__main__":
  import sys
  board()

基本は、kabuステーションAPIのサンプルをベースに株価情報を取得して、エントリ条件を判定し、エントリ基準に達したら、エントリ処理を呼び出します。

詳細説明

1分間隔で株価を取得

 #無限ループ
  while True:
    try:
      print('###board')
      with urllib.request.urlopen(req) as res:
        content = json.loads(res.read())

        #現在価格を取得
        curPrice = content["CurrentPrice"]
    #1分足なので60秒スリープ
    time.sleep(60)

全体を「while True:」の中に入れることによって、無限に同じ処理を繰り返します。
そして、その最後で「time.sleep(60)」で60秒の待つことにより、60秒ごとに処理を繰り返します。

このプログラムでは、1分足のデータを使っているので、このwhile中で株価情報を取得しデータを貯めていくことで1分足のデータを作成します。

1分足のデータがほしい場合はsleep時間が60秒ですが、5分足の場合は300秒、15分足の場合は900秒にすることにより、同じように時間足のデータが取得できます。

市場がオープンしていない場合は株価情報が取れないので何もしない

        if curPrice is None:
          #現在価格が取れない場合はまだ相場が開いてないのでスキップ
          time.sleep(60)
          continue

東京証券取引所の開場は9:00なので、その前に株価を取得すると値が取得できません。その状態はPythonでは「None」という状態なので、その場合は何もせずに処理を抜けます。

ここでも忘れずにsleep処理を入れないと、休みなく呼び出しをしてしまいます。kabuステーションAPIは呼び出しの流量制限が1秒間あたり10回と、割と余裕があるのですが、流量制限にひっかからないことに越したことはありません。

エントリ基準判定

エントリ基準判定はシステムの肝なのだ、今のところ企業秘密とさせていただきます。

エントリ可能時間判定

午前中9:20~10:30をエントリ可能時間としているので、現在時刻がその範囲内にあるかのチェックをしています。

エントリ時間に制限を設けているのは、このプログラムでは前場の中で逆張り反転を狙っているため、前場の中で反転が可能と思われるエントリ時間を逆算して設定しています。

エントリ処理呼び出し

数珠繋ぎ方式により、次のエントリ処理を呼び出しています。

コメント