金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2770|回复: 11

标题:急,请教:开平仓条件的值为什么是混乱的?

[复制链接]

5

主题

20

帖子

20

积分

Rank: 1

等级: 新手上路

注册:
2022-11-12
曾用名:
发表于 2024-4-3 07:44 | 显示全部楼层 |阅读模式
标题:急,


图表程序化交易,策略代码如下:
*******************************BEGIN*********************************
INPUT:N1(5,5,20,1),N2(10,10,50,5),N3(20,20,100,10);

N4:=30;
N:=10;
M:=2;
/////////////////////////////////////////////////////////////////////////////////////
//P2:公共逻辑
TP:=(OPEN+HIGH+LOW+CLOSE)/4;
YTP:=REF(TP,1);
VARIABLE:可用资金余额=TCASH();
VARIABLE:可用资金余额2=TACCOUNT(49);
VARIABLE:占资=TACCOUNT(28);

/////////////////////////////////////////////////////////////////////////////////////
//P3:均线逻辑
MA1:=MA(TP,N1);
MA2:MA(TP,N2),COLORGREEN;
MA3:MA(TP,N3),LINETHICK2;
MA4:=MA(TP,N4);//【**】

/////////////////////////////////////////////////////////////////////////////////////
//P4:箱形线逻辑
VARIABLE:通道顶=0;
VARIABLE:通道底=0;
//VARIABLE:Y通道顶=0;
//VARIABLE:Y通道底=0;
VARIABLE:udBOX=0;//箱形线涨跌标志
VARIABLE:nBOX=1;//
VARIABLE:XX=0;

//STEP1:确定基准与波幅。
BOXWAVE:=MA(TR,N)*M;
//STEP2:确定每K线的理论上下线。
BOXTOP:=TP+BOXWAVE;
BOXBTM:=TP-BOXWAVE;
//【**】STEP3:计算前一根K线的理论上下线。
YBOXTOP:=REF(BOXTOP,1);
YBOXBTM:=REF(BOXBTM,1);
//STEP4:计算通道上下线。
IF BARPOS<=N+1{这里如果是<=N,结果永远是错的} THEN BEGIN
        通道顶:=BOXTOP;
        通道底:=BOXBTM;
        udBOX:=0;
        nBOX:=1;//统计箱形线的序数。
END
ELSE BEGIN
        IF (HIGH>通道顶 && LOW<通道底) THEN BEGIN       
                通道顶:=通道顶;//YBOXTOP;
                通道底:=通道底;//YBOXBTM;
                IF (TP>YTP) THEN BEGIN
                        udBOX:=11;
                END
                ELSE BEGIN
                        udBOX:=-12;
                END
        END
        IF (HIGH>通道顶 && LOW>通道底) THEN BEGIN       
                nBOX:=nBOX+1;
                通道顶:=BOXTOP;
                通道底:=BOXBTM;
                udBOX:=13;
        END
        IF (HIGH<通道顶 && LOW<通道底) THEN BEGIN       
                nBOX:=nBOX+1;
                通道底:=BOXBTM;
                通道顶:=BOXTOP;
                udBOX:=-14;
        END
END
TOP:REF(通道顶,1);
BTM:REF(通道底,1);

/////////////////////////////////////////////////////////////////////////////////////
//P5:交易控制
VARIABLE:ORDERTIME=0;//TODO:未完成。下单次数控制,防止出现下单不成功后,反复下单造成高额费用的事。

udSTK:=GETINIFILE('D:\BAIDUSYNCDISK\A_TRADE\STK_TREND.INI',STKLABEL(),'STK_TREND');//合约涨跌标志:1表示上涨趋势,-1表示下跌趋势,0表示盘整趋势;

手数:=GETINIFILE('D:\BAIDUSYNCDISK\A_TRADE\STK_TREND.INI',STKLABEL(),'OPEN_NUMBER');//交易手数;

信号开始时间:=GETINIFILE('D:\BAIDUSYNCDISK\A_TRADE\STK_TREND.INI',STKLABEL(),'STARTDATE');

/////////////////////////////////////////////////////////////////////////////////////
//P6:交易条件
开多条件:=MA2>=MA3 AND (CLOSE-MA3)>REF(CLOSE,1)-REF(MA3,1) AND UDBOX>0 AND TBUYHOLDINGEX('','',2)=0;
开空条件:=MA2<=MA3 AND (CLOSE-MA3)<REF(CLOSE,1)-REF(MA3,1) AND UDBOX<0 AND TSELLHOLDINGEX('','',2)=0;
平多条件:=MA2<=MA3 OR CLOSE<HHV(HIGH,OPENBAR())*0.985;
平空条件:=MA2>=MA3 OR CLOSE>LLV(LOW,OPENBAR())*1.015;
//Flag:'TF:'&NUMTOSTR(开多条件,0)&NUMTOSTR(平多条件,0)&"||"&NUMTOSTR(开空条件,0)&NUMTOSTR(平空条件,0);

/////////////////////////////////////////////////////////////////////////////////////
//P7:交易系统
回报信息1:='';
回报信息2:='';

