金字塔决策交易系统

标题: 下面这程序为什么每次止损后,都会在原来的止损处开多单,搞不清楚什么原因,帮忙.... [打印本页]

作者: 葛伟星    时间: 2024-1-9 09:34
标题: 下面这程序为什么每次止损后,都会在原来的止损处开多单,搞不清楚什么原因,帮忙....
ZSCOND1:=THOLDING>0 AND TAVGENTERPRICE-C>HZ;
ZSCOND2:=THOLDING<0 AND C-TAVGENTERPRICE>HZ;


IF GDCOND1 THEN BEGIN
        TSELL(THOLDING>0,0,MKT);
        TBUYSHORT(THOLDING=0,SS,MKT);
END

IF GDCOND2 THEN BEGIN
        TSELLSHORT(THOLDING<0,0,MKT);
        TBUY(THOLDING=0,SS,MKT);
END

IF DDCOND3 THEN BEGIN
        TSELL(THOLDING>0,0,MKT);
        TBUYSHORT(THOLDING=0,SS,MKT);
END

IF DDCOND4 THEN BEGIN
        TSELLSHORT(THOLDING<0,0,MKT);
        TBUY(THOLDING=0,SS,MKT);
END

IF ZSCOND1 THEN TSELL(1,0,MKT);
IF ZSCOND2 THEN TSELLSHORT(1,0,MKT);


作者: 技术009    时间: 2024-1-9 10:11
最后面2行是多空止损的语句?

你这个就是单纯条件满足了呀。你要贴下你开多的条件的定义的。看下条件上是否有所冲突。
作者: 葛伟星    时间: 2024-1-9 11:33
技术009 发表于 2024-1-9 10:11
最后面2行是多空止损的语句?

你这个就是单纯条件满足了呀。你要贴下你开多的条件的定义的。看下条件上 ...

GDCOND1:=CROSS(GZ-HZ,L);
GDCOND2:=CROSS(H,GZ-HZ);
DDCOND3:=CROSS(DZ+HZ,L);
DDCOND4:=CROSS(H,DZ+HZ);

ZSCOND1:=THOLDING>0 AND TAVGENTERPRICE-C>HZ;
ZSCOND2:=THOLDING<0 AND C-TAVGENTERPRICE>HZ;

作者: 葛伟星    时间: 2024-1-9 12:17
止损命令这样写好像无效,不知道什么原因
IF TBUYHOLDINGEX('529001041','RM403',1)>0 AND C<TAVGENTERPRICE  THEN TSELL(1,0,STP,TAVGENTERPRICE-HZ);
IF TSELLHOLDINGEX('529001041','RM403',1)>0 AND C>TAVGENTERPRICE THEN TSELLSHORT(1,0,STP,TAVGENTERPRICE+HZ);

补充内容 (2024-1-9 12:17):
是不是STP这样用不起作用
作者: 技术009    时间: 2024-1-9 13:10
首先你止损和开仓 逻辑上没有冲突,就是可以先后触发下单的。这个是完全没问题。

但是如果你一直平仓后又开仓,我建议你去日志里看下触发信号的语句到底是哪一行代码。先确认下这个。  然后再看对应的开仓条件怎么定义的。你这里几个条件都是cross 理论上不会反复触发的。目前你提供的代码是完全看不出问题的,就是常规的代码结构。

stp这个指令没用。国内期货就限价,市价 以及后来新增的fak,fok指令等。
作者: 葛伟星    时间: 2024-1-9 17:58
技术009 发表于 2024-1-9 13:10
首先你止损和开仓 逻辑上没有冲突,就是可以先后触发下单的。这个是完全没问题。

但是如果你一直平仓后 ...

收到,谢谢
我想控制下同一点位只能来回穿叉3次,能不能帮我解决下

作者: 技术009    时间: 2024-1-10 08:55
“我想控制下同一点位只能来回穿叉3次,能不能帮我解决下”

你原本代码里怎么写的。我要参考你原先山下文 来设计这个解决方案的。
作者: 葛伟星    时间: 2024-1-10 11:35
技术009 发表于 2024-1-10 08:55
“我想控制下同一点位只能来回穿叉3次,能不能帮我解决下”

你原本代码里怎么写的。我要参考你原先山下 ...

就是上面的代码呀,我取的是今天和昨天的高低点,好像程序跑的时候开的点位不太对,你能不能给我另外取昨天和今天高低点的方法
NN:=BARSLAST(DATE<>REF(DATE,1))+1;                            //当天K线根数
O_TODAY:=VALUEWHEN(NN=1,OPEN);                                //获取当天开盘价
H_TODAY:=HHV(HIGH,NN);                                                 //获取当天最高价
L_TODAY:=LLV(LOW,NN);                                                    //获取当天最低价
H_YESTERDAY:=REF(H_TODAY,NN);                                     //获取前一天最高价
L_YESTERDAY:=REF(L_TODAY,NN);  
作者: 技术009    时间: 2024-1-10 12:59
参考:https://www.weistock.com/docs/PE ... A%E5%93%81%E7%A7%8D

