就是K线走完前提前下单,走完后信号如果消失再补回持仓?
是这个意思,只是在K线中第一次出现操作信号时下单(比如平空开多),之后一直到K线走完之前不再处理反复出现和消失的信号(消失时如果多仓则平多开空),最后在K线走完时判断一次,根据最后这次的判断决定是否再补回持仓。
谢谢管理员,不过提前多少秒下单是不固定的,需要在K线中由条件(与close有关)决定。
为了解决这个问题,我在数据库全局变量中设置了INKBUY, ENDKSELL, KTIME三个全局变量,确保在关机后重新加载程序也不会被初始化。程序设计的逻辑是:
1.为了实现在K线中间的操作,在图表交易中设定了60秒的固定时间间隔,希望K线周期中每60秒时应该执行一遍程序;
2.当买多条件达到时发出平空开多指令并设置数据库中的全局变量'INKBUY’为1,之后至K线结束不再执行任何交易指令,但判断需要恢复持仓时将数据库全局变量'ENDKSELL'置为1,提供给下一个K线的第一个60秒执行时进行持仓的恢复操作;
3.为判断是新K线的第一个60秒,设置了KTIME变量,从数据库全局变量取出的值与time进行比较,不相等的情况应该在新K线的第一个60秒时就可以发现,这时执行恢复持仓的操作并将KTIME置为当前time,在之后的60秒轮询中将不会再被执行。
对应的代码如下:
gbtime:EXTGBDATA('KTIME'),linethick0; //在新K线的第一个60秒没有走完时读取的应该是上一个K线的时间。
inkbuy:EXTGBDATA('INKBUY'),linethick0; //上一个K线如果出现K线中平空开多操作是被置为1的,本周期K线的第一个60秒轮询是要用做判断条件的。
endksell:EXTGBDATA('ENDKSELL'),linethick0; //上一个K线最后一个60秒轮询的结果如果需要恢复持仓(平多开空)是被置为1的。
if gbtime<>time then begin //由于新K线的第一个60秒轮询时,gbtime是上一个K线的时间,time是新K线时间,条件成立,之后至K线结束都不再成立。
if inkbuy and endksell then begin //如果上一个K线发生K线中的平空开多并走完K线时需要恢复持仓执行下面结构中的语句
sell(holding>0, 1, limitr, o); //由于是新K线的第一个60秒,这时的o应该就是新K线的开盘价吧????不是很确定!!!
buyshort(holding=0,1, limitr, o);
if holding<0 then begin //恢复持空仓后将数据库变量置为0
EXTGBDATASET('ENDKSELL' , 0);
EXTGBDATASET('INKBUY' , 0);
end
end
EXTGBDATASET('KTIME' , time); //在新K线的第一个60秒轮询时将数据库的时间全局变量置为新K线时间,这样在第一个60秒后至K线结束gbtime=time
end
请火哥或管理员帮助看看上面的实现有问题吗?另外帮助分析一下下面出现问题的原因。
按照上面代码实现后,出现如下问题:
1. 在图表显示的gbtime总是上一个K线的time,但打开工具->数据->全局变量看却是当前K线的time????难道gbtime并不是根据定义的轮询时间被执行???
2. 在有两个主图K线的框架中,gbtime在图表上的显示飘忽不定,似乎是在前面的K线中随机取的,打开工具->数据->全局变量看却始终是当前K线的时间。但这种情况在只有一个主图K线的框架中不会发生,就是总出现问题1,使得程序不能按所需逻辑运行。
图表实现 用enterlong entershort 指令,用buy sell 麻烦
后台用tsell tbuy
提前N秒,跟C有关? 你根据你的思路举个例子得了。帮你实现
请详细一点(在什么样的周期,提前几秒是如何计算的等)
sell sellshort 要执行,必须前面有信号。
信号消失后,你的holding可能是大于0的,但是实际仓位是 空单,这是要买入平仓。而holding>0 是无法用sellshort的。
如果非要用 新交易系统指令,需要做特别处理