IF DATE>信号开始时间 THEN BEGIN
        SENDPHONEMSG(STRCAT(numtostr(barpos(),0),NUMTOSTR(TCASH(),0)),1),ALLOWREPEAT;
        IF udSTK=1 THEN BEGIN
                IF 开多条件 THEN BEGIN
                        回报信息1:=NUMTOSTR(DATE(),0)&' '&NUMTOSTR(TIME(),0);
                        IF TCASH()>=20000 THEN BEGIN
                                BUY(1,手数,MARKET);
                                回报信息2:=': '&STKLABEL()&';价'&NUMTOSTR(ENTERPRICE(),0)&';BUY;量'&NUMTOSTR(手数,0)&';占'& NUMTOSTR(TACCOUNT(28),0) {TMARGINEX('','',0,0)}&';余'&NUMTOSTR(TACCOUNT( 19),0);
                        END
                        ELSE BEGIN
                                回报信息2:=': '&'账户资金不足,无法下单!';       
                        END

                END       
                IF 平多条件 THEN BEGIN
                        SELL(1,手数,MARKET);
                        回报信息1:=NUMTOSTR(DATE(),0)&' '&NUMTOSTR(TIME(),0);
                        回报信息2:=': '&STKLABEL()&';价'&NUMTOSTR(ENTERPRICE(),0)&';SELL;量'&NUMTOSTR(手数,0)&';余'&NUMTOSTR(TACCOUNT( 49),0);
                END
        END
        IF udSTK=-1 THEN BEGIN
                IF 开空条件 THEN BEGIN
                        回报信息1:=NUMTOSTR(DATE(),0)&' '&NUMTOSTR(TIME(),0);
                        IF TCASH()>=20000 THEN BEGIN
                                BUYSHORT(1,手数,MARKET);
                                回报信息2:=': '&STKLABEL()&';价'&NUMTOSTR(ENTERPRICE(),0)&';BUYs;量'&NUMTOSTR(手数,0)&';占'& NUMTOSTR(TACCOUNT(28),0) {TMARGINEX('','',0,0)}&';余'&NUMTOSTR(TACCOUNT( 19),0);
                        END
                        ELSE BEGIN
                                回报信息2:=': '&'账户资金不足,无法下单!';       
                        END
                END
                IF 平空条件 THEN BEGIN
                        SELLSHORT(1,手数,MARKET);
                        回报信息1:=NUMTOSTR(DATE(),0)&' '&NUMTOSTR(TIME(),0);
                        回报信息2:=': '&STKLABEL()&';价'&NUMTOSTR(ENTERPRICE(),0)&';SELLs;量'&NUMTOSTR(手数,0)&';占'&NUMTOSTR(TACCOUNT( 49),0);

                END
        END

END

DEBUGFILE2('D:\BAIDUSYNCDISK\A_TRADE\LOG.TXT',开多条件,1111,0);
DEBUGFILE2('D:\BAIDUSYNCDISK\A_TRADE\LOG.TXT',开空条件,1111,0);
DEBUGFILE2('D:\BAIDUSYNCDISK\A_TRADE\LOG.TXT',平多条件,1111,0);
DEBUGFILE2('D:\BAIDUSYNCDISK\A_TRADE\LOG.TXT',平空条件,1111,0);
****************************END***********************************

请问,为什么LOG.TXT文件的内容是:

D:\BAIDUSYNCDISK\A_TRADE\STK_T
STK_TREND
STK_TREND
D:\BAIDUSYNCDISK\A_TRADE\STK_T
D:\BAIDUSYNCDISK\A_TRADE\STK_T
STK_TREND
STK_TREND
D:\BAIDUSYNCDISK\A_TRADE\STK_T
D:\BAIDUSYNCDISK\A_TRADE\STK_T
STK_TREND
STK_TREND
D:\BAIDUSYNCDISK\A_TRADE\STK_T
D:\BAIDUSYNCDISK\A_TRADE\STK_T
STK_TREND
STK_TREND
D:\BAIDUSYNCDISK\A_TRADE\STK_T
D:\BAIDUSYNCDISK\A_TRADE\STK_T
STK_TREND
STK_TREND
D:\BAIDUSYNCDISK\A_TRADE\STK_T
D:\BAIDUSYNCDISK\A_TRADE\STK_T
STK_TREND
STK_TREND
...........

上面的内容中,D:\BAIDUSYNCDISK\A_TRADE\STK_T 应该是被截断了,完整的应该是:D:\BAIDUSYNCDISK\A_TRADE\STK_TREND.INI。
通过其它方式调试,比如在主图上显示,开多条件,开空条件,平多条件,平空条件 这4个变量的值也是这样,始终显示:D:\BAIDUSYNCDISK\A_TRADE\STK_TREND.INI 和 STK_TREND 中的一个。

请问:
(1)按正常逻辑,这4个变量的值应该是1(成立)或0(不成立)吧?
(2)为什么会是这样的结果?
(3)如何解决?

回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2024-4-3 08:58 | 显示全部楼层
本帖最后由 技术009 于 2024-4-3 09:00 编辑



