返回列表 发布新帖

法码高频日内网格算法--2单边网格买入原理

12 1

在网格的配置中,我保留了参数可以单独开启买入,卖出网格,也可以买卖网格一起开启形成循环的买卖做T网格,我这里采用单独开启买入网格,我一般不用网页做买入,我一般是检测持股卖出比较多

2f07c7204cc18100ef69f27fd32d55cd.png

下面是我绘制的大概下跌买入网格的原理,这个只是开启了单边下跌买入网格模块

fc037aef8e1b4844ee9521eb5b650c76.png

网格买入原理分析

网格交易是一种基于价格波动的量化交易策略,核心思想是在设定价格区间内,将资金分成多份,每当价格下跌一定幅度(网格间距)时买入一份,价格上涨一定幅度时卖出一份,通过低买高卖赚取差价。 买入网格 是网格交易的单边部分,专注于在价格下跌时逐步建仓,等待未来价格上涨时卖出(可由另一函数实现)。该策略适用于震荡市场,能自动捕捉价格波动中的买入机会。

代码逻辑详解

提供的 <span leaf="">run_gd_trade_buy(c)</span> 函数实现了基于固定下跌比例的买入网格,主要步骤如下:

  1. 初始化参数:从配置对象 <span leaf="">c</span> 中读取记录文件路径、下跌比例(负值,如 <span leaf="">-1</span> 表示跌幅超过1%)、交易模式(数量/金额/百分比)和下单值。
  2. 获取持仓与账户信息:检查当前持仓,提取可用数量,用于后续买入判断。
  3. 交易日与股票池检查:确认当前为交易日且存在自定义交易股票池。
  4. 遍历股票池:对每只股票执行以下操作:
    • 若当日已有交易记录,取最近一次交易价格作为基准。
    • 否则,从 <span leaf="">get_base_price</span> 获取基准(通常为昨收或开盘价)。
    • 获取当前日期时间,读取历史交易日志。
    • 获取当前最新价,并确定基准价格:
    • 获取分笔行情数据(从上次交易时间之后开始),计算最新价相对于基准的涨跌幅。
    • 触发条件:若最新跌幅(<span leaf="">last_zdf</span>)小于设定的下跌比例(即跌幅超过阈值),则触发买入。
    • 根据交易模式计算买入数量(支持按固定数量、金额或总资产百分比)。
    • 检查买入可行性(资金、最小单位等),若通过则执行买入委托,并记录交易日志(首次循环不记录以避免重复)。
  5. 异常处理:捕获可能错误,输出提示。

关键点

  • 下跌比例为负值,条件 <span leaf="">last_zdf < down_ratio</span> 确保跌幅大于设定值(如 <span leaf="">-2 < -1</span> 触发)。
  • 基准价格动态更新:每次买入后,最新成交价成为新基准,网格向下移动。
  • 日志记录用于追踪交易历史和基准价格,避免重复触发。

下面是我绘制的原理图方便理解

b60cf9764551d3477b2eb07bd2038ac5.png

  • 基准价格:作为比较的起始点,可以是前收盘价或最近一次交易价。
  • 下跌比例:固定的阈值(如-1%),当价格从基准下跌超过此值时触发买入。
  • 买入后更新:买入价成为新基准,等待下一次下跌,实现网格下移。

函数流程图(执行流程)

image.png

流程说明

  • 首先初始化参数和账户数据,确保有交易资格。
  • 逐股票处理:获取基准价和实时行情,判断是否满足跌幅条件。
  • 满足条件则计算数量、执行买入,并更新日志(除首次循环外)。
  • 遍历完所有股票后结束。

该函数是网格买入策略的自动化实现,通过动态基准和固定跌幅触发,持续在下跌中建仓,为后续卖出积累筹码。

不懂的问我就可以,加我备注入群可以加入量化群,我专业的量化计算支持服务

2c234474d3346258fab485f9b04a1cbe.jpg

代码参考不做交易建议

