以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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));
|