ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

开发一组交易信号--K线与10均线的关系

2020-06-14 09:52:49  阅读:339  来源: 互联网

标签:10 code 一组 均线 daily date close True


K线上穿/下穿10日均线,如图所示:

类似于,之前写的基于聚宽平台写的一个典型的双均线策略思想类似,当K线上穿10日均线时,发出买入信号,当K先下穿10日均线时,发出卖出信号。
比较当前的收盘价和MA10之间的关系,为判断是否满足K线上穿/下穿10日均线做准备:

def compare_close_2_ma_10(code,dailies):
    """
    比较当前的收盘价和MA10的关系
    :param dailies:日线列表,10个元素,最后一个为当前交易日
    :return 0 相等,1 大于,-1小于,None 结果未知
    """
    current_daily = dailies[9]
    close_sum = 0
    for daily in dailies:
        #10天中只要有一天停盘就返回False
        if 'is_trading' not in daily or daily['is_trading'] is False:
            return None
        #用后复权累计
        close_sum += daily['close']
    #计算MA10
    ma_10 = close_sum/10

    #判断收盘价和MA10 的大小
    post_adjusted_close = current_daily['close']
    differ = post_adjusted_close - ma_10

    print('计算信号,股票:%s ,收盘价:%7.2f,MA10:%7.2f,差值:%7.2f' %(code,post_adjusted_close,ma_10,differ),flush=True)
    if differ>0:
        return 1
    elif differ<0:
        return -1
    else:
        return 0

判断某只股票是否满足K线上穿10日均线

def is_k_up_break_ma10(code,_date):
    """
    判断某支股票在某日是否满足K线上穿10日均线
    :param code:股票代码
    :param _date:日期
    :return True/False
    """
    #从后复权的日行情数据集中根据股票代码、日期和是否正常交易为条件查询一条数据
    #如果能够找到数据,则认为当日股票为正常交易状态,否则为停牌
    current_daily = DB_CONN['daily_hfq'].find_one(
        {'code':code,'date':_date,'is_trading':True})
    #没有找到股票的日行情数据,则认为不符合日线收盘价上穿10均线的条件
    if current_daily is None:
        print('计算信号,K线上穿MA10,当日没有K线,股票:%s,日期:%s'%(code,_date),flush=True)
        return False
    #从后复权的日行情数据集中查询11条数据,因为要连接着两个交易日的10均线价格,所以需要11条数据才能保证提取到临近的10交易日的数据
    daily_cursor = DB_CONN['daily_hfq'].find(
        {'code':code,'date':{'$lte':_date}},
        limit=11,
        #10日均线计算的时候是包含当日在内的向前连续10个交易日的收盘价的平均值,所以要按时间倒序排列
        sort=[('date',DESCENDING)],
        #计算价格均线时,只需要用到价格,并且如果连续10个交易日内都有停牌情况,则不进行计算
        projection={'code':True,'close':True,'is_trading':True}
        )
    #从游标中取出日行情数据放进列表中
    dailies = [x for x in daily_cursor]
    #如果数据不满足11个,也就是说无法进行计算两个交易日的MA10,则认为不符合上穿的条件
    if len(dailies)<11:
        print('计算信号,K线上穿MA10,当日K线不足,股票:%s,日期:%s'%(code,_date),flush=True)
        return False
    #查询时是倒序排列的,而计算MA10时是向前10根,所以要将顺序反转
    dailies.reverse()
    #计算前一个交易日收盘价和MA10的关系
    last_close_2_last_ma10 = compare_close_2_ma_10(code,dailies[:10])
    #计算当前交易日收盘价和MA10的关系
    current_close_2_current_ma10 = compare_close_2_ma_10(code,dailies[1:])

    #将关键数据打印出来,便于对比
    print('计算信号,K线上穿MA10,股票:%s,日期:%s,前一日:%s,当日:%s' %(code,_date,str(last_close_2_last_ma10),str(current_close_2_current_ma10)),flush=True)
    #前一日或当日任意一天的收盘价和MA10的关系不存在,则都认为不符合上穿条件
    if last_close_2_last_ma10 is None or current_close_2_current_ma10 is None:
        return False

    #只有前一日收盘价小于等于MA10,且当前交易日的收盘价大于MA10,则认为当日收盘价上穿MA10
    is_break = (last_close_2_last_ma10 <= 0) & (current_close_2_current_ma10 ==1)
    print('计算信号,K线上穿MA10,股票:%s,日期:%s,前一日:%s,当日:%s,突破:%s'%(code,_date,str(last_close_2_last_ma10),str(current_close_2_current_ma10),str(is_break)),flush=True)
    #返回判断结果
    return True