直接调用昨天的数据即可。


作者: 技术009    时间: 2024-1-10 13:02
“我想控制下同一点位只能来回穿叉3次,能不能帮我解决下”
参考这里  限制交易次数的写法。用全局变量控制就行了。上下穿一次 全局变量累计一次。

https://www.weistock.com/bbs/for ... d=55&extra=page%3D2
作者: 葛伟星    时间: 2024-1-10 15:27
技术009 发表于 2024-1-10 12:59
参考:https://www.weistock.com/docs/PEL/notes/%E8%B7%A8%E6%8C%87%E6%A0%87%E5%91%A8%E6%9C%9F.html#cal ...

怎么调用呀,我上面的好像不对,有没有别的办法,具体麻烦帮我写一下
作者: 技术009    时间: 2024-1-10 17:25

这个调用就 callstock函数的使用。
l1:callstock('',vtlow,6,-1);//昨天的
l2:callstock('',vtlow,6);//今天的低点

h1:callstock('',vthigh,6,-1);
h2:callstock('',vthigh,6);
作者: 葛伟星    时间: 2024-1-10 17:31
技术009 发表于 2024-1-10 17:25
这个调用就 callstock函数的使用。
l1:callstock('',vtlow,6,-1);//昨天的
l2:callstock('',vtlow,6);/ ...

JG:=HHV(H,TODAYBAR);
JD:=LLV(L,TODAYBAR);
ZG:=REF(HHV(H,TODAYBAR),1);
ZD:=REF(LLV(L,TODAYBAR),1);
这样写的可以吗?跟你给的有什么区别?
作者: 技术009    时间: 2024-1-10 17:32
不是哦 你这个zg 你要回溯到昨天收盘K位置,统计的才是对的。而且数据要足才行。
ZG:=REF(HHV(H,TODAYBAR),TODAYBAR);

zd同理。我那个调用 是直接获取日线结果的。你这个是在小周期上统计的。

