金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 6653|回复: 16

请大神指点该程序问题出在哪里

[复制链接]

6

主题

23

帖子

23

积分

Rank: 1

等级: 新手上路

注册:
2021-5-31
曾用名:
发表于 2021-6-1 09:11 | 显示全部楼层 |阅读模式
本小白试着写了个程序,思路是连续止损三次后才开仓,但是测试时没有结果,不知道问题出在哪里,求大神指点,感激不尽:

[PEL] 复制代码
input:n1(5,1,20,1),n2(20,5,60,1),n3(40,20,250,5),m(20,6,80,2);
VARIABLE:该笔盈亏:=0,模拟持仓:=0,模拟开仓价:=0,模拟平仓价:=0,真实系统下单开关:=0,盈亏记录:=0,MP:=0;

MA5:=ma(c,N1);
MA20:=ma(c,N2);
MA60:=ma(c,n3);
ATR:=MA(TR,20);

开多条件:=MA5>MA20 AND MA20>MA60 and C>REF(HHV(MAX(O,C),m),1);
多头止损:=c-0.8*atr;

开空条件:=MA5<MA20 AND MA20<MA60 and  C<REF(LLV(MIN(O,C),m),1);
空头止损:=c+0.8*atr;


//模拟交易
 IF 开多条件 and 模拟持仓=0 and 真实系统下单开关<>1 then BEGIN
	模拟开仓价:=c;
	模拟持仓:=1;
 END
  if c<多头止损 and 模拟持仓=1 then BEGIN
  	模拟平仓价:=c;
  	该笔盈亏:=模拟平仓价-模拟开仓价;
  	模拟持仓:=0;
  	if 该笔盈亏>0 then BEGIN
  		盈亏记录:=0;
  		真实系统下单开关:=0;
  		模拟开仓价:=0;
  		模拟平仓价:=0;
  	end
    if 	该笔盈亏<=0 then BEGIN
    	IF 盈亏记录=3 then  真实系统下单开关:=1;
    	IF 盈亏记录>=2 then 盈亏记录:=3;
    	IF 盈亏记录=1 then 盈亏记录:=2;
    	IF 盈亏记录=0 then 盈亏记录:=1;
    	模拟开仓价:=0;
  		模拟平仓价:=0;
  	END
  END
  

if 开空条件  and 模拟持仓=0 and 真实系统下单开关<>1 then BEGIN
	模拟开仓价:=c;
	模拟持仓:=-1;
END
  if c>空头止损 and 模拟持仓=-1 then BEGIN
  	模拟平仓价:=c;
  	该笔盈亏:=模拟开仓价-模拟平仓价;
  	模拟持仓:=0;
  	if 该笔盈亏>0 then BEGIN
  		盈亏记录:=0;
  		真实系统下单开关:=0;
  		模拟开仓价:=0;
  		模拟平仓价:=0;
  	end
    if 	该笔盈亏<=0 then BEGIN
    	IF 盈亏记录=3 then  真实系统下单开关:=1;
    	IF 盈亏记录>=2 then 盈亏记录:=3;
    	IF 盈亏记录=1 then 盈亏记录:=2;
    	IF 盈亏记录=0 then 盈亏记录:=1;
  		模拟开仓价:=0;
  		模拟平仓价:=0;
  	END
  END

//真实交易
IF  开多条件  and 真实系统下单开关=1 THEN BEGIN;
	MP:=0;
	BUY(1,50%,NEXTOPEN),PERTRADER;	
END
 
IF   开空条件 and 真实系统下单开关=1 THEN BEGIN; 
	MP:=0;
	BUYSHORT(1,50%,NEXTOPEN),PERTRADER;
END

IF HOLDING>0 AND c<多头止损 THEN 多止损:SELL(1,ABS(HOLDING),NEXTOPEN);
IF HOLDING<0 AND c>空头止损 THEN 空止损:SELLSHORT(1,ABS(HOLDING),NEXTOPEN);

IF OPENPROFIT>MP THEN MP:=OPENPROFIT;

IF  (MP/ABS(HOLDING))>=(C*MULTIPLIER*0.1*0.5) THEN BEGIN 
    IF ((MP-OPENPROFIT)/MP)>=(30*0.01) THEN BEGIN
       多止盈1:SELL(HOLDING>0,ABS(HOLDING),NEXTOPEN);
       空止盈1:SELLSHORT(HOLDING<0,ABS(HOLDING),NEXTOPEN); 
    END
END