def run_gd_trade_buy(c):
    '''
    网格买入
    "网格买入设置":"网格买入设置*********",
    "是否开启网格买入":"是",
    "下跌比例":-1,
    '''
    path=c.text['记录文件路径']
    down_ratio=c.text['下跌比例']
    trader_type=c.text['交易模式']
    value=c.text['下单值']
    position=get_position(c,c.account,c.account_type)
    account=get_account(c,c.account,c.account_type)
    if position.shape[0]>0:
        position=position[position['持仓量']>=10]
        if position.shape[0]>0:
            hold_list=position['证券代码'].tolist()
            av_amount_dict=dict(zip(position['证券代码'],position['可用数量']))
        else:
            hold_list=[]
            av_amount_dict={}
    else:
        hold_list=[]
        av_amount_dict={}
    if check_is_trader_date_1(c):
        df=get_trader_stock(c)
        if df.shape[0]>0:
            for stock,name in zip(df['证券代码'],df['名称']):
                try:
                    print('***************************网格买入{} {}************************************************************************************'.format(stock,name))
                    now_date=int(''.join(str(datetime.now())[:10].split('-')))
                    #now_date='20260130'
                    date_time=int(''.join(str(datetime.now()).split('.')[0][-8:].split(':')))
                    #date_time=93030
                    log=check_trader_log(c)
                    price=get_price(c,stock)
                    price=round(price,3)
                    if log.shape[0]>0:
                        log=log[['证券代码','名称',"类型",'交易模式',
                            '交易方向','交易值','交易价格','交易时间','交易日']]
                        log=log.sort_values(by='交易时间',ascending=True)
                        log['交易日']=log['交易日'].astype(int)
                        log=log[log['交易日']==now_date]
                    else:
                        log=pd.DataFrame()
                    #获取开始的基础价格
                    if log.shape[0]>0:
                        log_stock=log[log['证券代码']==stock]
                        if log_stock.shape[0]>0:
                            base_price=log_stock['交易价格'].tolist()[-1]
                            last_time=log_stock['交易时间'].tolist()[-1]
                            stats=True
                        else:
                            base_price=get_base_price(c,stock)
                            last_time=93000
                            stats=False
                    else:
                        base_price=get_base_price(c,stock)
                        last_time=93000
                        stats=False
                    if stats==True:
                        tick=get_stock_lx_tick(c,stock,date=str(now_date))
                        tick=tick[tick['time']>=last_time]
                    else:
                        tick=get_stock_lx_tick(c,stock,date=str(now_date))
                    if tick.shape[0]>0:
                        lastClose_list=tick['lastPrice'].tolist()
                        #最新值
                        last_price=lastClose_list[-1]
                        #目前的涨跌幅
                        last_zdf=((last_price-base_price)/base_price)*100
                        #跌幅大于目前跌幅
                        if last_zdf<down_ratio:
                            print('触发买入网格{} 最新价{},基础价{},目前跌幅{}大于目前跌幅{}'.format(stock,last_price,base_price,last_zdf,down_ratio))
                            if trader_type=='数量':
                                amount=value
                            elif trader_type=='金额':
                                amount=value/price
                                amount=adjust_amount(stock,amount)
                            elif trader_type=='百分比':
                                total=account['总资产']
                                value=total*value
                                amount=value/price
                                amount=adjust_amount(stock,amount)
                            else:
                                amount=0
                            if  check_is_buy(c,c.account,c.account_type,stock=stock,amount=amount,price=price) and amount>=10:
                                maker='{},网格买入,{},{},{},{}'.format(c.st_name,stock,'sell',amount,price)
                                passorder(c.buy_code, 1101,c.account, stock, c.buy_price_code, 0, amount, maker,1,maker,c)
                                trader_log=pd.DataFrame()
                                trader_log['证券代码']=[stock]
                                trader_log['名称']=[name]
                                trader_log['类型']=['网格买入']
                                trader_log['交易模式']=[trader_type]
                                trader_log['交易方向']=['buy']
                                trader_log['交易值']=[value]
                                trader_log['交易价格']=[price]
                                trader_log['交易时间']=[int(date_time)]
                                trader_log['交易日']=[int(now_date)]
                                #第一次循环运行卖出不记录
                                if a.gd_buy==0:
                                    print(stock,'第一次循环运行买入不记录********')
                                    a.gd_buy=1
                                else:
                                    log=pd.concat([log,trader_log],ignore_index=True)
                                    if log.shape[0]>0:
                                        log['证券代码']=log['证券代码'].apply(lambda x: '0'*(6-len(str(x)))+str(x))
                                    else:
                                        log=log
                                    log.to_excel(r'{}'.format(path))
                                    print(maker)
                            else:
                                print(stock,'买入失败开年没有金额')
                        else:
                            print('没有触发买入网格{} 最新价{},基础价{},目前跌幅{}小于目前跌幅{}'.format(stock,last_price,base_price,last_zdf,down_ratio))
                    else:
                        print(str(datetime.now())[:-7],stock,'触发买入网格没有数据/拐点触发交易时间大于15:00')
                except Exception as e:
                    print(e,stock,'买入网格有问题*************')
        else:
            print('网格买入没有自定义交易股票池*********')
    else:
        print('{}网格买入目前不是交易时间*********'.format(datetime.now()))

评论1

*******7387_PLDFA楼主
发表于 24 分钟前 | 显示全部楼层
管理员微信:fama_quants,不懂的问我就可以

回复

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

主题

40

回帖

7

积分

0

客服专线

400-080-8112

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