作者: 葛伟星    时间: 2024-1-10 20:22
技术009 发表于 2024-1-10 17:32
不是哦 你这个zg 你要回溯到昨天收盘K位置,统计的才是对的。而且数据要足才行。
ZG:=REF(HHV(H,TODAYBAR) ...

ZSCOND1:=TBUYHOLDINGEX('529001041','PG2402',2)>0 AND TAVGENTERPRICEEX2('529001041','PG2402',0)-C>HZ;
ZSCOND2:=TSELLHOLDINGEX('529001041','PG2402',2)>0 AND C-TAVGENTERPRICEEX2('529001041','PG2402',1)>HZ;

IF GDCOND1 THEN BEGIN
        TSELL(TBUYHOLDINGEX('529001041','PG2402',2)>0,0,MKT),ORDERQUEUE;
        TBUYSHORT(TSELLHOLDINGEX('529001041','PG2402',2)=0,SS,MKT),ORDERQUEUE;
END

IF GDCOND2 THEN BEGIN
        TSELLSHORT(TSELLHOLDINGEX('529001041','PG2402',2)>0,0,MKT),ORDERQUEUE;
        TBUY(TBUYHOLDINGEX('529001041','PG2402',2)=0,SS,MKT),ORDERQUEUE;
END

IF DDCOND3 THEN BEGIN
        TSELL(TBUYHOLDINGEX('529001041','PG2402',2)>0,0,MKT),ORDERQUEUE;
        TBUYSHORT(TSELLHOLDINGEX('529001041','PG2402',2)=0,SS,MKT),ORDERQUEUE;
END

IF DDCOND4 THEN BEGIN
        TSELLSHORT(TSELLHOLDINGEX('529001041','PG2402',2)>0,0,MKT),ORDERQUEUE;
        TBUY(TBUYHOLDINGEX('529001041','PG2402',2)=0,SS,MKT),ORDERQUEUE;
END

IF ZSCOND1 THEN TSELL(1,0,MKT);
IF ZSCOND2 THEN TSELLSHORT(1,0,MKT);
求解决下,这样写的代码居然锁仓了,怎么样能严禁锁仓
作者: 葛伟星    时间: 2024-1-10 20:25
技术009 发表于 2024-1-10 17:32
不是哦 你这个zg 你要回溯到昨天收盘K位置,统计的才是对的。而且数据要足才行。
ZG:=REF(HHV(H,TODAYBAR) ...

在计算速度上没有区别的是吧
作者: 技术009    时间: 2024-1-11 08:50
zscond1:=tbuyholdingex('529001041','pg2402',2)>0 and tavgenterpriceex2('529001041','pg2402',0)-c>hz;
zscond2:=tsellholdingex('529001041','pg2402',2)>0 and c-tavgenterpriceex2('529001041','pg2402',1)>hz;

if gdcond1 then begin
        tsell(tbuyholdingex('529001041','pg2402',2)>0,0,mkt),orderqueue;
        tbuyshort(tsellholdingex('529001041','pg2402',2)=0 and tbuyholdingex('529001041','pg2402',2)=0,ss,mkt),orderqueue;
end

if gdcond2 then begin
        tsellshort(tsellholdingex('529001041','pg2402',2)>0,0,mkt),orderqueue;
        tbuy(tsellholdingex('529001041','pg2402',2)=0 and tbuyholdingex('529001041','pg2402',2)=0,ss,mkt),orderqueue;
end

if ddcond3 then begin
        tsell(tbuyholdingex('529001041','pg2402',2)>0,0,mkt),orderqueue;
        tbuyshort(tsellholdingex('529001041','pg2402',2)=0 and tbuyholdingex('529001041','pg2402',2)=0,ss,mkt),orderqueue;
end

if ddcond4 then begin
        tsellshort(tsellholdingex('529001041','pg2402',2)>0,0,mkt),orderqueue;
        tbuy(tsellholdingex('529001041','pg2402',2)=0 and tbuyholdingex('529001041','pg2402',2)=0,ss,mkt),orderqueue;
end

if zscond1 then tsell(1,0,mkt);
if zscond2 then tsellshort(1,0,mkt);

开仓地方再限制下吧
作者: 葛伟星    时间: 2024-1-11 15:46
技术009 发表于 2024-1-11 08:50
zscond1:=tbuyholdingex('529001041','pg2402',2)>0 and tavgenterpriceex2('529001041','pg2402',0)-c>hz; ...

我能不能平仓的时候用ALLOWREPEAT,或者开仓后面也用
这样会有什么反应?
作者: 技术009    时间: 2024-1-11 15:47
在有持仓限制下,应该没啥大问题。但是如果没有仓位限制,是可能一直下单的,如果下单条件一直满足得话。
作者: 葛伟星    时间: 2024-1-11 17:20
技术009 发表于 2024-1-11 15:47
在有持仓限制下,应该没啥大问题。但是如果没有仓位限制,是可能一直下单的,如果下单条件一直满足得话。

那orderqueue应该可以不用,感觉它可能会产生滑点,不会应该也不会有什么问题吧
作者: 技术009    时间: 2024-1-11 17:24
队列单 肯定会因为时间延迟缘故 产生滑点

作者: 葛伟星    时间: 2024-1-11 17:30
技术009 发表于 2024-1-11 17:24
队列单 肯定会因为时间延迟缘故 产生滑点

那我就不用了哦,是吧
作者: 葛伟星    时间: 2024-1-11 22:20
技术009 发表于 2024-1-11 15:47
在有持仓限制下,应该没啥大问题。但是如果没有仓位限制,是可能一直下单的,如果下单条件一直满足得话。

还是不行呀,开仓手数我设1,可他会一直开出几手多单,或空单了,怎么回事呀
作者: 技术009    时间: 2024-1-12 08:57

用了ALLOWREPEAT后的结果?
你开仓这里都限制了持仓为0 的 ,那就只有可能是成交回报回来速度比程序执行速度慢,系统在回报回来之前读到的持仓还是为0.是有可能这样的。

那就再补个未成交判断吧。
2个开仓这里都限制下
tbuy(TISREMAIN(1)=0 and  tbuyholdingex('529001041','pg2402',2)=0,ss,mkt);
tbuyshort(TISREMAIN(3)=0 and tsellholdingex('529001041','pg2402',2)=0,ss,mkt);
作者: 葛伟星    时间: 2024-1-12 10:17
技术009 发表于 2024-1-12 08:57
用了ALLOWREPEAT后的结果?
你开仓这里都限制了持仓为0 的 ,那就只有可能是成交回报回来速度比程序执行 ...

是不是直接写在最后就可以了

补充内容 (2024-1-12 10:18):
我还没有用ALLOWREPEAT,就这样了
作者: 葛伟星    时间: 2024-1-12 10:32
跑后台程序是不是数据要补充什么的?为什么隔天效果就不行了?比如今天高点高于了昨高,向下穿HZ的时候就不开仓了
作者: 技术009    时间: 2024-1-12 10:43
正常,你需要做好数据收盘的。

https://www.weistock.com/docs/HE ... AE%BE%E7%BD%AE.html

这样才能稳定好数据。
作者: 技术009    时间: 2024-1-12 11:08
你代码这里写错了,品种代码。是PG02 不应该写PG2402,这样你之前读持仓全是0.

还有如果监控的就是这个品种,直接写空字符串就行了。
作者: 葛伟星    时间: 2024-1-12 12:28
技术009 发表于 2024-1-12 08:57
用了ALLOWREPEAT后的结果?
你开仓这里都限制了持仓为0 的 ,那就只有可能是成交回报回来速度比程序执行 ...

IF GDCOND1 THEN BEGIN
        TSELL(TBUYHOLDINGEX('529001041','',1)>0,0,MKT);
        TBUYSHORT(TSELLHOLDINGEX('529001041','',1)=0 AND TBUYHOLDINGEX('529001041','',1)=0 AND TISREMAIN(3)=0,SS,MKT);
END

IF GDCOND2 THEN BEGIN
        TSELLSHORT(TSELLHOLDINGEX('529001041','',1)>0,0,MKT);
        TBUY(TBUYHOLDINGEX('529001041','',1)=0 AND TSELLHOLDINGEX('529001041','',1)=0 AND TISREMAIN(1)=0,SS,MKT);
END
是不是这样写就差不多了
作者: 技术009    时间: 2024-1-12 13:13
对,可以了。
作者: 葛伟星    时间: 2024-1-12 14:24
技术009 发表于 2024-1-12 10:43
正常,你需要做好数据收盘的。

https://www.weistock.com/docs/HELP/notes/%E9%80%89%E9%A1%B9%E8%AE%BE ...

是不是每天都要这样操作一次,还是有能自动收盘
作者: 技术009    时间: 2024-1-12 14:34
能自动收盘的呀。  我发的链接里有设置的图的。你只要填好一个时间就行了。

作者: 葛伟星    时间: 2024-1-12 15:16
技术009 发表于 2024-1-12 14:34
能自动收盘的呀。  我发的链接里有设置的图的。你只要填好一个时间就行了。

谢谢
麻烦再问一下FOK是不是四大所有交易所都可以用
作者: 葛伟星    时间: 2024-1-12 15:20
葛伟星 发表于 2024-1-12 15:16
谢谢
麻烦再问一下FOK是不是四大所有交易所都可以用

还有就是我用的昨天和今天两天的数据,能不能换成多秒10S或者30S
再问下分笔情况与多秒有什么区别呀
对于我们后台程序怎么用比较好

作者: 技术009    时间: 2024-1-12 15:32
1.几个交易所都支持。


2.“还有就是我用的昨天和今天两天的数据,能不能换成多秒10S或者30S
再问下分笔情况与多秒有什么区别呀”

不是能不能换的问题,是换了之后 你的指标计算都会发生变化。例如类似均线指标这些,换周期就是换数据,结果肯定不一样了。

分笔是最小的周期单位了,交易所提供的成交分笔就是一笔笔这样推送过来的。




作者: 葛伟星    时间: 2024-1-12 15:41
技术009 发表于 2024-1-12 15:32
1.几个交易所都支持。

我不用其他指标,就是价格上下,我用一分钟,来回穿的时候容易漏掉
所以我想用短时间周期,不容易漏掉,因为后台,同一周期只扫一次程序

补充内容 (2024-1-12 15:42):
换了之后对交易速度是不是影响?
作者: 技术009    时间: 2024-1-12 15:47
那就无所谓了周期了,可以秒级别。
通常周期小了,运行负荷也大了,但是你这里得话,我估计影响很小。
作者: 技术009    时间: 2024-1-12 15:47
那就无所谓了周期了,可以秒级别。
通常周期小了,运行负荷也大了,但是你这里得话,我估计影响很小。
作者: 葛伟星    时间: 2024-1-12 17:12
技术009 发表于 2024-1-12 15:47
那就无所谓了周期了,可以秒级别。
通常周期小了,运行负荷也大了,但是你这里得话,我估计影响很小。

那我是不是要把选项里的周期数调一下?还有程序对话框里的860根K线调大
作者: 技术009    时间: 2024-1-12 17:15
我建议你实际运行时候先观察下,没必要提前优化。如果实际运行时候资源占有都很小,就根本无所谓的。
作者: 葛伟星    时间: 2024-1-12 19:45
技术009 发表于 2024-1-12 15:47
那就无所谓了周期了,可以秒级别。
通常周期小了,运行负荷也大了,但是你这里得话,我估计影响很小。

根据不同的品种调整下单的手数,我手数用的是中间变量INPUT:SS(1,1,1000,1);
麻烦怎么帮我在后台程序里应该怎么处理一下呀
作者: 技术009    时间: 2024-1-15 08:56
你这种用参数控制的 , 你可以新建多个预警去监控不同的品种,然后直接在参数里调整手数就行了。

而且这种多个预警还能启用到多核运行,提高软件对资源的利用率




欢迎光临 金字塔决策交易系统 (https://www.weistock.com/bbs/) Powered by Discuz! X3.4