【小白量化智能体】应用5:编写通达信股票交易指标及生成QMT自动交易Python策略程序

【小白量化智能体】应用5:编写通达信股票交易指标及生成QMT自动交易Python策略程序

【小白量化智能体】是指能够自主或半自主地通过与环境的交互来实现目标或任务的计算实体。智能体技术是一个百科全书,又融合了人工智能、计算机科学、心理学和经济学等多个领域的知识,能够在复杂环境中自主决策和行动的实体。能够实现量化投资的各方面应用,例如自动设计指标,自动编写Python自动交易策略等等。

【小白量化智能体】能够通过中文描述,转化为指标公式和Python程序,以及生成机器学习程序。

如果自己不会写Python策略,去定做一个指标公式是需要3位数,定做一个策略需要花费4位数。花钱是次要的,你能保证你的技术公式和策略是100%准确吗?

大家知道,失败是成功之母,我相信你的努力尝试100次失败后,最终会做出成功的策略。问题是你有100个4位数的开发资金吗?

【小白量化智能体】能够1分钟内写出交易指标公式,1秒钟生成各种Python策略。每天可以生成无数个策略,开发成本就是电费。

我们下面给大家介绍设计通达信股票交易公式并生成QMT交易Python策略程序。
一、生成通达信股票交易指标公式

在小白量化智能体中,输入下面信息:


bash 复制代码
DIF:EMA(CLOSE,12)-EMA(CLOSE,26);
DEA:EMA(DIF,9);
MACD:2*(DIF-DEA);
SHORT:=9; M1:=3; M2:=3;
RSV:=(CLOSE-LLV(LOW,SHORT))/(HHV(HIGH,SHORT)-LLV(LOW,SHORT))*100;
K:SMA(RSV,M1,1);
D:SMA(K,M2,1);
J:3*K-2*D;
LC:=REF(CLOSE,1);
RSI1:SMA(MAX(CLOSE-LC,0),6,1)/SMA(ABS(CLOSE-LC),6,1)*100;
RSI2:SMA(MAX(CLOSE-LC,0),12,1)/SMA(ABS(CLOSE-LC),12,1)*100;
RSI3:SMA(MAX(CLOSE-LC,0),24,1)/SMA(ABS(CLOSE-LC),24,1)*100;
VOL_MA5:MA(VOL,5);
MACD_CROSS_UP:CROSS(DIF,DEA) AND DIF<0 AND MACD>0 AND REF(MACD,1)<=0;
KDJ_CROSS_UP:REF(K,1)<20 AND REF(D,1)<20 AND CROSS(K,D);
RSI_UP:REF(RSI1,1)<30 AND RSI1>=40;
VOL_INCREASE:VOL>VOL_MA5*1.5;
PRICE_LOW:LOW<REF(LLV(LOW,5),1);
MACD_LOW:HIGH>REF(HHV(HIGH,5),1) AND MACD<REF(HHV(MACD,5),1);
PRICE_HIGH:HIGH>REF(HHV(HIGH,5),1);
MACD_HIGH:MACD<REF(HHV(MACD,5),1);
ENTERLONG:MACD_CROSS_UP AND KDJ_CROSS_UP AND RSI_UP AND VOL_INCREASE OR PRICE_LOW AND MACD>REF(MACD,1);
KDJ_CROSS_DOWN:REF(K,1)>80 AND REF(D,1)>80 AND CROSS(D,K);
RSI_HIGH:RSI1>70;
EXITLONG:CROSS(DEA,DIF) AND KDJ_CROSS_DOWN AND RSI_HIGH OR PRICE_HIGH AND MACD_HIGH;
    

用【小白量化智能体】转化为标准指标公式如下:

