以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  如何实现固定时间隔小于K线周期时盘中开仓后至K线走完之间不再出现任何操作?  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=10332)

--  作者:MMM
--  发布时间:2012/2/28 10:36:49
--  如何实现固定时间隔小于K线周期时盘中开仓后至K线走完之间不再出现任何操作?
想在K线走完之前的盘中实现判断和操作所以采用了固定时间间隔,间隔时间小于K线周期,希望盘中第一次达到条件时操作之后至K线走完之前忽略任何信号,在K线走完时再次进行一次判断,如何实现请大侠帮忙!
[此贴子已经被作者于2012-2-28 10:37:21编辑过]

--  作者:董小球
--  发布时间:2012/2/28 10:39:44
--  
你说的这个要用全局变量来进行记录和处理
你可以参考这个帖子

--  作者:MMM
--  发布时间:2012/3/5 19:29:19
--  
折腾了几天还是不能完全解决,是否在runmode=0和走完K线交易条件下无法在K线周期中进行开平仓?如果遇到长阳或长阴希望在K线没有走完提前止损又如何实现呢?
--  作者:阿火
--  发布时间:2012/3/5 22:26:50
--  

就是K线走完前提前下单,走完后信号如果消失再补回持仓?


--  作者:MMM
--  发布时间:2012/3/6 18:49:17
--  

是这个意思,只是在K线中第一次出现操作信号时下单(比如平空开多),之后一直到K线走完之前不再处理反复出现和消失的信号(消失时如果多仓则平多开空),最后在K线走完时判断一次,根据最后这次的判断决定是否再补回持仓。


--  作者:admin
--  发布时间:2012/3/6 20:23:08
--  
这个不用后台在图表上是无法做到的,即便后台实现也非常复杂,建议你购买专业版,使用专业版的提前N秒下单,然后下个周期恢复持仓功能
--  作者:MMM
--  发布时间:2012/3/6 22:17:45
--  

谢谢管理员,不过提前多少秒下单是不固定的,需要在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,使得程序不能按所需逻辑运行。


[此贴子已经被作者于2012-3-6 22:28:37编辑过]

--  作者:阿火
--  发布时间:2012/3/6 22:32:34
--  

图表实现 用enterlong entershort 指令,用buy sell 麻烦

后台用tsell tbuy

 

提前N秒,跟C有关? 你根据你的思路举个例子得了。帮你实现

请详细一点(在什么样的周期,提前几秒是如何计算的等)

[此贴子已经被作者于2012-3-6 22:33:48编辑过]

--  作者:admin
--  发布时间:2012/3/6 22:32:45
--  
似乎你忽略一个重要问题,就是你要在ISLASTBAR条件上来控制只在最后一个周期来控制全局变量,否则都是每次都第一个BAR开始初始化
--  作者:阿火
--  发布时间:2012/3/6 22:36:19
--  

sell sellshort 要执行,必须前面有信号。

信号消失后,你的holding可能是大于0的,但是实际仓位是 空单,这是要买入平仓。而holding>0 是无法用sellshort的。

如果非要用 新交易系统指令,需要做特别处理

[此贴子已经被作者于2012-3-6 22:37:04编辑过]