欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

B08.python智能盯盘 + 声音报警 - 有意思的小东西【黑科技】

程序员文章站 2024-03-19 19:01:28
...

适合人群:稍微有点python基础者,炒股或对金融感兴趣者。

一、对上证大盘进行盯盘

1,首先需要安装winsound, easyquotation 库。
2,目标:对大盘进行盯盘,超过x%或跌过y%进行报警,声音报警,上涨下跌频率不同。
具体操作见同名B站视频。
可以修改的地方:研究easyquotation的api后,可以修改为对你的某只股票盯盘;可以修改x,y调整报警幅度。如果你需要,报警方式可以改成发邮件。

代码:

import winsound
import time
import easyquotation

# 对大盘进行盯盘,超过x%或跌过y%进行报警
# 代码作者:机智翔学长(B站、CSDN同名)

def alarm1():
    # 报警1(声音低沉)
    duration = 300  # millisecond
    freq = 300  # Hz
    while 1:
        winsound.Beep(freq, duration)
        time.sleep(0.3)

def alarm2():
    # 报警2(声音尖锐)
    duration = 500  # millisecond
    freq = 1000  # Hz
    while 1:
        winsound.Beep(freq, duration)
        time.sleep(0.5)

class Ding:
    def __init__(self):
        # 初始化
        self.quotation = easyquotation.use('sina')  # 新浪 ['sina'] 腾讯 ['tencent', 'qq'] 

        dapan = self.quotation.stocks(['sh000001'])['000001']  # 上证指数
        self.today_open = dapan['open']
        self.yesterday_close = dapan['close']
        self.now = dapan['now']

        self.x = x = 0.50
        self.y = y = 0.80
        print('大盘监听范围:上涨{}%,下跌{}%'.format(str(self.x), str(self.y)))
        up = x / 100 # 上涨1%报警1(声音低沉)
        down = y / 100 # 下跌1%报警2(声音尖锐)
        self.up_price = self.yesterday_close * (1+up) 
        self.down_price = self.yesterday_close * (1-down)
    
    def update(self):
        # 重新获取数据,需要实时更新
        dapan = self.quotation.stocks(['sh000001'])['000001']  # 上证指数
        self.now = dapan['now']

    def listen(self):
        # 一直监听
        print('开始盯盘:')
        while 1:
            self.update()
            if self.now > self.up_price:
                print("大盘涨幅超过 {}%".format(str(self.x)))
                alarm1()
            if self.now < self.down_price:
                print("大盘跌幅跌幅 {}%".format(str(self.y)))
                alarm2()
            time.sleep(1)


if __name__ == "__main__":
    dingpanxia = Ding()
    dingpanxia.listen()

二、盯盘侠.bat

bat批处理方式,更快捷,直接双击打开即可。

代码:

@echo off
REM 声明采用UTF-8编码
chcp 65001

echo note

python E:\1StudyData\dingPang.py
@cmd.exe

三、对外盘进行盯盘

原理类似,但无法直接调用api,故进行爬虫获取。
用到了我之前写的文章: Fiddler的使用[抓包]
分析:
B08.python智能盯盘 + 声音报警 - 有意思的小东西【黑科技】
爬虫获取信息:
参考我之前文章 下载xxx视频[python]NLP 获取相似词 - 1.爬取百度搜索结果

代码:

# -*- coding:utf-8 -*-
import requests
import json
import re
import winsound
import time

# 对外盘(英国富时 FTSE))进行盯盘,原理类似(代码有点差异),但无法直接调用api,故进行爬虫获取
# 代码作者:机智翔学长(B站、CSDN同名)

def get_price_percent_now():
    # 获取当前价格的涨跌百分数

    # 人工查询需要访问链接:http://quote.eastmoney.com/gb/zsFTSE.html
    url = 'http://push2.eastmoney.com/api/qt/stock/get?secid=100.FTSE&ut=bd1d9ddb04089700cf9c27f6f7426281&fields=f43,f44,f45,f46,f47,f59,f60,f152,f169,f86,f170,f171,f118&cb=jQuery1124024843802565838335_1583310594306&type=CT&cmd=FTSE_UI&sty=FDPBPFB&st=z&js=((x))&token=4f1862fc3b5e77c150a2b985b12db0fd&_=1583310594664'
    # url后部分从fiddler右上角的GET复制过来的,每个人可能不同
    res = requests.get(url).text
    searchObj = re.findall(r'\((.+?)\)', res) # 获取括号()里面的内容

    dapan = json.loads(searchObj[0])['data']
    f170 = dapan['f170'] # 得到涨跌多少,例如值为194代表涨1.94%

    return f170

def alarm1():
    # 报警1(声音低沉)
    duration = 300  # millisecond
    freq = 300  # Hz
    while 1:
        winsound.Beep(freq, duration)
        time.sleep(0.3)

def alarm2():
    # 报警2(声音尖锐)
    duration = 500  # millisecond
    freq = 1000  # Hz
    while 1:
        winsound.Beep(freq, duration)
        time.sleep(0.5)

class Ding:
    def __init__(self):
        # 初始化
        # 超过上限报警1(声音低沉)
        self.up_percent = 250

        # 低于下限报警2(声音尖锐)
        self.down_percent = 162

        print('大盘监听范围:上限{}%,下限{}%'.format(str(self.up_percent/100), str(self.down_percent/100)))

    
    def listen(self):
        # 一直监听
        print('开始盯盘:')
        while 1:
            percent = get_price_percent_now()#;print(percent)
            if percent > self.up_percent:
                print("外盘超过 {}%".format(str(self.up_percent/100)))
                alarm1()
            if percent < self.down_percent:
                print("外盘低于 {}%".format(str(self.down_percent/100)))
                alarm2()
            time.sleep(1)


if __name__ == "__main__":
    dingpanxia = Ding()
    dingpanxia.listen()