bash 复制代码
DIF=EMA(CLOSE,12)-EMA(CLOSE,26)
DEA=EMA(DIF,9)
MACD=2*(DIF-DEA)
SHORT=9
M1=3
M2=3
RSV=(CLOSE-LLV(LOW,SHORT))/(HHV(HIGH,SHORT)-LLV(LOW,SHORT))*100
K=SMA(RSV,M1,1)
D=SMA(K,M2,1)
J=3*K-2*D
LC=REF(CLOSE,1)
RSI1=SMA(MAX(CLOSE-LC,0),6,1)/SMA(ABS(CLOSE-LC),6,1)*100
RSI2=SMA(MAX(CLOSE-LC,0),12,1)/SMA(ABS(CLOSE-LC),12,1)*100
RSI3=SMA(MAX(CLOSE-LC,0),24,1)/SMA(ABS(CLOSE-LC),24,1)*100
VOL_MA5=MA(VOL,5)
MACD_CROSS_UP=CROSS(DIF,DEA)*IF(DIF<0,1,0)*IF(MACD>0,1,0)*IF(REF(MACD,1)<=0,1,0)
KDJ_CROSS_UP=IF(REF(K,1)<20,1,0)*IF(REF(D,1)<20,1,0)*CROSS(K,D)
RSI_UP=IF(REF(RSI1,1)<30,1,0)*IF(RSI1>=40,1,0)
VOL_INCREASE=IF(VOL>VOL_MA5*1.5,1,0)
PRICE_LOW=IF(LOW<REF(LLV(LOW,5),1),1,0)
MACD_LOW=IF(HIGH>REF(HHV(HIGH,5),1),1,0)*IF(MACD<REF(HHV(MACD,5),1),1,0)
PRICE_HIGH=IF(HIGH>REF(HHV(HIGH,5),1),1,0)
MACD_HIGH=IF(MACD<REF(HHV(MACD,5),1),1,0)
ENTERLONG=MACD_CROSS_UP*KDJ_CROSS_UP*RSI_UP*VOL_INCREASE+PRICE_LOW*IF(MACD>REF(MACD,1),1,0)
KDJ_CROSS_DOWN=IF(REF(K,1)>80,1,0)*IF(REF(D,1)>80,1,0)*CROSS(D,K)
RSI_HIGH=IF(RSI1>70,1,0)
EXITLONG=CROSS(DEA,DIF)*KDJ_CROSS_DOWN*RSI_HIGH+PRICE_HIGH*MACD_HIGH
    

三、用标准股票交易公式生成QMT交易Python程序

小白量化智能体的强项是生成各种Python量化程序。


【小白量化智能体】生成代码内容如下:

python 复制代码
#encoding:gbk
# 生成QMT回测策略Python程序
# 生成时间:2025年07月14日 23:12:02
#微信 xblhznt
'''
##《小白量化智能体3.0》QMT仿指标回测策略
## 设计:独狼荷蒲
'''
#导入常用库
import time
import pandas as pd
import numpy as np
from HP_formula import *  #指标公式函数

class Global_var():
    pass    
g  = Global_var()

g.buy_codes=[]
g.sell_codes=[]
g.bar_period = '1d'   # ='1d' 日线,='1m' 1分钟线,='5m' 5分钟线
g.bar_counts = 300    # K线数量
def init(ContextInfo):
    #init handlebar函数的入参是ContextInfo对象 可以缩写为C
    #设置测试标的为主图品种
    ContextInfo.stock= ContextInfo.stockcode + '.' +ContextInfo.market
    #ContextInfo.stock='600030.SH'
    #accountid为测试的ID 回测模式资金账号可以填任意字符串
    ContextInfo.accountid = "testS"  
    today=time.strftime('%Y-%m-%d 00:00:00',time.localtime(time.time()))
    ContextInfo.start = "2024-01-01 00:00:00"# 回测开始时间为 2024-01-01
    ContextInfo.end = today
    download_history_data(ContextInfo.stock,g.bar_period,"20230101","") # 下载000001.SZ,从20240101至今的日线数据,增量下载

