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をエントリ可能時間としているので、現在時刻がその範囲内にあるかのチェックをしています。
エントリ処理呼び出し
数珠繋ぎ方式により、次のエントリ処理を呼び出しています。
コメント