返回列表 发布新帖

量化工具-1强大索普通达信多板块交易系统

27 0

文章声明:本内容为个人的业余研究,和任何单位,机构没有关系,文章出现的股票代码,全部只是测试例子,不做投资参考,投资有风险,代码学习使用,不做商业用途,

今天开始出一下工具的使用教程,我目前更新了很多工具,我虽然写了教程,但是可能有的地方不是很仔细,我很慢会给详细的视频的教程

8024d3807079af39fddc24914d8033c5.png

733c0716a770ac0a40874b37efe68ab2.png

教程直接看就可以

193a8668114c6b37edf0571d55867248.png

原理图

99495118b8c6c44fcc1f8206abd8918f.png

简单的教程,具体的教程可以看网页的教程,也可以看视频

1导入策略

19ed15c8ecccd63e6814f9d7fe74589e.png

选择源代码的

d1740bcd298a47b3faee09a4c5ce75e3.png

2设置账户

17d4302828030bc7ae694ccff05fa46b.png

3设置交易的板块

98bd3b24d88745b52b9ae47b5408c812.png

4设置交易的金额

bdd8854239b6949cfcb35ed00efd836f.png

5设置交易通知

bdd8854239b6949cfcb35ed00efd836f.png

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

90e6afad0cbc8051458990e47fa9690a.png

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

6e8a121c908ff3d0fc2999584c401f08.png

ee301f22dfb646b01cff56e6722b6811.png

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

7aef364775601cc77af3883f6ab16403.png

5524cc0adbb0a5b58c596c7f0f26b035.png

立马触发买入算法

708e6bd2c295748d34cd4dd03e22f7d7.png

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

a5a4022e61ceeee751441f5a4317442d.png

965ffb92e47642877c251fde0470768c.png

立马触发卖出

5aa55716215cff7a4a9ffe942cab06f1.png

f7471ed462394446d6a44d56fd8c22df.png

运行的结果非常的不错

33178bf8214c1fe37074153846645fd3.png

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

c53e50ab57060944520fb0850c47fb0d.jpg

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

032f775b867fd8bcf52ef80fea765eb4.jpg

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

8255e53b00cdd261175c1d20a1ab6e27.png

代码学习参考

#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

回复

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

客服专线

400-080-8112

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