def handlebar(ContextInfo):
    #当前k线日期
    bar_date = timetag_to_datetime(ContextInfo.get_bar_timetag(ContextInfo.barpos), '%Y%m%d%H%M%S')
    #回测不需要订阅最新行情使用本地数据速度更快 指定subscribe参数为否. 如果回测多个品种 需要先下载对应周期历史数据 

    #local_data = C.get_market_data_ex(['close'], [C.stock], end_time = bar_date, period = C.period, count = max(C.line1, C.line2), subscribe = False)
    #close_list = list(local_data[C.stock].iloc[:, 0])

    data = ContextInfo.get_market_data_ex(fields = ['time','open','high','low','close','volume', 'amount'], 
                                          stock_code = [ContextInfo.stock], 
                                          period = g.bar_period,
                                          #start_time='20230629', 
                                          end_time = bar_date, 
                                          count = g.bar_counts , 
                                          dividend_type = 'front',
                                          subscribe = True)

    df = data[ContextInfo.stock]
    if len(df) <1:
        print(bar_date, '行情不足 跳过')
    
    # 初始化mydf表
    mydf=initmydf(df)  #df表中至少包含'open','high','low','close',最好也获取'volume','amount'
    C = CLOSE = mydf['close']
    L = LOW = mydf['low']
    H = HIGH = mydf['high']
    O = OPEN = mydf['open']
    V = VOL = mydf['volume']
    AMO = AMOUNT = mydf['amount']
    #tick = ContextInfo.get_full_tick([code])
    #lastPrice = float(ticks[code]['lastPrice'])
    lastPrice = CLOSE.iloc[-1]

    DIF=EMA(CLOSE,12)-EMA(CLOSE,26)
    DEA=EMA(DIF,9)
    MACD=2*(DIF-DEA)
    SHORT=9
    M1=3
    M2=3
    RSV=(CLOSE-LLV(LOW,SHORT))/(HHV(HIGH,SHORT)-LLV(LOW,SHORT))*100
    K=SMA(RSV,M1,1)
    D=SMA(K,M2,1)
    J=3*K-2*D
    LC=REF(CLOSE,1)
    RSI1=SMA(MAX(CLOSE-LC,0),6,1)/SMA(ABS(CLOSE-LC),6,1)*100
    RSI2=SMA(MAX(CLOSE-LC,0),12,1)/SMA(ABS(CLOSE-LC),12,1)*100
    RSI3=SMA(MAX(CLOSE-LC,0),24,1)/SMA(ABS(CLOSE-LC),24,1)*100
    VOL_MA5=MA(VOL,5)
    MACD_CROSS_UP=CROSS(DIF,DEA)*IF(DIF<0,1,0)*IF(MACD>0,1,0)*IF(REF(MACD,1)<=0,1,0)
    KDJ_CROSS_UP=IF(REF(K,1)<20,1,0)*IF(REF(D,1)<20,1,0)*CROSS(K,D)
    RSI_UP=IF(REF(RSI1,1)<30,1,0)*IF(RSI1>=40,1,0)
    VOL_INCREASE=IF(VOL>VOL_MA5*1.5,1,0)
    PRICE_LOW=IF(LOW<REF(LLV(LOW,5),1),1,0)
    MACD_LOW=IF(HIGH>REF(HHV(HIGH,5),1),1,0)*IF(MACD<REF(HHV(MACD,5),1),1,0)
    PRICE_HIGH=IF(HIGH>REF(HHV(HIGH,5),1),1,0)
    MACD_HIGH=IF(MACD<REF(HHV(MACD,5),1),1,0)
    ENTERLONG=MACD_CROSS_UP*KDJ_CROSS_UP*RSI_UP*VOL_INCREASE+PRICE_LOW*IF(MACD>REF(MACD,1),1,0)
    KDJ_CROSS_DOWN=IF(REF(K,1)>80,1,0)*IF(REF(D,1)>80,1,0)*CROSS(D,K)
    RSI_HIGH=IF(RSI1>70,1,0)
    EXITLONG=CROSS(DEA,DIF)*KDJ_CROSS_DOWN*RSI_HIGH+PRICE_HIGH*MACD_HIGH

    ## 自编仿指标公式交易
    account = get_trade_detail_data('test', 'stock', 'account')
    account = account[0]
    available_cash = int(account.m_dAvailable)
    holdings = get_trade_detail_data('test', 'stock', 'position')
    holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nVolume for i in holdings}
    holding_vol = holdings[ContextInfo.stock] if ContextInfo.stock in holdings else 0

    if holding_vol == 0 and ENTERLONG.iloc[-1]:
        vol = int(available_cash / CLOSE.iloc[-1] / 100) * 100
        #下单开仓
        passorder(23, 1101, ContextInfo.accountid, ContextInfo.stock, 5, -1, vol, ContextInfo)
        print(f"{bar_date} 开仓")
        ContextInfo.draw_text(1, 1, '开')
    #如果目前持仓中,同时快线下穿慢线,则全部平仓
    elif holding_vol > 0 and EXITLONG.iloc[-1]:
        #状态变更为未持仓
        ContextInfo.holding=False
        #下单平仓
        passorder(24, 1101, ContextInfo.accountid, ContextInfo.stock, 5, -1, holding_vol, ContextInfo)
        print(f"{bar_date} 平仓")
        ContextInfo.draw_text(1, 1, '平')

把Python复制到券商的QMT或iQuant平台中,可以进行回测。

如果生成实盘QMT策略,就能实盘交易。

今天的文章先写到这里,欢迎继续关注我的博客。后面我还介绍更多的【小白量化智能体】开发Python策略的知识。
超越自己是我的每一步!我的进步就是你的进步!

相关推荐
Lannyuu12 分钟前
Java:继承和多态(必会知识点整理)
java·开发语言
祁许32 分钟前
【Golang】GORM - GEN工具 快速开始
开发语言·golang
2025年一定要上岸39 分钟前
JavaSE-8-多态
java·开发语言
音程42 分钟前
(已解决) 如何使用密钥连接远程服务器jupyter notebook从而在本地浏览器上打开
运维·服务器·python·jupyter
遇见尚硅谷44 分钟前
C语言:20250714笔记
c语言·开发语言·数据结构·笔记·算法
余厌厌厌1 小时前
Go迭代器完全指南:从基础到实战
开发语言·golang
Norvyn_71 小时前
LeetCode|Day11|557. 反转字符串中的单词 III|Python刷题笔记
笔记·python·leetcode
我爱一条柴ya1 小时前
【AI大模型】BERT微调文本分类任务实战
人工智能·pytorch·python·ai·分类·bert·ai编程
墨尘游子1 小时前
一文读懂循环神经网络(RNN)—语言模型+n元语法(1)
人工智能·python·rnn·深度学习·神经网络·语言模型
chao_7891 小时前
动态规划题解_零钱兑换【LeetCode】
python·算法·leetcode·动态规划