美文网首页股票小工具系列
股票小工具-ENE底部提醒

股票小工具-ENE底部提醒

作者: 平凡啊菜 | 来源:发表于2018-09-19 18:57 被阅读68次

ENE指标,自己百度
适用场景,在第二阶段上升趋势中,定点狙击ene底部的票,可以获得不错的收益

import schedule
import talib
import datetime
import time
import easyutils as eu
import tushare as ts
import numpy as np
import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from retrying import retry


# ENE list
enelist_code = pd.Series(np.array([]))
enelist_upper = pd.Series(np.array([]))
enelist_lower = pd.Series(np.array([]))
enelist_ene = pd.Series(np.array([]))
enelistdata = pd.DataFrame({'code': enelist_code, 'upper': enelist_upper,
                            'ene': enelist_ene, 'lower': enelist_lower}, index=enelist_code)
sendlist = []


def getsma(stockdata, timeperiod=5):
    ma = talib.SMA(stockdata['close'].values, timeperiod)
    return ma.round(2)


@retry
def getstockdataofday(stockcode, timeperiod=180):
    datedelay = datetime.date.today() - datetime.timedelta(days=timeperiod)
    stockdata = ts.get_k_data(stockcode, start=str(datedelay.isoformat()),
                              end=str(datetime.date.today().isoformat()))
    return stockdata


def getenevalues(stockdata):
    if stockdata.empty:
        return (-1, -1, -1)
    param_m1 = 11
    param_m2 = 9
    param_n = 10
    if stockdata is None:
        return (-1, -1, -1)
    if len(stockdata['close'].values) == 0:
        return (-1, -1, -1)
    sma_n = talib.SMA(stockdata['close'].values, param_n)
    upper = (1 + param_m1 / 100) * sma_n
    lower = (1 - param_m2 / 100) * sma_n
    ene = (upper + lower) / 2
    upper = upper.round(2)
    ene = ene.round(2)
    lower = lower.round(2)
    stockdata['ene_upper'] = upper
    stockdata['ene_ene'] = ene
    stockdata['ene_lower'] = lower
    upper_line = upper[-1]
    lower_line = lower[-1]
    ene_line = ene[-1]
    return (upper_line, ene_line, lower_line)


@retry
def getrealquote(stockcode):
    df = ts.get_realtime_quotes(stockcode)
    return df


@retry
def mail(msgcontent):
    ret = True
    try:
        msg = MIMEText(msgcontent, 'plain', 'utf-8')
        # 括号里的对应发件人邮箱昵称、发件人邮箱账号
        msg['From'] = formataddr(["From平凡啊菜", my_sender])
        # 括号里的对应收件人邮箱昵称、收件人邮箱账号
        msg['To'] = formataddr(["平凡啊菜", my_user])
        msg['Subject'] = "ene指标监控,达到下轨的个股"                # 邮件的主题,也可以说是标题

        server = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP服务器,端口是25
        server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码
        # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
        server.sendmail(
            my_sender, [my_user, my_user1, my_user2], msg.as_string())
        server.quit()
    except Exception:
        ret = False
    return ret


def getready():
    sendlist.clear()
    i = 0
    total = len(basic)
    for stockcode in basic.index.values:
        upper_line, ene_line, lower_line = getenevalues(
            getstockdataofday(stockcode, 180))
        enelistdata.loc[i] = {
            'code': stockcode, 'upper': upper_line, 'ene': ene_line, 'lower': lower_line}
        i = i + 1
        print('%s/%s' % (i, total))
    now = datetime.datetime.now()
    enelistdata.to_pickle('enedatalist_%s_%s_%s.pick' %
                          (now.year, now.month, now.day))