IF  (MP/ABS(HOLDING))>=(C*MULTIPLIER*0.1*1.2) THEN BEGIN 
    IF ((MP-OPENPROFIT)/MP)>=(50*0.01) THEN BEGIN
       多止盈2:SELL(HOLDING>0,ABS(HOLDING),NEXTOPEN);
       空止盈2:SELLSHORT(HOLDING<0,ABS(HOLDING),NEXTOPEN); 
       END
END

资金:ASSET,NOAXIS;
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-6-1 09:28 | 显示全部楼层
我把你的条件输出了下。

c<多头止损  和 c>空头止损   这2个我作为变量输出了下。我发现他们没有满足的。

后来我发现
多头止损:=c-0.8*atr;

这个肯定是恒小于c的啊。

c<c-0.8*atr

atr是一个正数情况下,不等式恒满足。。。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-6-1 09:29 | 显示全部楼层
我这里猜测你这个止盈止损价格应该是在开仓位置进行获取的吧?
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

6

主题

23

帖子

23

积分

Rank: 1

等级: 新手上路

注册:
2021-5-31
曾用名:
 楼主| 发表于 2021-6-1 09:33 | 显示全部楼层
谢谢指导,这里的本意是价格低于0.8倍atr时就止损,请教要如何修改才好?
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-6-1 09:35 | 显示全部楼层
你现在
多头止损:=c-0.8*atr;

这个是跟随K每个K都重新计算的。这样你在任意K上判断它都不会满足的。
我举得你这个止损价格 应该是在开仓位置进行设置的吧? 只有这样后续才可能有满足止损的情况。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-6-1 09:41 | 显示全部楼层
[PEL] 复制代码
input:n1(5,1,20,1),n2(20,5,60,1),n3(40,20,250,5),m(20,6,80,2);
VARIABLE:该笔盈亏:=0,模拟持仓:=0,模拟开仓价:=0,模拟平仓价:=0,真实系统下单开关:=0,盈亏记录:=0,MP:=0,多头止损:=0,空头止损:=0;
 
MA5:=ma(c,N1);
MA20:=ma(c,N2);
MA60:=ma(c,n3);
ATR:=MA(TR,20);
 
开多条件:MA5>MA20 AND MA20>MA60 and C>REF(HHV(MAX(O,C),m),1);
开空条件:MA5<MA20 AND MA20<MA60 and  C<REF(LLV(MIN(O,C),m),1);

 
//模拟交易
 IF 开多条件 and 模拟持仓=0 and 真实系统下单开关<>1 then 
 BEGIN
    模拟开仓价:=c;
    模拟持仓:=1;
    多头止损:=c-0.8*atr;
 END
 
if c<多头止损 and 模拟持仓=1 then 
  BEGIN
    模拟平仓价:=c;
    该笔盈亏:=模拟平仓价-模拟开仓价;
    模拟持仓:=0;
    多头止损:=0;
    if 该笔盈亏>0 then 
    BEGIN
        盈亏记录:=0;
        真实系统下单开关:=0;
        模拟开仓价:=0;
        模拟平仓价:=0;
    end
    if  该笔盈亏<=0 then BEGIN
        IF 盈亏记录=3 then  真实系统下单开关:=1;
        IF 盈亏记录>=2 then 盈亏记录:=3;
        IF 盈亏记录=1 then 盈亏记录:=2;
        IF 盈亏记录=0 then 盈亏记录:=1;
        模拟开仓价:=0;
        模拟平仓价:=0;
    END
  END
   
 
if 开空条件  and 模拟持仓=0 and 真实系统下单开关<>1 then BEGIN
    模拟开仓价:=c;
    模拟持仓:=-1;
    空头止损:=c+0.8*atr;

END
  if c>空头止损 and 模拟持仓=-1 then BEGIN
    模拟平仓价:=c;
    该笔盈亏:=模拟开仓价-模拟平仓价;
    模拟持仓:=0;
    空头止损:=0;
    if 该笔盈亏>0 then BEGIN
        盈亏记录:=0;
        真实系统下单开关:=0;
        模拟开仓价:=0;
        模拟平仓价:=0;
    end
    if  该笔盈亏<=0 then BEGIN
        IF 盈亏记录=3 then  真实系统下单开关:=1;
        IF 盈亏记录>=2 then 盈亏记录:=3;
        IF 盈亏记录=1 then 盈亏记录:=2;
        IF 盈亏记录=0 then 盈亏记录:=1;
        模拟开仓价:=0;
        模拟平仓价:=0;
    END
  END
 
