文章声明:本内容为个人的业余研究,和任何单位,机构没有关系,文章出现的股票代码,全部只是测试例子,不做投资参考,投资有风险,代码学习使用,不做商业用途,
今天开始出一下工具的使用教程,我目前更新了很多工具,我虽然写了教程,但是可能有的地方不是很仔细,我很慢会给详细的视频的教程


教程直接看就可以

原理图

简单的教程,具体的教程可以看网页的教程,也可以看视频
1导入策略

选择源代码的

2设置账户

3设置交易的板块

4设置交易的金额

5设置交易通知

6视频交易测试,是否测试参数一点要改成是

7点击模型交易挂实盘就可以


8买入板块测试,安原理只需要通达信板块买入板块有新增加的标的就买入有委托检测,持股检测,比如把002281添加到买入BUY1板块里面


立马触发买入算法

9同理卖出板块的测试,前提你需要有持股,比如把歌尔股份添加到SELL1板块


立马触发卖出


运行的结果非常的不错

源代码我全部上传了可以增加加入下载也可以找我要优惠券,优惠100

不懂的问我就可以,加我备注入群,可以加入量化群,需要程序的找我

量化福利,专业的量化技术支持

代码学习参考
#encoding:gbk
'''
索普通达信多板块交易系统源代码版
作者:索普量化
微信:xms_quants1
时间:20251006
价格类型参数
-1 无效(只对于algo_passorder起作用)
0 卖5价
1 卖4价
2 卖3价
3 卖2价
4 卖1价
5 最新价
6 买1价
7 买2价(组合不支持)
8 买3价(组合不支持)
9 买4价(组合不支持)
10 买5价(组合不支持)
'''
import pandas as pd
import numpy as np
import talib
import os
import time
from datetime import datetime
import math
import time
import requests
import json
import random
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def init(c):
c.text={
"标记":"作者:索普量化微信:xms_quants1",
"授权码":"0xc8b4f09d7e509d80052d2b9447cccd5a2a23e1624e3ad2b014899529c59bb0bd41e61a7df98554e70df2576471bc393004f8a0c256a16abfd7e4d14f2fc1e9520e80f1a5acc92c3e68e08972d01eb5b64532abb41ee8cdf3435878c4d26697b79f78274d0ee962c5583a8f02d0e8730c4c55c85f04d545073eecb8e34fcaa987f7c5",
"是否测试说明":"测试的时候改成是,实盘改成是否",
"是否测试":"否",
"账户":"55001947",
"策略名称":"索普通达信多板块交易系统源代码版",
"账户类型":"STOCK",
"买入价格编码":4,
"卖出价格编码":6,
"不成交撤单下单时间":600,
"持股限制":100,
"是否开启账户个股止盈止损":"否",
"账户个股止盈":20,
"账户个股止损":-8,
"是否开启当日止盈止损":"否",
"当日止盈":15,
"当日止损":-5,
"交易品种":'stock,fund,bond',
"买入通达信路径":"C:/new_tdx/T0002/blocknew",
"买入自选股板块":"BUY1,BUY3",
"买入后是否剔除板块成分股":"是",
"持股同步通达路径":"C:/new_tdx/T0002/blocknew",
"持股同步通达信板块":"QMTCG1,QMTCG3",
"通达信卖出路径":"C:/new_tdx/T0002/blocknew",
"卖出预警板块":"SELL1,SELL3",
"卖出后是否剔除板块成分股":"是",
"剔除预警标开头":'688,300',
"交易模式":"金额",
"固定交易金额":10000,
"固定交易数量":100,
"特殊交易标的":'600031,600111',
"特殊交易标的固定交易金额":15000,
"特殊交易标的固定交易数量":100,
"时间设置":"时间设置********",
"交易时间段":8,
"交易开始时间":9,
"交易结束时间":24,
"是否参加集合竞价":"是",
"开始交易分钟":0,
"通知发送方式说明":"QQ/企业微信/钉钉",
"通知发送方式":"QQ",
"发送QQ":"1029762153@qq.com",
"接收QQ":"1029762153@qq.com",
"QQ掩码":"jjfgdhklgguebdje",
"企业微信token":"1,1",
"钉钉token":"1,1"
}
#账户
c.account=c.text['账户']
#账户类型
c.account_type=c.text['账户类型']
if c.account_type=='stock' or c.account_type=='STOCK':
c.buy_code=23
c.sell_code=24
else:
#融资融券
c.buy_code=33
c.sell_code=34
c.buy_price_code=c.text['买入价格编码']
c.sell_price_code=c.text['卖出价格编码']
test=c.text['是否测试']
if test=='是':
print('开启测试模型,实盘记得关闭')
else:
del_all_tdx_buy_stock(c)
del_all_tdx_sell_stock(c)
c.st_name=c.text['策略名称']
print(get_account(c,c.account,c.account_type))
print(get_position(c,c.account,c.account_type))
#循环模式3秒
#买入模块
c.run_time("run_all_buy_func","2nSecond","2024-07-25 13:20:00")
#卖出函数
c.run_time("run_all_sell_func","3nSecond","2024-07-25 13:20:00")
#5分钟不成交撤单了在下
cacal_time=c.text['不成交撤单下单时间']
c.run_time("run_order_trader_func","{}nSecond".format(cacal_time),"2024-07-25 13:20:00")
#账户止盈止损
c.run_time("get_account_stock_stop_trader","3nSecond","2024-07-25 13:20:00")
#当日止盈止损
c.run_time("get_daily_stock_stop_trader","3nSecond","2024-07-25 13:20:00")
#清空板块内容
c.run_time("del_all_tdx_buy_stock","1nDay","2024-07-25 09:10:00")
c.run_time("del_all_tdx_sell_stock","1nDay","2024-07-25 09:11:00")
c.run_time("del_all_tdx_buy_stock","1nDay","2024-07-25 15:01:00")
c.run_time("del_all_tdx_sell_stock","1nDay","2024-07-25 15:02:00")
def handlebar(c):
pass
def del_all_tdx_buy_stock(c):
'''
清空全部的买入板块
'''
tdx_path=c.text['买入通达信路径']
name_list=c.text['买入自选股板块'].split(',')
tdx=xg_tdx(tdx_path)
for name in name_list:
tdx.del_all_tdx_stock(name=name)
print('买入板块{} 清空完成'.format(name))
def del_all_tdx_sell_stock(c):
'''
清空通达信卖出板块数据
'''
tdx_path=c.text['通达信卖出路径']
name_list=c.text['卖出预警板块'].split(',')
tdx=xg_tdx(tdx_path)
for name in name_list:
tdx.del_all_tdx_stock(name=name)
print('卖出板块{}清空完成'.format(name))
def get_price(c,stock):
'''
获取最新价格
'''
tick=c.get_full_tick(stock_code=[stock])
tick=tick[stock]
price=tick['lastPrice']
return price
def select_data_type(stock='600031'):
'''
选择数据类型
'''
stock=str(stock)
if stock[:2] in ['11','12'] or stock[:3] in ['123','110','113','123','127','128','118','132','120']:
return 'bond'
elif stock[:2] in ['51','15','50','16','18','52']:
return 'fund'
else:
return 'stock'
def adjust_stock(stock='600031.SH'):
'''
调整代码
'''
if stock[-2:]=='SH' or stock[-2:]=='SZ' or stock[-2:]=='sh' or stock[-2:]=='sz':
stock=stock.upper()
else:
if stock[:3] in ['600','601','603','605','688','689',
] or stock[:2] in ['11','51','58']:
stock=stock+'.SH'
else:
stock=stock+'.SZ'
return stock
def get_zdf(c,stock):
'''
获取涨跌幅数据
'''
tick=c.get_full_tick(stock_code=[stock])
tick=tick[stock]
price=tick['lastPrice']
lastClose=tick['lastClose']
zdf=((price-lastClose)/lastClose)*100
return zdf
def get_buy_tdx_stock(c,path=r'C:/new_tdx/T0002/blocknew',name='BUY1'):
'''
读取买入板块
'''
#读取通达信自选股
name=name
tdx_path=path
tdx=xg_tdx(tdx_path)
try:
df=tdx.read_tdx_stock_1(name=name)
df['名称']=c.st_name
df['板块']=name
df['交易类型']='buy'
df['投资备注']=df['名称']+','+df['板块']+','+df['证券代码']+','+df['交易类型']
except Exception as e:
print(e,name,'买入板块路径有问题')
return df
def check_not_trader_data(c):
'''
检测买入没有成交的数据
主要检测买入的包含了废单
'''
trader_log=get_order(c,c.account,c.account_type)
now_dat=str(datetime.now())[:10]
if trader_log.shape[0]>0:
trader_log['策略']=trader_log['投资备注'].apply(lambda x: str(x).split(',')[0])
trader_log=trader_log[trader_log['策略']==c.st_name]
if trader_log.shape[0]>0:
maker_list=trader_log['投资备注'].tolist()
else:
maker_list=[]
else:
maker_list=[]
return maker_list
def get_buy_stock(c,path=r'C:/new_tdx/T0002/blocknew',name='BUY1'):
'''
获取买入股票池数据
'''
tarder_type=c.text['交易品种'].split(',')
del_list=c.text['剔除预警标开头'].split(',')
hold_limit=c.text['持股限制']
#读取持股
hold_stock=get_position(c,c.account,c.account_type)
if hold_stock.shape[0]>0:
hold_stock=hold_stock[hold_stock['持仓量']>=10]
if hold_stock.shape[0]>0:
hold_stock['品种']=hold_stock['证券代码'].apply(lambda x:select_data_type(x))
hold_stock['选择']=hold_stock['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
hold_stock=hold_stock[hold_stock['选择']=='是']
if hold_stock.shape[0]>0:
hold_stock_list=hold_stock['证券代码'].tolist()
hold_stock_amount=len(hold_stock_list)
else:
hold_stock_list=[]
hold_stock_amount=0
else:
hold_stock_list=[]
hold_stock_amount=0
else:
hold_stock_list=[]
hold_stock_amount=0
#读取通达信自选股
df=get_buy_tdx_stock(c,path=path,name=name)
if df.shape[0]>0:
df['证券代码']=df['证券代码'].apply(lambda x: str(x))
df['品种']=df['证券代码'].apply(lambda x:select_data_type(x))
df['选择']=df['品种'].apply(lambda x:'是' if x in tarder_type else '不是')
df['剔除']=df['证券代码'].apply(lambda x: '是' if x in del_list else '不是')
df=df[df['选择']=='是']
df=df[df['剔除']=='不是']
if df.shape[0]>0:
maker_list=check_not_trader_data(c)
not_trader_amount=len(maker_list)
df['持股']=df['证券代码'].apply(lambda x: '是' if x in hold_stock_list else '不是')
df['已经委托']=df['投资备注'].apply(lambda x: '是' if x in maker_list else '不是')
df=df[df['持股']=='不是']
df=df[df['已经委托']=='不是']
if df.shape[0]>0:
buy_df=df
buy_amount=hold_limit-hold_stock_amount-not_trader_amount
if buy_amount>0:
buy_amount=buy_amount
buy_df=buy_df[:buy_amount]
else:
print('超过持股限制{}不买入'.format(hold_limit))
buy_df=pd.DataFrame()
else:
buy_df=pd.DataFrame()
else:
buy_df=pd.DataFrame()
else:
buy_df=pd.DataFrame()
return buy_df
def check_is_buy(c,accountid,datatype,stock='513100.SH',amount=100,price=1.3):
'''
检查是否可以买入
'''
account=get_account(c,accountid,datatype)
#可以使用的现金
av_cash=account['可用金额']
value=amount*price
if av_cash>=value:
return True
else:
print('{} 买入不了{} 可用资金小于买入资金{}'.format(stock,av_cash,value))
return False
def check_is_sell(c,accountid,datatype,stock='',amount=''):
'''
检查是否可以卖出
'''
position=get_position(c,accountid,datatype)
if position.shape[0]>0