金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 1013|回复: 15

关于限制交易笔数的问题

[复制链接]

29

主题

207

帖子

207

积分

Rank: 4

等级: 专业版

注册:
2025-9-29
曾用名:
发表于 2026-2-3 15:07 | 显示全部楼层 |阅读模式
请问假如我有一个模型监控50只股票,当有10只股票满足买开条件后买入成功但未触发卖出条件,但是第二天又10只股票满足开仓条件有买入了10只股票就会造成重复买入。如果我想等第一次买入的10只股票平仓以后再去判断是否可以买入,而不是多次买入。这要怎么才能实现?
回复

使用道具 举报

2

主题

6204

帖子

6204

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-2-3 15:31 | 显示全部楼层
本帖最后由 资深技术05 于 2026-2-3 15:40 编辑

可以考虑利用tholdcount 函数读取账户栏的持仓品种。

然后使用全局变量设置一个锁。这个锁是这样的,如果发现 tholdcount达到10了,这个锁就锁上。之后只有账号持仓品种数量为0 时候才解锁。

有锁的时候不开仓,即可。  理论上 这样应该是可以控制住的。  


[PEL] 复制代码

//持仓品种大于10 直接锁定住
if tholdcount('')>= 10 then extgbdataset('lock',1);
if tholdcount('')= 0 then  extgbdataset('lock',0);

lock:extgbdata('lock');




IF lock=0 AND 开仓条件 then 
begin 
//开仓语句
END


下单的10个品种,建议先走股票池筛选出来,再进行下单。如果直接监控50个品种,可能由于账户数据更新时间差的缘故,导致你最终开仓超过10个品种,尤其是信号是同一时间触发情况下。 读持仓的函数更新是和柜台回报关联,必然存在物理意义上的延迟,本地执行程序速度是快于这个时间的。
回复

使用道具 举报

29

主题

207

帖子

207

积分

Rank: 4

等级: 专业版

注册:
2025-9-29
曾用名:
 楼主| 发表于 2026-2-4 10:59 | 显示全部楼层
资深技术05 发表于 2026-2-3 15:31
可以考虑利用tholdcount 函数读取账户栏的持仓品种。

然后使用全局变量设置一个锁。这个锁是这样的,如 ...

那如果这样的话是针对该模型选取的股票进行限制,还是说如果其他模型选择了别的股票也会受到影响?
回复

使用道具 举报

2

主题

6204

帖子

6204

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-2-4 11:03 | 显示全部楼层
会受到其他策略影响的,因为你下单都下到这个统一的账户里,这个是没法识别策略来源的哦。如果你是要限制这个策略只下10个品种,那这个就比较复杂了。目前没有很好的方案。
回复

使用道具 举报

29

主题

207

帖子

207

积分

Rank: 4

等级: 专业版

注册:
2025-9-29
曾用名:
 楼主| 发表于 2026-2-4 11:25 | 显示全部楼层
资深技术05 发表于 2026-2-4 11:03
会受到其他策略影响的,因为你下单都下到这个统一的账户里,这个是没法识别策略来源的哦。如果你是要限制这 ...

// 全局持仓锁变量
GLOBALVARIABLE:Position_Lock := 0;

// 开仓条件判断(增加持仓锁检查)
Buy_Condition := [您的买入条件] AND Position_Lock = 0;

// 实际开仓操作
IF Buy_Condition THEN BEGIN
    TBUY(1, MKT);  // 示例:买入1手
    Position_Lock := 1;  // 锁定持仓
    DEBUGFILE('D:\trade.log', '开仓锁定,时间%.0f', TIME);
END;

// 平仓检测(全品种持仓归零时解锁)
IF TBUYHOLDINGEX('','',2) = 0 AND TSELLHOLDINGEX('','',2) = 0 THEN BEGIN
    Position_Lock := 0;
    DEBUGFILE('D:\trade.log', '平仓解锁,时间%.0f', TIME);
END;
请问这是AI给出的方案这样可行吗?
回复

使用道具 举报

2

主题

6204

帖子

6204

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-2-4 12:01 | 显示全部楼层
你直接用我之前提供的代码就行。 这种控制肯定不能用GLOBALVARIABLE 定义的全局变量,它只对当前策略下的当前在运行的品种有效的。根本不能被其他品种读取到。
回复

使用道具 举报

29

主题

207

帖子

207

积分

Rank: 4

等级: 专业版

注册:
2025-9-29
曾用名:
 楼主| 发表于 2026-2-4 13:47 | 显示全部楼层
资深技术05 发表于 2026-2-4 12:01
你直接用我之前提供的代码就行。 这种控制肯定不能用GLOBALVARIABLE 定义的全局变量,它只对当前策略下的当 ...

您的意思是使用上面的全局变量锁只能对当前单独运行的策略有用吗?它会影响到其他策略的建仓是这个意思吗?
回复

使用道具 举报

2

主题

6204

帖子

6204

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-2-4 13:50 | 显示全部楼层
本帖最后由 资深技术05 于 2026-2-4 13:51 编辑

GLOBALVARIABLE这个全局变量只对当前品种奏效,你如果持仓超过10个品种,按照逻辑要执行这个锁,并且这个锁状态是需要被其他品种知晓的,GLOBALVARIABLE定义的状态是无法被共享的,并且最大问题是程序暂停这个全局变量值就自动清掉了,不能持久化。  
回复

使用道具 举报

29

主题

207

帖子

207

积分

Rank: 4

等级: 专业版

注册:
2025-9-29
曾用名:
 楼主| 发表于 2026-2-4 14:36 | 显示全部楼层
资深技术05 发表于 2026-2-4 13:50
GLOBALVARIABLE这个全局变量只对当前品种奏效,你如果持仓超过10个品种,按照逻辑要执行这个锁,并且这个锁 ...

// 初始化锁(只需执行一次)
IF ISFIRSTBAR THEN
    EXTGBDATASET('POSITION_LOCK', 0);

// 开仓前检查全局锁
Buy_Condition := CROSS(MA5,MA10) AND EXTGBDATA('POSITION_LOCK') = 0;
IF Buy_Condition THEN BEGIN
    TBUY(1, MKT);
    EXTGBDATASET('POSITION_LOCK', 1);  // 全局上锁
END;

// 平仓检测(需配合持仓监控)
IF TBUYHOLDINGEX('','',2) = 0 AND TSELLHOLDINGEX('','',2) = 0 THEN
    EXTGBDATASET('POSITION_LOCK', 0);  // 全局解锁
请问我这样是不是就可以解决这个问题了呢?
回复

使用道具 举报

2

主题

6204

帖子

6204

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2026-2-4 14:45 | 显示全部楼层
“TBUYHOLDINGEX('','',2) = 0 AND TSELLHOLDINGEX('','',2) = 0”
这个是判断当前品种没有持仓。按照前面需求是需要看账户持仓有多少。

“// 开仓前检查全局锁
Buy_Condition := CROSS(MA5,MA10) AND EXTGBDATA('POSITION_LOCK') = 0;
IF Buy_Condition THEN BEGIN
    TBUY(1, MKT);
    EXTGBDATASET('POSITION_LOCK', 1);  // 全局上锁
END;”


这里也不能说当前品种开仓时候就上锁了呀,当前品种开仓就上锁,到平仓再解锁。那其他品种在你这个品种没有平仓前都是不能开仓了。你这个相当于始终只持仓一个品种。  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2026-3-1 00:34 , Processed in 0.170031 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表