以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  同一根k线内多次下单的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=93898)

--  作者:xiebooo
--  发布时间:2016/3/3 13:21:57
--  同一根k线内多次下单的问题
斑竹好!

我的后台程序是在1分钟k线周期上用固定轮询模式运行的,每1秒轮询。金字塔默认同一个k线内只下一次单,第二次以后的tbuy等代码被执行了会被退回;如果加上allowrepeat又会导致在触发条件价位上下来回买卖买卖的闪烁。请问可以怎么解决这个问题?就是让程序接纳同一个k内的所有下单指令,但是不要闪烁。

例子:
if holding > 0 then tsell(cond1, 1, mkt);
if holding = 0 then tbuy(cond2, 1, mkt);
如果本来持有多仓,某个k内cond1满足了,就平多了;然后几秒之后,同一个k之内,cond2又满足了,就又要开多。请问如何让平多开多都在同一个k内正常下单,但是又不要用allowrepeat造成闪烁?

--  作者:jinzhe
--  发布时间:2016/3/3 13:30:27
--  

首先,你用holding来判断后台持仓的吗?这个是图表的不能用在后台上

其次,同一根k线内只下一次单指的是同一句下单语句只会执行一次,并不表示一根k线只有一个下单动作,只要cond1和cond2都满足,那么在同一根k线内先平后开是完全没问题的,你现在是用holding判断导致的问题,不要在后台上用holding判断,用tholding判断,如果需要更加精细的条件判断,则可以用tbuyhodlingex


--  作者:xiebooo
--  发布时间:2016/3/3 14:01:16
--  
1. 没有,这个就是为了举例写的两行代码,holding是一个无意错误,与我的代码无关。
2. 如果不同的下单语句可以在同一k线内下单,那请你帮我看一下代码吧。由于我想用不同的参数在同一个品种内交易,所以使用extgbdata全局变量来记录每套参数的仓位。下面的代码就是第一套参数平多和开多的部分。今天上午出现的一个问题是,我本来沥青第一套参数持多,某分钟内平多条件触发,正常平仓;几秒之后开多条件又触发,后台程序化没有出现开多预警,账户的仓位也没有变化,但是去查全局变量的值,却发现全局变量的赋值是与已经执行开多之后的情况一致。也就是说,开多部分的代码,extgbdataset()都执行了(标黄部分),tbuy却没有得到执行,这可能是什么原因导致的呢?

1c:= extgbdata(\'liqing1c\');  //第一套参数仓位
1p:= extgbdata(\'liqing1p\');  //第一套参数平仓价格
1j:= extgbdata(\'liqing1j\'); //第一套参数持仓期间极值
if 1c > 0 then begin //如果第一套参数持多
if close > 1j then 1j := close; //更新极值
if (1j - 1ext * atr) > 1p then 1p := 1j - 1ext * atr; //更新平仓价格
if close <= ceiling(1p) then begin //如果条件符合则平仓并清零所有全局变量
tsell(1, 1c, mkt);
1j := 0;
1p := 0;
1c := 0;
end;
extgbdataset(\'liqing1c\', 1c); //清零全局变量
extgbdataset(\'liqing1p\', 1p);
extgbdataset(\'liqing1j\', 1j);
end;

if 1c = 0 then begin
if close >= floor(ou1) then begin //开多条件
1j := close; //计算全局变量
1p := close - inistop * atr;
1c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER));

tbuy(1, 1c, mkt); //开多
extgbdataset(\'liqing1c\', 1c); //记录全局变量
extgbdataset(\'liqing1p\', 1p);
extgbdataset(\'liqing1j\', 1j);
//这三行都执行了
end;
end;

--  作者:xiebooo
--  发布时间:2016/3/3 14:02:08
--  
金字塔客户端里拷贝过来的代码怎么格式全没了,都顶格了?
--  作者:jinzhe
--  发布时间:2016/3/3 14:02:47
--  
你输出下1c的值,看看是不是为0
--  作者:jinzhe
--  发布时间:2016/3/3 14:04:10
--  

给你一段简单的代码

tbuY(1,1mkt);

tbuY(1,1mkt);

tbuY(1,1mkt);

你看看是不是触发之后一次性的有3次开仓


--  作者:jinzhe
--  发布时间:2016/3/3 14:04:56
--  
1c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER));

tbuy(1, 1c, mkt); //开多

 

 

测试方法是在这两句中间加一句 debugout(\'1c = %.0f\',1c);

然后在监控界面看看是多少


--  作者:xiebooo
--  发布时间:2016/3/3 14:08:14
--  
1c的值可以在工具-数据管理-全局变量 看到,不是0,是36
--  作者:xiebooo
--  发布时间:2016/3/3 14:10:09
--  
如果1c在这行代码1c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER));之后是0,那么extgbdataset(\'liqing1c\',1c);是紧接其后的,不会被记录为36
--  作者:jinzhe
--  发布时间:2016/3/3 14:11:31
--  

不一样,开仓时的1c是这样计算的:1c := round((tasset * 1inir) / (inistop * atr * MULTIPLIER));