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

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

网格买入原理分析
网格交易是一种基于价格波动的量化交易策略,核心思想是在设定价格区间内,将资金分成多份,每当价格下跌一定幅度(网格间距)时买入一份,价格上涨一定幅度时卖出一份,通过低买高卖赚取差价。
买入网格 是网格交易的单边部分,专注于在价格下跌时逐步建仓,等待未来价格上涨时卖出(可由另一函数实现)。该策略适用于震荡市场,能自动捕捉价格波动中的买入机会。
代码逻辑详解
提供的 <span leaf="">run_gd_trade_buy(c)</span> 函数实现了基于固定下跌比例的买入网格,主要步骤如下:
- 初始化参数:从配置对象
<span leaf="">c</span> 中读取记录文件路径、下跌比例(负值,如 <span leaf="">-1</span> 表示跌幅超过1%)、交易模式(数量/金额/百分比)和下单值。
- 获取持仓与账户信息:检查当前持仓,提取可用数量,用于后续买入判断。
- 交易日与股票池检查:确认当前为交易日且存在自定义交易股票池。
- 遍历股票池:对每只股票执行以下操作:
- 若当日已有交易记录,取最近一次交易价格作为基准。
- 否则,从
<span leaf="">get_base_price</span> 获取基准(通常为昨收或开盘价)。
- 获取当前日期时间,读取历史交易日志。
- 获取当前最新价,并确定基准价格:
- 获取分笔行情数据(从上次交易时间之后开始),计算最新价相对于基准的涨跌幅。
- 触发条件:若最新跌幅(
<span leaf="">last_zdf</span>)小于设定的下跌比例(即跌幅超过阈值),则触发买入。
- 根据交易模式计算买入数量(支持按固定数量、金额或总资产百分比)。
- 检查买入可行性(资金、最小单位等),若通过则执行买入委托,并记录交易日志(首次循环不记录以避免重复)。
- 异常处理:捕获可能错误,输出提示。
关键点:
- 下跌比例为负值,条件
<span leaf="">last_zdf < down_ratio</span> 确保跌幅大于设定值(如 <span leaf="">-2 < -1</span> 触发)。
- 基准价格动态更新:每次买入后,最新成交价成为新基准,网格向下移动。
- 日志记录用于追踪交易历史和基准价格,避免重复触发。
下面是我绘制的原理图方便理解

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

流程说明:
- 首先初始化参数和账户数据,确保有交易资格。
- 逐股票处理:获取基准价和实时行情,判断是否满足跌幅条件。
- 满足条件则计算数量、执行买入,并更新日志(除首次循环外)。
- 遍历完所有股票后结束。
该函数是网格买入策略的自动化实现,通过动态基准和固定跌幅触发,持续在下跌中建仓,为后续卖出积累筹码。
不懂的问我就可以,加我备注入群可以加入量化群,我专业的量化计算支持服务

代码参考不做交易建议
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()))