判断某只股票是否满足K线上穿10日均线

def is_k_down_break_ma10(code,_date):
    """
    判断某只股票在某日是否满足K线下穿10日均线
    :param code:股票代码
    :param _date:日期
    :return True/False
    """
    #从后复权的日行情数据集中根据股票代码、日期和是否正常交易为条件查询一条数据
    #如果能够找到数据,则认为当日股票为正常交易状态,否则为停牌
    current_daily = DB_CONN['daily_hfq'].find_one(
        {'code':code,'date':_date,'is_trading':True})
    #没有找到股票的日行情数据,则认为不符合日线收盘价上下穿10均线的条件
    if current_daily is None:
        print('计算信号,K线下穿MA10,当日没有K线,股票:%s,日期:%s'%(code,_date),flush=True)
        return False
    #从后复权的日行情数据集中查询11条数据,因为要连接着两个交易日的10均线价格,所以需要11条数据才能保证提取到临近的10交易日的数据
    daily_cursor = DB_CONN['daily_hfq'].find(
        {'code':code,'date':{'$lte':_date}},
        limit=11,
        #10日均线计算的时候是包含当日在内的向前连续10个交易日的收盘价的平均值,所以要按时间倒序排列
        sort=[('date',DESCENDING)],
        #计算价格均线时,只需要用到价格,并且如果连续10个交易日内都有停牌情况,则不进行计算
        projection={'code':True,'close':True,'is_trading':True}
        )
    #从游标中取出日行情数据放进列表中
    dailies = [x for x in daily_cursor]
     #如果数据不满足11个,也就是说无法进行计算两个交易日的MA10,则认为不符合下穿的条件
    if len(dailies)<11:
        print('计算信号,K线下穿MA10,当日K线不足,股票:%s,日期:%s'%(code,_date),flush=True)
        return False
    #查询时是倒序排列的,而计算MA10时是向前10根,所以要将顺序反转
    dailies.reverse()
    #计算前一个交易日收盘价和MA10的关系
    last_close_2_last_ma10 = compare_close_2_ma_10(code,dailies[:10])
    #计算当前交易日收盘价和MA10的关系
    current_close_2_current_ma10 = compare_close_2_ma_10(code,dailies[1:])

    #将关键数据打印出来,便于对比
    print('计算信号,K线下穿MA10,股票:%s,日期:%s,前一日:%s,当日:%s' %(code,_date,str(last_close_2_last_ma10),str(current_close_2_current_ma10)),flush=True)
    #前一日或当日任意一天的收盘价和MA10的关系不存在,则都认为不符合下穿条件
    if last_close_2_last_ma10 is None or current_close_2_current_ma10 is None:
        return False

    #只有前一日收盘价大于等于MA10,且当前交易日的收盘价小于MA10,则认为当日收盘价下穿MA10
    is_break = (last_close_2_last_ma10 >= 0) & (current_close_2_current_ma10 ==-1)
    print('计算信号,K线下穿MA10,股票:%s,日期:%s,前一日:%s,当日:%s,突破:%s'%(code,_date,str(last_close_2_last_ma10),str(current_close_2_current_ma10),str(is_break)),flush=True)
    #返回判断结果
    return True

标签:10,code,一组,均线,daily,date,close,True
来源: https://www.cnblogs.com/whiteBear/p/13123824.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有