【小白量化智能体】应用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策略的知识。
超越自己是我的每一步!我的进步就是你的进步!