python 多線程監測股票漲停板打開 並通知用戶

原文鏈接:http://30daydo.com/article/184


實測,很有用。 具體用法可以到原文鏈接去查看。


# -*-coding=utf-8-*-
__author__ = 'Rocky'
'''
http://30daydo.com
Contact: [email protected]
'''
import smtplib, time, os, datetime
from email.mime.text import MIMEText
from email.header import Header
from toolkit import Toolkit
from email.mime.multipart import MIMEMultipart
from email import Encoders, Utils
from toolkit import Toolkit
import tushare as ts
from pandas import Series
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import threading

#監測漲停板開板監測
class break_monitor():
    def __init__(self,send=True):
        self.send=send
        if self.send==True:
            cfg = Toolkit.getUserData('data.cfg')
            from_mail = cfg['from_mail']
            password = cfg['password']
            to_mail = cfg['to_mail']
            smtp_server = 'smtp.qq.com'

            self.server = smtp_server
            self.username = from_mail.split("@")[0]
            self.from_mail = from_mail
            self.password = password
            self.to_mail = to_mail
            # 初始化郵箱設置讀取需要股票信息
            # 這樣子只登陸一次
            try:
                self.smtp = smtplib.SMTP_SSL(port=465)
                self.smtp.connect(self.server)
                self.smtp.login(self.username, self.password)
            except smtplib.SMTPException, e:
                print e
                return 0
        self.bases = pd.read_csv('bases.csv', dtype={'code': np.str})
        self.stocklist = Toolkit.read_stock('monitor_list.log')


    
    def send_txt(self, name, content):

        subject = '%s' % name
        self.msg = MIMEText(content, 'plain', 'utf-8')
        self.msg['to'] = self.to_mail
        self.msg['from'] = self.from_mail
        self.msg['Subject'] = subject
        self.msg['Date'] = Utils.formatdate(localtime=1)
        try:
            self.smtp.sendmail(self.msg['from'], self.msg['to'], self.msg.as_string())
            self.smtp.quit()
            print "sent"
        except smtplib.SMTPException, e:
            print e
            return 0

    #開板提示
    def break_ceil(self, code):
        print threading.current_thread().name
        while 1:
            #print code
            time.sleep(2)
            try:
                df = ts.get_realtime_quotes(code)
            except:
                time.sleep(5)
                continue
            v = long(df['b1_v'].values[0])

            if v <= 1000:
                print datetime.datetime.now().strftime("%H:%M:%S")
                print u"小於萬手,小心!跑"
                if self.send==True:
                    self.push_msg('break', 10, 10, 'down')
                #這裏可以優化,不必每次都登陸。


    def monitor_break(self,send=True):
        thread_num = len(self.stocklist)
        thread_list = []
        join_list = []
        for i in range(thread_num):
            t = threading.Thread(target=self.break_ceil, args=(self.stocklist[i],))
            thread_list.append(t)

        for j in thread_list:
            j.start()

        for k in thread_list:
            k.join()


if __name__ == '__main__':
    path = os.path.join(os.getcwd(), 'data')
    if os.path.exists(path) == False:
        os.mkdir(path)
    os.chdir(path)
    obj = break_monitor(send=False)
    obj.monitor_break()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章