def job():
    is_tradetime = eu.is_tradetime_now()
    is_holiday = eu.is_holiday_today()
    # now = datetime.datetime.now()
    # enelistdata = pd.read_pickle('enedatalist_%s_%s_%s.pick' %
    #                              (now.year, now.month, now.day))
    # enelistdata.index = enelistdata['code']
    # print(enelistdata)
    menelistdata = enelistdata.fillna(-1)
    menelistdata.index = menelistdata['code']
    # print(menelistdata)
    if (not is_holiday) and (is_tradetime):
        msgcontent = ''
        count = len(basic.index.values)
        mix = 0
        for stockcode in basic.index.values:
            rdata = getrealquote(stockcode)
            if rdata is None:
                continue
            mdata = rdata.fillna(0)
            trade = float(mdata['price'][0])
            name = mdata['name'][0]
            upper_line = float(menelistdata.ix[stockcode].ix['upper'])
            ene_line = float(menelistdata.ix[stockcode].ix['ene'])
            lower_line = float(menelistdata.ix[stockcode].ix['lower'])
            print(upper_line, ene_line, lower_line)
            now = mdata['time'][0]
            issend = False
            for item in sendlist:
                if item == stockcode:
                    issend = True
            if (trade <= lower_line) and (trade != 0) and (not issend):
                msgcontent = msgcontent + '\n个股: %s,代码: %s,ENE下轨值: %s,当前价: %s,时间: %s\n' % (
                    name, stockcode, lower_line, trade, now)
                msgcontent = msgcontent + '基本面数据:\n行业:%s,地区:%s,市盈率:%s,市净率:%s,流通股本:%s亿,总股本:%s亿,总资产:%s万,流动资产:%s万,固定资产:%s万,公积金:%s,每股公积金:%s万,每股收益:%s,每股净资产:%s,未分利润:%s万,每股未分配:%s,收入同比:%s%%,利润同比:%s%%,毛利率:%s%%,净利润率:%s%%,股东人数:%s,上市时间:%s\n' % (
                    basic.ix[stockcode].ix['industry'], basic.ix[stockcode].ix['area'], basic.ix[stockcode].ix['pe'], basic.ix[stockcode].ix['pb'], basic.ix[stockcode].ix[
                        'outstanding'], basic.ix[stockcode].ix['totals'], basic.ix[stockcode].ix['totalAssets'], basic.ix[stockcode].ix['liquidAssets'], basic.ix[stockcode].ix['fixedAssets'],
                    basic.ix[stockcode].ix['reserved'], basic.ix[stockcode].ix['reservedPerShare'], basic.ix[stockcode].ix['esp'], basic.ix[stockcode].ix['bvps'], basic.ix[stockcode].ix['undp'], basic.ix[stockcode].ix['perundp'], basic.ix[stockcode].ix['rev'], basic.ix[stockcode].ix['profit'], basic.ix[stockcode].ix['gpr'], basic.ix[stockcode].ix['npr'], basic.ix[stockcode].ix['holders'], basic.ix[stockcode].ix['timeToMarket'])
                # print(msgcontent)
                print('found one.')
                sendlist.append(stockcode)
            print('%s/%s' % (mix, count))
            mix = mix + 1
        if msgcontent != '':
            ret = mail(msgcontent)
            if ret:
                print('邮件发送成功')
            else:
                print('邮件发送失败')


def main():
    is_holiday = eu.is_holiday_today()
    getready()
    if not is_holiday:
        schedule.every().day.at('8:00').do(getready)
    schedule.every(5).seconds.do(job)
    while True:
        schedule.run_pending()
        time.sleep(2)


if __name__ == '__main__':
    my_sender = 'xxx@qq.com' #发件人邮箱
    my_pass = '' #QQ邮箱密钥
    my_user = '284076061@qq.com'
    # my_user1 = 'xxxx@qq.com'
    my_user2 = 'xxxx@qq.com'
    basic = ts.get_stock_basics()
    classified = ts.get_st_classified()
    main()

赞赏是最真诚的认可

相关文章

  • 股票小工具-ENE底部提醒

    ENE指标,自己百度适用场景,在第二阶段上升趋势中,定点狙击ene底部的票,可以获得不错的收益

  • 股票投资两种方法

    第一种方法是在股票的底部进入,耐心持股。这个方法需要长期观察股票市场各种股票,确认出股票的底部再进入。第二种方法的...

  • 股票提醒系统

    前言 前几天读到一篇微信公众号的文章熬了一晚上,小白用Python写了一个股票提醒系统,看了评论之后感觉意犹未尽,...

  • 股票小工具-股票评论数

    获取股票在东财股吧的评论情况

  • x的奇幻之旅

    NumbersFrom Fish to InifityRock GroupsThe Enemy of My Ene...

  • 今日小工具提醒-wox 海盗湾 neatmanager

    今日小工具提醒-wox 海盗湾 neatmanager 原创: gkgy [瞪大你的双眼](javascript:...

  • 2018-03-21

    早上股票 伊利股份在底部,等它起来 中国国航在底部,等它起来 中国国旅涨了就收,赚了2.几够了 格力电器在底部,又...

  • 术业有专攻,教你股票小知识

    第一,股票不冲高不卖,不跳水不买,股票横盘不交易。 第二,股票买阴不买阳,股票卖阳不卖阴。 第三,股票底部长阳第一...

  • 【翻译】BLE简介

    Introduction to Bluetooth Low Energy 简介 Bluetooth Low Ene...

  • 2021-04-11

    句子解析 Major manufacturers increasingly shifting to new ene...

网友评论

    本文标题:股票小工具-ENE底部提醒

    本文链接:https://www.haomeiwen.com/subject/ejfwnftx.html