以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  循环问题求教  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=85592)

--  作者:Prongs
--  发布时间:2015/9/24 10:42:08
--  循环问题求教

写了一个网格交易的模型,单行执行没有问题,但是改成循环语句就出问题了,感觉好像不是完全执行完第一个循环再去执行第二个循环,而是整体在执行循环,请问是哪里出了问题?

 

单行是可以执行的:

input: P(2600,0,50000,1), J(3,1,10,1),N(10,1,100,1); //初始价格,网格宽度,每笔手数


 

if TREMAINQTY(1,\'\',\'\')<=0*n then
tbuy(c>=p-9*j&&tholding2<=9*n,n,lmt,p-9*j);

if TREMAINQTY(1,\'\',\'\')<=1*n then
tbuy(c>=p-8*j&&tholding2<=8*n,n,lmt,p-8*j);

if TREMAINQTY(1,\'\',\'\')<=2*n then
tbuy(c>=p-7*j&&tholding2<=7*n,n,lmt,p-7*j);

if TREMAINQTY(1,\'\',\'\')<=3*n then
tbuy(c>=p-6*j&&tholding2<=6*n,n,lmt,p-6*j);

if TREMAINQTY(1,\'\',\'\')<=4*n then
tbuy(c>=p-5*j&&tholding2<=5*n,n,lmt,p-5*j);

 

if TREMAINQTY(1,\'\',\'\')<=5*n then
tbuy(c>=p-4*j&&tholding2<=4*n,n,lmt,p-4*j);

if TREMAINQTY(1,\'\',\'\')<=6*n then
tbuy(c>=p-3*j&&tholding2<=3*n,n,lmt,p-3*j);

if TREMAINQTY(1,\'\',\'\')<=7*n then
tbuy(c>=p-2*j&&tholding2<=2*n,n,lmt,p-2*j);

if TREMAINQTY(1,\'\',\'\')<=8*n then
tbuy(c>=p-j&&tholding2<=n,n,lmt,p-j);

if TREMAINQTY(1,\'\',\'\')<=9*n then
tbuy(c>=p&&tholding2<=0,n,lmt,p);

 

if TREMAINQTY(4,\'\',\'\')<=9*n then
tsell(c<=p-8*j&&tholding2>=10*n,n,lmt,p-8*j);

if TREMAINQTY(4,\'\',\'\')<=8*n then
tsell(c<=p-7*j&&tholding2>=9*n,n,lmt,p-7*j);

if TREMAINQTY(4,\'\',\'\')<=7*n then
tsell(c<=p-6*j&&tholding2>=8*n,n,lmt,p-6*j);

if TREMAINQTY(4,\'\',\'\')<=6*n then
tsell(c<=p-5*j&&tholding2>=7*n,n,lmt,p-5*j);

if TREMAINQTY(4,\'\',\'\')<=5*n then
tsell(c<=p-4*j&&tholding2>=6*n,n,lmt,p-4*j);


if TREMAINQTY(4,\'\',\'\')<=4*n then
tsell(c<=p-3*j&&tholding2>=5*n,n,lmt,p-3*j);

if TREMAINQTY(4,\'\',\'\')<=3*n then
tsell(c<=p-2*j&&tholding2>=4*n,n,lmt,p-2*j);

if TREMAINQTY(4,\'\',\'\')<=2*n then
tsell(c<=p-j&&tholding2>=3*n,n,lmt,p-j);

if TREMAINQTY(4,\'\',\'\')<=1*n then
tsell(c<=p&&tholding2>=2*n,n,lmt,p);

if TREMAINQTY(4,\'\',\'\')<=0*n then
tsell(c<=p+j&&tholding2>=n,n,lmt,p+j);

 

循环执行会出现问题:

input: P(2600,0,50000,1), J(3,1,10,1),N(10,1,100,1),M(10,1,30,1); //初始价格,网格宽度,每笔手数,网格数量

FOR i=1 TO M DO

if TREMAINQTY(1,\'\',\'\')<=(i-1)*n then
tbuy(c>=p-(10-i)*j&&tholding2<=(10-i)*n,n,lmt,p-(10-i)*j);

FOR u=1 TO M DO

if TREMAINQTY(4,\'\',\'\')<=(10-u)*n then
tsell(c<=p-(9-u)*j&&tholding2>=(11-u)*n,n,lmt,p-(9-u)*j);

 


 


--  作者:jinzhe
--  发布时间:2015/9/24 10:52:43
--  
处理中,请稍等
--  作者:wenarm
--  发布时间:2015/9/24 13:50:21
--  

循环次数并没有你说的现象。你参考下面的调试代码。使用的debugfile输出的。


input:P(2600,0,50000,1), J(3,1,10,1),N(10,1,100,1),M(10,1,30,1); //初始价格,网格宽度,每笔手数,网格数量

FOR i=1 TO M DO

BEGIN
if TREMAINQTY(1,\'\',\'\')<=(i-1)*n then
tbuy(c>=p-(10-i)*j&&tholding2<=(10-i)*n,n,lmt,p-(10-i)*j);
DEBUGFILE(\'D:\\cc.TXT\',\'i循环次数%.2f\',i);
end

FOR u=1 TO M DO
BEGIN
if TREMAINQTY(4,\'\',\'\')<=(10-u)*n then
tsell(c<=p-(9-u)*j&&tholding2>=(11-u)*n,n,lmt,p-(9-u)*j);
DEBUGFILE(\'D:\\cc.TXT\',\'u循环次数%.2f\',u);
end


--  作者:yukizzc
--  发布时间:2015/9/24 13:51:48
--  

同一条开仓语句在循环体内只会执行一次的,所以和你写很多个if条件里面的开仓交易。

执行结果是不同的


--  作者:Prongs
--  发布时间:2015/9/24 14:32:22
--  

同一条开仓语句在循环体内只会执行一次是什么意思?是说我循环10次只会执行一次开仓?

现在账户挂单实际的流程是买单挂一张,卖单挂一张,买单挂一张,卖单再挂一张...

而单行执行的话是挂完全部买单再挂全部卖单,所以导致执行结果不同


--  作者:fly
--  发布时间:2015/9/24 14:53:08
--  

1.

现在账户挂单实际的流程是买单挂一张,卖单挂一张,买单挂一张,卖单再挂一张...

 

这个执行结果,是您上面说到的,是吧

input:P(2600,0,50000,1), J(3,1,10,1),N(10,1,100,1),M(10,1,30,1); //初始价格,网格宽度,每笔手数,网格数量

FOR i=1 TO M DO

BEGIN
if TREMAINQTY(1,\'\',\'\')<=(i-1)*n then
tbuy(c>=p-(10-i)*j&&tholding2<=(10-i)*n,n,lmt,p-(10-i)*j);
DEBUGFILE(\'D:\\cc.TXT\',\'i循环次数%.2f\',i);
end

FOR u=1 TO M DO
BEGIN
if TREMAINQTY(4,\'\',\'\')<=(10-u)*n then
tsell(c<=p-(9-u)*j&&tholding2>=(11-u)*n,n,lmt,p-(9-u)*j);
DEBUGFILE(\'D:\\cc.TXT\',\'u循环次数%.2f\',u);
end

 

2.

单行执行的话是挂完全部买单再挂全部卖单

这个结果是那个代码执行的

 

您是要实现哪种结果?

3.您运行在几分钟K线下,

   运行模式是:固定时间间隔吗

[此贴子已经被作者于2015/9/24 15:02:08编辑过]

--  作者:Prongs
--  发布时间:2015/9/24 15:10:52
--  

我需要的是单行执行的效果,就是全部挂完买单再挂卖单,但是循环写法不是这样执行的

我是直接在用分笔数据,固定时间间隔运行


--  作者:yukizzc
--  发布时间:2015/9/25 9:25:37
--  

这就是我和你说的,循环体内不会重复执行同一条开仓语句。因为你是分笔周期所以变成了,第一根k执行买卖,然后第二根马上k又买卖了。

要执行重复运行在开仓语句后面加上ALLOWREPEAT。但这个如果你用在分钟周期会导致每次运行都重复报单。