策略模型是日线的,比如上穿upprice就买入,下穿downprice就卖出。开盘价在upprice和downprice之间,但是我要限制每天只交易一次,就是如果买入1次之后,即使后面价格下穿了downprice,我也不操作了。还有就是模型上午开了一次,已经买入过一次, 模型退出过,下午重开模型即便有下穿,也不卖出。总的一句话,就是一天无论如何只操作一次,要怎么实现?谢谢先
按理说
弄个全局变量
日线barOpen刷新一下
开场时候重置一下就解决了吧
我的周期为日线,我运行A_GetPreFills后,从fill的结构体里头取出最近交易时间,用来判断是否是在当天的交易时间里头,然后确认是否关闭交易。这个问题是解决了。
还有一个问题就是模型设计上可能出现一种情况:盘中一登录就会触发交易(也就是说是当天早些时间就已经触发了交易)。但是我又没有办法保证每天都能在前一天晚上9点之前登录然后一直保持这个状态,(比如前一天晚上没有登录,早上8点50几分登录这种情况实在是无法避免)。这时就会出现交易信号已经成为历史信号了,交易系统不发单。
这个问题之前我做了一些尝试:周期还是1天,我把交易触发信号放在了ontick()上。然后通过日志查看,ontick上的交易代码有运行(紧跟buy和sellshort后面的fileappend()函数有运行),但是就是不发单,然后你们客服说不发单的原因应该是ontick()这个已经弃用了引起的。
现在有点迷茫ing,不知道这个问题是不是只能用多图层来解决了
ontick的驱动时机和onbar是一样的,为什么要用ontick?
我设置的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)这个条件成立,而且是最新行情,能正常发单?(模型期望的)
以上是我的理解,但是事实上是两个都不发单。不知道错在哪里,还请刘老师指导一下。
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); 不仅有成交日期,还有时间,那么应该也可以实现?不知道有没有,请指导
按照你截取的代码思路与王老师的思路不同啊,不过我觉得也是可以实现的,但是没法历史回测复现,只能实盘模拟账户调试验证。另外结合你提问的原始需求来看,不应该使用【A_GetPosition】倒是应该用【A_GetPreFills】才能判断。
有道理,应该是用A_GetPreFills会更加准确和适用。但是有一点我不太明白,其中tradingDay的数据格式明明是YYYYMMDD.hhmmss。不知道为什么我这个获取到的数据只有YYYYMMDD(20240607)而没有hhmmss。
Position结构体里头和Fil结构体l里头都有tradingDay这个属性,不知道Fill里头取到的数值是否还是只有YYYYMMDD,如果还是没有hhmmss这个数值,那用这个办法可能还是有点问题。
不知道这个缺失了hhmmss是我哪里没用对还是bug?
你最好自己动手验证一下,我猜测【A_GetPreFills】会有时间信息,毕竟一个返回的是一种截面状态,一个返回的是成交明细记录。
交易日变化
if(date<>date[1])
if(truedate<>turedate[1])
类似以上
一般通过变量计数实现,设置1个a默认为0
if(买入条件 and a<1)
{
buy;
a = a+1;
}
if(交易日变化)
{
a = 0;
}
王老师,光用计数变量a可能无法满足他的原始需求,因为他有个需求是这样描述的:【还有就是模型上午开了一次,已经买入过一次, 模型退出过,下午重开模型即便有下穿,也不卖出。总的一句话,就是一天无论如何只操作一次,要怎么实现?】。也就是策略退出关闭的时候,要事先保存一下,下次再次打开策略的时候,还要事先读取上次关闭前的状态,所以理论上是要借助【基础数据】来实现的功能。