以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  为什么这样不对,总是1  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=184427)

--  作者:haizxj
--  发布时间:2021/2/28 17:29:12
--  为什么这样不对,总是1
思路是这样的,没亏损之前,一直用一手开平,如果亏损一次,则加一次手数,具体程序如下,可是发现一直是0,错在哪?

VARIABLE:  ss:=1;

if NUMSEQLOSS=1 then ss:=1;
if NUMSEQLOSS=2 then ss:=2;
if NUMSEQLOSS=3 then ss:=4;
if NUMSEQLOSS=4 then ss:=8;
if NUMSEQLOSS>=4 then ss:=16;

ma5:ma(c,5);
ma10:ma(c,10);
KD:ma5>ma10;
PD:ma5<ma10;
kk:pd;
pk:kd;
IF KD THEN BUY(1,ss,MARKET);
IF kk THEN BUYSHORT(1,ss,MARKET);
IF pd THEN SELL(1,ss,MARKET);
IF pk THEN SELLSHORT(1,ss,MARKET);

--  作者:FireScript
--  发布时间:2021/3/1 9:13:41
--  
 你应该这样做:
在平仓的地方做判断,平仓后判断上笔盈亏。然后对全局变量做操作即可。
IF pd THEN  
begin
SELL(1,ss,MARKET);
if NUMPROFIT(1)<0 then ss:=ss+1;
end

--  作者:haizxj
--  发布时间:2021/3/1 11:54:57
--  
VARIABLE:  ss:=1;


ma5:ma(c,5);
ma10:ma(c,10);
KD:ma5>ma10;
PD:ma5<ma10;
kk:pd;
pk:kd;




if pd THEN
BEGIN
sell(1,ss,MARKET);
if NUMSEQLOSS=1 then ss:=1;
if NUMSEQLOSS=2 then ss:=2;
if NUMSEQLOSS=3 then ss:=4;
if NUMSEQLOSS=4 then ss:=8;
if NUMSEQLOSS>=4 then ss:=16;

end
if pk THEN
BEGIN
sellshort(1,ss,MARKET);
if NUMSEQLOSS=1 then ss:=1;
if NUMSEQLOSS=2 then ss:=2;
if NUMSEQLOSS=3 then ss:=4;
if NUMSEQLOSS=4 then ss:=8;
if NUMSEQLOSS>=4 then ss:=16;

end

IF KD THEN BUY(1,ss,MARKET);
IF kk THEN BUYSHORT(1,ss,MARKET);

这样还是不行,
如果用NUMPROFIT(1)<0
连赔四次,SS变化了

--  作者:haizxj
--  发布时间:2021/3/1 11:58:25
--  
VARIABLE:  ss:=1;


ma5:ma(c,5);
ma10:ma(c,10);
KD:ma5>ma10;
PD:ma5<ma10;
kk:pd;
pk:kd;




if pd THEN
BEGIN
sell(1,ss,MARKET);
if NUMPROFIT(1) then ss:=1;
if NUMPROFIT(2) then ss:=2;
if NUMPROFIT(3) then ss:=4;
if NUMPROFIT(4) then ss:=8;
if NUMPROFIT(5) then ss:=16;

end
if pk THEN
BEGIN
sellshort(1,ss,MARKET);
if NUMPROFIT(1) then ss:=1;
if NUMPROFIT(2) then ss:=2;
if NUMPROFIT(3) then ss:=4;
if NUMPROFIT(4) then ss:=8;
if NUMPROFIT(5) then ss:=16;

end

IF KD THEN BUY(1,ss,MARKET);
IF kk THEN BUYSHORT(1,ss,MARKET);


如果这样全变成4

--  作者:FireScript
--  发布时间:2021/3/1 12:02:20
--  
NUMSEQLOSS 表示的是从历史到现在的连亏次数。 你亏10次 可能算一次连亏也可能是2次 都有可能。所以你上面那个代码
if NUMSEQLOSS=1 then ss:=1;
if NUMSEQLOSS=2 then ss:=2;
if NUMSEQLOSS=3 then ss:=4;
if NUMSEQLOSS=4 then ss:=8;
if NUMSEQLOSS>=4 then ss:=16;
是不对的。你不能用这个函数,也不能用这样的逻辑处理。

--  作者:FireScript
--  发布时间:2021/3/1 12:05:39
--  
http://www.weistock.com/bbs/dispbbs.asp?BoardID=4&ID=67366&skin=0

看这里的五楼吧。

--  作者:haizxj
--  发布时间:2021/3/1 12:56:29
--  
VARIABLE: n:=0;
VARIABLE: ss=1;


ma5:ma(c,5);
ma10:ma(c,10);
KD:ma5>ma10;
PD:ma5<ma10;
kk:pd;
pk:kd;




if pd THEN
BEGIN
sell(1,ss,MARKET);
if NUMPROFIT(1)>0 then n:=1;
if NUMPROFIT(1)<0 then n:=n+1;


end
if pk THEN
BEGIN
sellshort(1,ss,MARKET);
if NUMPROFIT(1)>0 then n:=1;
if NUMPROFIT(1)<0 then n:=n+1;


end
if n:=1 then ss:=1;
if n:=2 then ss:=2;
if n:=3 then ss:=4;
if n:=4 then ss:=8;
if n>=5 then ss:=16;

IF KD THEN BUY(1,ss,MARKET);
IF kk THEN BUYSHORT(1,ss,MARKET);

在图表上这里没有16,最大是8,而且那个五楼也是错的,要有冒号

--  作者:FireScript
--  发布时间:2021/3/1 13:15:51
--  
 你的平仓要改成全平

sellshort(1,holding,MARKET);
sell(1,holding,MARKET);

否则 平仓盈亏那个函数无法统计的。它是按照全平处理的。

--  作者:haizxj
--  发布时间:2021/3/1 13:27:41
--  
怎么平仓手数变成60,70手呢
我意思是如果连亏4次以上,就是五次以上时,按16手计算,不再增加,因为 实际没这么多钱

--  作者:FireScript
--  发布时间:2021/3/1 13:33:57
--  
 因为你条件是一直在满足,一直在加仓的。。

KD:ma5>ma10;
PD:ma5<ma10;
kk:pd;
pk:kd;

你这几个条件满足了就是连续多个周期都会满足的。你累积到平仓时候,当然手数很多啦。