//真实交易
IF  开多条件  and 真实系统下单开关=1 THEN BEGIN;
    MP:=0;
    BUY(1,50%,NEXTOPEN),PERTRADER;
    多头止损:=c-0.8*atr;
    
END
  
IF   开空条件 and 真实系统下单开关=1 THEN BEGIN
    MP:=0;
    BUYSHORT(1,50%,NEXTOPEN),PERTRADER;
    空头止损:=c+0.8*atr;
END
 
IF HOLDING>0 AND c<多头止损 THEN 多止损:SELL(1,ABS(HOLDING),NEXTOPEN);
IF HOLDING<0 AND c>空头止损 THEN 空止损:SELLSHORT(1,ABS(HOLDING),NEXTOPEN);
 
IF OPENPROFIT>MP THEN MP:=OPENPROFIT;
 
IF  (MP/ABS(HOLDING))>=(C*MULTIPLIER*0.1*0.5) THEN BEGIN
    IF ((MP-OPENPROFIT)/MP)>=(30*0.01) THEN BEGIN
       多止盈1:SELL(HOLDING>0,ABS(HOLDING),NEXTOPEN);
       空止盈1:SELLSHORT(HOLDING<0,ABS(HOLDING),NEXTOPEN); 
    END
END
 
IF  (MP/ABS(HOLDING))>=(C*MULTIPLIER*0.1*1.2) THEN BEGIN
    IF ((MP-OPENPROFIT)/MP)>=(50*0.01) THEN BEGIN
       多止盈2:SELL(HOLDING>0,ABS(HOLDING),NEXTOPEN);
       空止盈2:SELLSHORT(HOLDING<0,ABS(HOLDING),NEXTOPEN); 
       END
END
 
资金:ASSET,NOAXIS;



这样改下。我把止盈止损价格获取放到了开仓位置获取。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

6

主题

23

帖子

23

积分

Rank: 1

等级: 新手上路

注册:
2021-5-31
曾用名:
 楼主| 发表于 2021-6-1 09:53 | 显示全部楼层
谢谢指导!另外还想请教一下,在这种平仓条件相对复杂些的情况下,如果想把模拟开关打开的条件改成“模拟平仓三次之后再开仓”,实现的思路大概是什么样子的?
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-6-1 10:10 | 显示全部楼层
本帖最后由 技术009 于 2021-6-1 10:13 编辑

仅仅是平仓吗?
那么
[PEL] 复制代码
   

if 该笔盈亏>0 then 

BEGIN
        盈亏记录:=0;
        真实系统下单开关:=0;
        模拟开仓价:=0;
        模拟平仓价:=0;
end
    if  该笔盈亏<=0 then 

BEGIN
       IF 盈亏记录=3 then  真实系统下单开关:=1;
        IF 盈亏记录>=2 then 盈亏记录:=3;
        IF 盈亏记录=1 then 盈亏记录:=2;
        IF 盈亏记录=0 then 盈亏记录:=1;
        模拟开仓价:=0;
        模拟平仓价:=0;
    END


这里就不需要了

改成:
[PEL] 复制代码
   IF 平仓记录=3 then  真实系统下单开关:=1;
        IF 平仓记录>=2 then 平仓记录:=3;
        IF 平仓记录=1 then 平仓记录:=2;
        IF 平仓记录=0 then 平仓记录:=1; 


也就是现在我不在乎盈亏了,只记录平仓次数。这里是多头,空头那里也是这样修改。

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

6

主题

23

帖子

23

积分

Rank: 1

等级: 新手上路

注册:
2021-5-31
曾用名:
 楼主| 发表于 2021-6-1 10:19 | 显示全部楼层
原谅我没有把问题描述清楚,我就是不清楚在这里,“平仓记录”该如何用代码描述,因为该模型中平仓条件比较复杂,既有止损平仓,也有多个止盈平仓条件。
回复

使用道具 举报

20

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2021-6-1 10:28 | 显示全部楼层
1.就是你需要再定义一个平仓记录的变量。
VARIABLE:该笔盈亏:=0,模拟持仓:=0,模拟开仓价:=0,模拟平仓价:=0,真实系统下单开关:=0,盈亏记录:=0,MP:=0,多头止损:=0,空头止损:=0,平仓记录:=0;

2.后面赋值操作就是前面8楼代码里的处理方式。
原先是在平仓之后判断盈亏,然后记录连亏次数。现在这些都不需要了,直接给 ”平仓记录“这个全家变量进行赋值操作。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-12-23 01:18 , Processed in 0.170340 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表