返回列表 发布新帖

【源码】一个最简单的MACD红绿柱翻转买卖的策略

4199 2
发表于 2024-3-1 20:29:46 | 显示全部楼层 阅读模式

新手入门代码示例,望各位大神斧正,无情点评。😄

可 实时仿真模拟运行。

文档可参考:

【分享】小白入门的迅投QMT股票模型开发上手指南(腾讯文档) https://www.xuntou.net/forum.php?mod=viewthread&tid=1844&user_code=PN4WZC 来自: 迅投QMT社区

相关视频可以 “视频中心” ,观看 《讯投 Python 量化入门 08》

https://www.xuntou.net/plugin.php?id=keke_video_base&ac=course&cid=15&user_code=PN4WZC

# coding:GBK
"""
5m 图表上,观察 MACD 指标
MACD柱子绿翻红,买入100股
MACD柱子红翻绿,卖出100股
"""

import pandas as pd
import numpy as np
import talib

class G(): pass
g = G()

g.m5Data = {} # 用于保存5分钟的K线数据
g.StockList = ['601225.SH','000004.SZ']
g.StockPos = {} # 用于保存帐户中持有股标订单

account ="620000123673"
SectorName = "上证50" # 板块名 如“上证50”

def init(ContextInfo):
    print("程序开始在 实时模拟仿真模式 下运行。")

    ContextInfo.set_account(account)

    if len(SectorName) > 0:
        g.StockList = ContextInfo.get_stock_list_in_sector(SectorName)

    for s in g.StockList:
        g.m5Data[s] = {
                      }

        g.StockPos[s] = {"持股总数量":0,
                         "可用数量":0
                        }

    print("初始化完成。")

def handlebar(ContextInfo):

    if not ContextInfo.is_last_bar():
        return

    Symbol = g.StockList[0]

    if len(g.m5Data[Symbol]) == 0:
        print("开始获取历史数据.......")
        g.m5Data = ContextInfo.get_market_data_ex(
                        ['close'],
                        g.StockList,
                        period = '5m',
                        count = 100,
                        subscribe = True
                       )

        for Symbol in g.StockList:
            closePrice = g.m5Data[Symbol]['close']
            closePrice = closePrice.values
            macd,signal,hist = talib.MACD(closePrice,fastperiod =12,slowperiod = 26,signalperiod = 9)

            g.m5Data[Symbol]['hist'] = hist

        print("获取历史数据完成。")

# =======获取持仓数据=========================================================
    PosList = get_trade_detail_data(account,'stock','position')

    for pos in PosList:
        Symbol = pos.m_strInstrumentID + '.' + pos.m_strExchangeID # 组合成 600225.SH 这样的字符串

        if Symbol not in g.StockList:
            continue

        g.StockPos[Symbol]["持股总数量"] = pos.m_nVolume
        g.StockPos[Symbol]["可用数量"] = pos.m_nCanUseVolume

#--------刷新行情报价的数据 ---------------------------------------------------
    m5Data = ContextInfo.get_market_data_ex(
                 ['close'],
                 g.StockList,
                 period = '5m',
                 count = 1,
                 subscribe = True
                )

    for Symbol in g.StockList:

        g5mD_stime = g.m5Data[Symbol].index.tolist()
        m5D_stime = m5Data[Symbol].index.tolist()

        if len(m5D_stime) > 0:
            if m5D_stime[-1] not in g5mD_stime: # 5m 图表上更新了一根K线
                g.m5Data[Symbol] = pd.concat([g.m5Data[Symbol],m5Data[Symbol]])

            if m5D_stime[-1] == g5mD_stime[-1]:
                g.m5Data[Symbol].iloc[-1] = m5Data[Symbol].iloc[-1]

# ------------计算 MACD 指标 ----------------------------------
        closePrice = g.m5Data[Symbol]['close']
        closePrice = closePrice.values
        macd,signal,hist = talib.MACD(closePrice,fastperiod =12,slowperiod = 26,signalperiod = 9)

        g.m5Data[Symbol]['hist'] = hist

# -------根据需求判断 是否 交易了---------------------------------
        if not ContextInfo.is_new_bar():
            return

        if (g.StockPos[Symbol]["持股总数量"] < 100 and 
            g.m5Data[Symbol]["hist"].iloc[-3] < 0 and
            g.m5Data[Symbol]["hist"].iloc[-2] > 0 
           ):
            print("当前品种:",Symbol,"MACD 柱子绿翻红了,买入")
            passorder(23,1101,account,Symbol,5,0,100,"1",1,"1",ContextInfo)

        if (g.StockPos[Symbol]["可用数量"] >= 100 and
            g.m5Data[Symbol]["hist"].iloc[-3] > 0 and 
            g.m5Data[Symbol]["hist"].iloc[-2] < 0 
           ): 
            print("当前品种:",Symbol,"MACD 柱子红翻绿了,卖出")
            passorder(24,1101,account,Symbol,5,0,100,"1",1,"1",ContextInfo)

    print("程序完成一次执行任务。")


评论2

*******1618_Gi0p0
发表于 2024-3-17 22:18:06 | 显示全部楼层
不错,赞一个。
*******7532 发表于 2025-3-3 09:48:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2025 迅投QMT社区 版权所有 All Rights Reserved. 蜀ICP备19002686号-2
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表