全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
怎么限制交易次数
wsxqaz 分享到
2024-06-07 10:51

策略模型是日线的,比如上穿upprice就买入,下穿downprice就卖出。开盘价在upprice和downprice之间,但是我要限制每天只交易一次,就是如果买入1次之后,即使后面价格下穿了downprice,我也不操作了。还有就是模型上午开了一次,已经买入过一次, 模型退出过,下午重开模型即便有下穿,也不卖出。总的一句话,就是一天无论如何只操作一次,要怎么实现?谢谢先

wangkaiming

一般通过变量计数实现,设置1个a默认为0

if(买入条件 and a<1)

{

buy;

a = a+1;

}

if(交易日变化)

{

a = 0;

}

2024-06-07 16:57
Phoenix129
@wangkaiming

王老师,光用计数变量a可能无法满足他的原始需求,因为他有个需求是这样描述的:【还有就是模型上午开了一次,已经买入过一次, 模型退出过,下午重开模型即便有下穿,也不卖出。总的一句话,就是一天无论如何只操作一次,要怎么实现?】。也就是策略退出关闭的时候,要事先保存一下,下次再次打开策略的时候,还要事先读取上次关闭前的状态,所以理论上是要借助【基础数据】来实现的功能。

2024-06-09 11:47
wangkaiming

交易日变化

if(date<>date[1])

if(truedate<>turedate[1])

类似以上

2024-06-07 16:58
wsxqaz

Vars

Global Bool today_not_traded;

Global Position mypos;

OnReady()

{

A_GetPosition(mypos);

    today_not_traded=mypos.tradingDay<=TradingCloseDateTime(Symbol, PreTradingDay(currentdate,1),0);//判断上次交易是否是在上一个K线收盘时间前。

   

    FileAppend(\"H:\\\\\"+symbol,\"------------------------------\");

    FileAppend(\"H:\\\\\"+symbol,DateTimeToString(CurrentDate+CurrentTime)+\"    login\");

    FileAppend(\"H:\\\\\"+symbol,\"mypos.tradingDay:\"+text(mypos.tradingDay));

    FileAppend(\"H:\\\\\"+symbol,\"TradingCloseDateTime(symbol, PreTradingDay(currentdate,1),  0):\"+text(TradingCloseDateTime(symbol, PreTradingDay(currentdate,1),  0)));

     }

今天是2024年6月9日,6月7日日盘模拟账号上有交易FileAppend(\"H:\\\\\"+symbol,\"mypos.tradingDay:\"+text(mypos.tradingDay));的执行结果是mypos.tradingDay:20240607。

FileAppend(\"H:\\\\\"+symbol,\"TradingCloseDateTime(symbol, PreTradingDay(currentdate,1),  0):\"+text(TradingCloseDateTime(symbol, PreTradingDay(currentdate,1),  0)));的执行结果是

TradingCloseDateTime(symbol, PreTradingDay(currentdate,1),  0):20240607.150000000


today_not_traded=mypos.tradingDay<=TradingCloseDateTime(Symbol, PreTradingDay(currentdate,1),0);这个的结果应该是TRUE(未验证)

现在的问题是

1、假设6月8日也有开盘,那如果我是在6月7日夜盘有成交,那么text(mypos.tradingDay)这个的结果是20240607还是20240608?

2、还有有没有什么函数能得到成交的详细时间的?如果today_not_traded=(成交时间公式??)<=TradingCloseDateTime(Symbol, PreTradingDay(currentdate,1),0);   不仅有成交日期,还有时间,那么应该也可以实现?不知道有没有,请指导

2024-06-09 11:08
Phoenix129
@wsxqaz

按照你截取的代码思路与王老师的思路不同啊,不过我觉得也是可以实现的,但是没法历史回测复现,只能实盘模拟账户调试验证。另外结合你提问的原始需求来看,不应该使用【A_GetPosition】倒是应该用【A_GetPreFills】才能判断。

2024-06-09 11:42
wsxqaz
@Phoenix129

有道理,应该是用A_GetPreFills会更加准确和适用。但是有一点我不太明白,其中tradingDay的数据格式明明是YYYYMMDD.hhmmss。不知道为什么我这个获取到的数据只有YYYYMMDD(20240607)而没有hhmmss。

Position结构体里头和Fil结构体l里头都有tradingDay这个属性,不知道Fill里头取到的数值是否还是只有YYYYMMDD,如果还是没有hhmmss这个数值,那用这个办法可能还是有点问题。

不知道这个缺失了hhmmss是我哪里没用对还是bug?

2024-06-09 14:48
Phoenix129
@wsxqaz

你最好自己动手验证一下,我猜测【A_GetPreFills】会有时间信息,毕竟一个返回的是一种截面状态,一个返回的是成交明细记录。

2024-06-09 15:45
wgy_king

按理说

弄个全局变量

日线barOpen刷新一下

开场时候重置一下就解决了吧

2024-06-11 11:12
wsxqaz
@wgy_king

我的周期为日线,我运行A_GetPreFills后,从fill的结构体里头取出最近交易时间,用来判断是否是在当天的交易时间里头,然后确认是否关闭交易。这个问题是解决了。

还有一个问题就是模型设计上可能出现一种情况:盘中一登录就会触发交易(也就是说是当天早些时间就已经触发了交易)。但是我又没有办法保证每天都能在前一天晚上9点之前登录然后一直保持这个状态,(比如前一天晚上没有登录,早上8点50几分登录这种情况实在是无法避免)。这时就会出现交易信号已经成为历史信号了,交易系统不发单。

这个问题之前我做了一些尝试:周期还是1天,我把交易触发信号放在了ontick()上。然后通过日志查看,ontick上的交易代码有运行(紧跟buy和sellshort后面的fileappend()函数有运行),但是就是不发单,然后你们客服说不发单的原因应该是ontick()这个已经弃用了引起的。

现在有点迷茫ing,不知道这个问题是不是只能用多图层来解决了


2024-06-17 13:11
kyover
@wsxqaz

ontick的驱动时机和onbar是一样的,为什么要用ontick?

2024-06-17 13:25
wsxqaz
@kyover

我设置的1天的周期,在 onbar上我把High赋值给GLOBAL Numeric global_high变量。

1.假设当global_high高于1000的时候要买入,如果昨天晚上9:30的时候价格从999跳到1001,可是我是今天早上9点15分登录交易系统的,这时候(global_high>1000)成立但也不会发单。这是因为已经成为历史信号?

2、ontick的周期是1个tick,所以每个tick过来的数据都是当前的行情,假设也是早上9:15分登录系统,系统在第一次运行ontick的时候(global_high>1000)这个条件成立,而且是最新行情,能正常发单?(模型期望的)

以上是我的理解,但是事实上是两个都不发单。不知道错在哪里,还请刘老师指导一下。

2024-06-17 14:11
您未登录,请先 登录注册 后发表评论
顶部