代码没动,只是让这几个变量输出指标值出来了,都有数值。
调试输出语句你写的时候,建议参考下函数说明。第二个参数需要是字符串,第三个参数是需要输出的值。

DEBUGFILE2('D:\BAIDUSYNCDISK\A_TRADE\LOG.TXT',‘开多条件:%.2f’,开多条件,0);

另外你这个是图表模型里面用了很多后台函数,这个模型实际运行时候 信号是必然会混乱的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

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

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2024-4-3 09:04 | 显示全部楼层
用法:
DEBUGFILE2(PATH,STR,NUM,N)
  PATH为用户的本地计算机路径
  STR为用户指定输出的一个行文字
  NUM为用户指定的一个监控数字,
  N为1表示自动输出当前时间,为0表示不自动输出时间.

例如:
DEBUGFILE2('D:\TEST.TXT','当前资产为%.2f',1234,1),将在公式的监控部分输出到D:\TEST.TXT文件, "当前资产为1234.00"

看下函数说明,第二个位置是要用字符串加%2f的,你写开多条件这种事数字1或者0不行的

如下写法
DEBUGFILE2('D:\TEST.TXT','当前开多条件为%.2f',开多条件,1)
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

5

主题

20

帖子

20

积分

Rank: 1

等级: 新手上路

注册:
2022-11-12
曾用名:
 楼主| 发表于 2024-4-3 09:11 | 显示全部楼层
请问:
1、怎样如图中那样,显示4个条件变量
2、您在测试时,LOG.TXT文件中也是这样的结果吗?我测试时,用:
DRAWTEXTEX(1,0,400,30,开多条件);

EXPLAIN(1,开多条件);
都是之前的结果。
3、原因可能是什么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 微信登录

x
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2024-4-3 09:17 | 显示全部楼层
开多条件:=MA2>=MA3 AND (CLOSE-MA3)>REF(CLOSE,1)-REF(MA3,1) AND UDBOX>0 AND TBUYHOLDINGEX('','',2)=0;
开空条件:=MA2<=MA3 AND (CLOSE-MA3)<REF(CLOSE,1)-REF(MA3,1) AND UDBOX<0 AND TSELLHOLDINGEX('','',2)=0;
平多条件:=MA2<=MA3 OR CLOSE<HHV(HIGH,OPENBAR())*0.985;
平空条件:=MA2>=MA3 OR CLOSE>LLV(LOW,OPENBAR())*1.015;


把等号去掉就能在图上看到效果了


强烈不建议用户在图表策略中使用账户持仓,撤单等等后台程序化函数
各种未知问题容易出现
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

5

主题

20

帖子

20

积分

Rank: 1

等级: 新手上路

注册:
2022-11-12
曾用名:
 楼主| 发表于 2024-4-3 09:26 | 显示全部楼层
好的,非常感谢!
还要麻烦您,请教一点:
如果是语句:
ma1:ma(close,10);
运行时会在主图上显示ma1的连线,
而语句:
开多条件:=MA2>=MA3 AND (CLOSE-MA3)>REF(CLOSE,1)-REF(MA3,1) AND UDBOX>0 AND TBUYHOLDINGEX('','',2)=0;
为什么不会有1,0的连线?
当初就是因为担心这个连线会扰乱显示,所以没有想到用。
请赐教!

补充内容 (2024-4-3 09:27):
应该去掉=号,是语句:
开多条件:MA2>=MA3 AND (CLOSE-MA3)>REF(CLOSE,1)-REF(MA3,1) AND UDBOX>0 AND TBUYHOLDINGEX('','',2)=0;
回复

使用道具 举报

5

主题

20

帖子

20

积分

Rank: 1

等级: 新手上路

注册:
2022-11-12
曾用名:
 楼主| 发表于 2024-4-3 09:27 | 显示全部楼层
修改,应该去年=号,是语句:
开多条件:MA2>=MA3 AND (CLOSE-MA3)>REF(CLOSE,1)-REF(MA3,1) AND UDBOX>0 AND TBUYHOLDINGEX('','',2)=0;
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2024-4-3 09:33 | 显示全部楼层
:可以在图上输出值和线
:=不进行输出
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

5

主题

20

帖子

20

积分

Rank: 1

等级: 新手上路

注册:
2022-11-12
曾用名:
 楼主| 发表于 2024-4-3 09:38 | 显示全部楼层
问题就是,上面显示“开多条件”变量的语句:
开多条件:MA2>=MA3 AND (CLOSE-MA3)>REF(CLOSE,1)-REF(MA3,1) AND UDBOX>0 AND TBUYHOLDINGEX('','',2)=0;
这一句,只输出了值,而没有输出线。为什么?
回复

使用道具 举报

44

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2024-4-3 09:50 | 显示全部楼层
因为他的数值是1或者0,在图上看不到而已

就像坐标轴整体都是1000的图像,你要在里面插上一个1的线,你可以想想要在怎么输出
没法压缩的会

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-30 00:50 , Processed in 0.157507 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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