欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件金字塔软件问题提交 → [求助]信号失效问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有3836人关注过本帖树形打印复制链接

主题:[求助]信号失效问题

帅哥哟,离线,有人找我吗?
misshuanghm1
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
[求助]信号失效问题  发帖心情 Post By:2016/8/11 15:37:50 [显示全部帖子]

IF HOLDING>0 AND ENTERBARS>0 AND KDYL>0 AND KDYL>ENTERPRICE*0.05 AND C<ENTERPRICE+KDZY THEN  //开多移动止损
   BEGIN
      //SELL(1,手数,LIMITR,KDZY+ENTERPRICE);
      平多1:SELL(1,手数,MARKET);
      FLAG:=1;
   END
   ELSE
   BEGIN
      平多0:SELL(平多条件 AND HOLDING>0,手数,MARKET);
      FLAG:=0;
   END
   信号已经出现平多1和平多0,但是flag的作用并没有体现:

IF CROSS(EXITPRICE,C) AND FLAG=1 THEN 开空1:BUYSHORT(1,手数,MARKET);
ELSE 开空0:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,MARKET);
IF CROSS(C,EXITPRICE) AND FLAG=1 THEN 开多1:BUY(1,手数,MARKET);
ELSE 开多0:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,MARKET);

开仓的条件是这样的,但是开仓的条件一直都没有开空1或者开空2


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20160811150333.png
图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/11 16:12:06 [显示全部帖子]

以下是引用wenarm在2016-8-11 16:00:48的发言:

a:CROSS(EXITPRICE,C) AND FLAG=1

通过这个方式输出你的条件,看是否成立,成立是1,不成立是0.

不成立的话,将条件拆分后输出,看具体是哪一项条件不成立

进一步去分析自己的代码

我就是因为输出了,看了全部都是0所以才奇怪


 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/11 16:23:41 [显示全部帖子]

以下是引用wenarm在2016-8-11 16:00:48的发言:

a:CROSS(EXITPRICE,C) AND FLAG=1

通过这个方式输出你的条件,看是否成立,成立是1,不成立是0.

不成立的话,将条件拆分后输出,看具体是哪一项条件不成立

进一步去分析自己的代码

查出来了,就是flag=1这个条件一直不成立


 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/11 16:39:41 [显示全部帖子]

以下是引用wenarm在2016-8-11 16:24:38的发言:

这个一个调试方法。不符合,你就接着找上面的条件。找的具体想进行分析判断。

或者你贴出完整的代码。

上面那段我也贴出来了,就是这样的:

IF HOLDING>0 AND ENTERBARS>0 AND KDYL>0 AND KDYL>ENTERPRICE*0.05 AND C<ENTERPRICE+KDZY THEN  //开多移动止损
   BEGIN
      //SELL(1,手数,LIMITR,KDZY+ENTERPRICE);
      平多1:SELL(1,手数,MARKET);
      FLAG:=1;
   END
   ELSE
   BEGIN
      平多0:SELL(平多条件 AND HOLDING>0,手数,MARKET);
      FLAG:=0;
   END

既然平多1都成立了,为什么flag:=1不成功呢


 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/11 20:44:28 [显示全部帖子]

以下是引用pyd在2016-8-11 16:56:18的发言:

HOLDING>0 AND ENTERBARS>0 AND KDYL>0 AND KDYL>ENTERPRICE*0.05 AND C<ENTERPRICE+KDZY

这些条件输出是1吗?



我找出来bug了,可能是因为金字塔的语言如果用在图表交易上的话每个变量的值的有效期只是这根K线,不像其他语言一样会储存应用的。因为我是想用flag标记这次的平仓的类型,然后开仓的信号会根据这些开仓的类型有不同的开仓条件,这样子能实现吗?


 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/11 22:09:43 [显示全部帖子]

以下是引用王锋在2016-8-11 21:11:06的发言:

你没贴出完整代码,我们无法评估FLAG这个变量到底什么性质的,如果你是想像其他语言那样,你要将变量声明为全局变量才可以。

参考 VARIABLE


好的。其实就是金肯特纳加上止盈止损,大概说一下就是多的一个就是在止盈之后如果价格突破这个止盈的点位,继续做同方向的操作。

/////Bug:

//1、平多开空可能在同一天

//2、flag只能用在一根K线上,值不能延续



//中间变量

INPUT:N(40,1,100,10),SS(1,1,10000,1);

CYC:=BARSLAST(DATE<>REF(DATE,1))+1;

手数:=SS;

FLAG:=2;

MA1:REF(MA(((H+L+C)/3,N)),1);//三价平均线

浮动区间:=REF(MA(TR,N),1);//真实振幅的移动平均线

上轨:MA1+浮动区间;

下轨:MA1-浮动区间;


//交易条件

开多条件:=MA1>REF(MA1,1) AND C>上轨;

开空条件:=MA1<REF(MA1,1) AND C<下轨;

平多条件:=C<MA1;

平空条件:=C>MA1;



//止损 

IF HOLDING<0 AND (H-ENTERPRICE>ENTERPRICE*0.05) THEN 

   BEGIN

   平空2:SELLSHORT(1,手数,LIMITR,ENTERPRICE*(1+0.05)); ///5%止损

   FLAG:=0;

   END

IF HOLDING>0 AND (L-ENTERPRICE<-ENTERPRICE*0.05) THEN 

   BEGIN

   平多2:SELL(1,手数,LIMITR,ENTERPRICE*(1-0.05)); 

   FLAG:=0;

   END


//止盈

//1、最大获利点数

KDYL:=HHV(H,ENTERBARS)-ENTERPRICE; 

KKYL:=ENTERPRICE-LLV(L,ENTERBARS); 

IF HOLDING<>0 AND ABS(C-ENTERPRICE)>=ENTERPRICE*0.3 THEN P:=20; //如果盈利20%以上回撤10%止盈 

IF HOLDING<>0 AND ABS(C-ENTERPRICE)<ENTERPRICE*0.3 AND  ABS(C-ENTERPRICE)>ENTERPRICE*0.05 THEN P:=20; //如果盈利小于20%,回撤5%止盈


//2、计算跟踪止盈价位,向价格不利方向取p%

KDZY:=FLOOR(KDYL*(1-P/100)); 

KKZY:=CEILING(KKYL*(1-P/100)); 

IF HOLDING<0 AND ENTERBARS>0 AND KKYL>0 AND KKYL>ENTERPRICE*0.05 AND C>ENTERPRICE-KKZY THEN //开空移动止损

   BEGIN

      //SELLSHORT(1,手数,LIMITR,ENTERPRICE-KKZY);

      平空1:SELLSHORT(1,手数,MARKET); 

      FLAG := 1;

   END 

   ELSE 

   BEGIN

      平空0:SELLSHORT(平空条件 AND HOLDING<0,手数,LIMITR,MA1);//SELLSHORT(平空条件 AND HOLDING<0,手数,MARKET);

      FLAG:=0;

   END

IF HOLDING>0 AND ENTERBARS>0 AND KDYL>0 AND KDYL>ENTERPRICE*0.05 AND C<ENTERPRICE+KDZY THEN  //开多移动止损

   BEGIN

      //SELL(1,手数,LIMITR,KDZY+ENTERPRICE);

      平多1:SELL(1,手数,MARKET); 

      FLAG:=1;

   END

   ELSE 

   BEGIN

      平多0:SELL(平多条件 AND HOLDING>0,手数,MARKET);

      FLAG:=0;

   END

   

IF CROSS(EXITPRICE,C) AND FLAG=1 THEN 开空1:BUYSHORT(1,手数,MARKET);

ELSE 开空0:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,MARKET);

IF CROSS(C,EXITPRICE) AND FLAG=1 THEN 开多1:BUY(1,手数,MARKET);

ELSE 开多0:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,MARKET);

{BUYSHORT(开空条件 AND HOLDING>=0,手数,MARKET);

BUY(开多条件 AND HOLDING<=0,手数,MARKET);}

tiajian :HOLDING>0 AND ENTERBARS>0 AND KDYL>0 AND KDYL>ENTERPRICE*0.05 AND C<ENTERPRICE+KDZY,COLORGRAY,LINETHICK0;

信号:FLAG,COLORGRAY,LINETHICK0;

当前持仓:HOLDING,COLORGRAY,LINETHICK0;

当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值


 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/12 11:11:18 [显示全部帖子]

以下是引用wenarm在2016-8-12 9:04:05的发言:

作为标志位的flag。一般都是全局变量,你在代码的开头将其声明为全局变量就可以了。

VARIABLE:flag=2;//由于你的源码中flag的状态是在一定条件下的。所以未将其初始化为0,防止对代码起到影响。给其一个其他值

可以看到,定义了varliable还是不行,上面的信号还是0,本来平多1之后我希望的是得到开多1信号,而不是开多2信号,正是因为flag一直是0,只有在平多1那根是1,所以才会导致一直没有开多1
图片点击可在新窗口打开查看此主题相关图片如下:qq截图20160812110845.png
图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/16 14:46:08 [显示全部帖子]

以下是引用wenarm在2016-8-12 12:27:12的发言:

你的条件恒不成立、

KDYL:HHV(H,ENTERBARS)-ENTERPRICE;
KKYL:ENTERPRICE-LLV(L,ENTERBARS);
KDZY:FLOOR(KDYL*(1-P/100));

KKZY:CEILING(KKYL*(1-P/100));

上面4个变量和cond:ENTERPRICE*0.05;比较。使用都是不成立,你自己输出你的变量,比较看下。

这个问题还是没有解决,请问能不能帮我照着这个止盈止损的思想稍微改一下,条件其实已经是触发了,也进行平仓了,就是flag的信号在处理完这个止盈之后没有延续。


 回到顶部
帅哥哟,离线,有人找我吗?
misshuanghm1
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:29 积分:0 威望:0 精华:0 注册:2016/8/11 14:37:06
  发帖心情 Post By:2016/8/16 16:26:24 [显示全部帖子]

以下是引用wenarm在2016-8-16 15:18:20的发言:

首先你要先理解你的代码逻辑。并且需要具备调试的方法。

你上面的问题中,如果你触发了条件,那么在后面的语句中,flag是会被修改的。

你自己尝试使用debugfile进行调试你的代码。

我觉得逻辑很简单,再三检查还是没有看出问题啊,刚使用金字塔还不熟练这种debug方式,着急

VARIABLE:FLAG=3;//

//中间变量
INPUT:N(40,1,100,10),SS(1,1,10000,1);
CYC:=BARSLAST(DATE<>REF(DATE,1))+1;
手数:=SS;

MA1:REF(MA(((H+L+C)/3,N)),1);//三价平均线
浮动区间:=REF(MA(TR,N),1);//真实振幅的移动平均线
上轨:MA1+浮动区间;
下轨:MA1-浮动区间;

//交易条件
开多条件:=MA1>REF(MA1,1) AND C>上轨;
开空条件:=MA1<REF(MA1,1) AND C<下轨;
平多条件:=C<MA1;
平空条件:=C>MA1;


//止盈
//1、最大获利点数
开多最大盈利:=HHV(H,ENTERBARS)-ENTERPRICE;
开空最大盈利:=ENTERPRICE-LLV(L,ENTERBARS);
IF HOLDING<0 AND ENTERPRICE-C>=ENTERPRICE*0.3 THEN P:=30; //如果盈利20%以上回撤10%止盈
IF HOLDING>0 AND C-ENTERPRICE>=ENTERPRICE*0.3 THEN P:=30; //如果盈利20%以上回撤10%止盈
IF HOLDING<0 AND ENTERPRICE-C<ENTERPRICE*0.3 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN P:=50; //如果盈利20%以上回撤10%止盈
IF HOLDING>0 AND C-ENTERPRICE<ENTERPRICE*0.3 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN P:=50; //如果盈利20%以上回撤10%止盈


//2、计算跟踪止盈价位,向价格不利方向取p%
开多止盈点位:=ENTERPRICE+FLOOR(开多最大盈利*(1-P/100));
开空止盈点位:=ENTERPRICE-CEILING(开空最大盈利*(1-P/100));

IF HOLDING<0 AND ENTERBARS>0 AND 开空最大盈利>0 AND C>开空止盈点位 THEN //开空移动止损
   BEGIN
      //SELLSHORT(1,手数,LIMITR,ENTERPRICE-KKZY);
      平空1:SELLSHORT(1,手数,MARKET);
      FLAG := 1;
   END
   ELSE
   BEGIN
      平空0:SELLSHORT(平空条件 AND HOLDING<0,手数,LIMITR,MA1);//SELLSHORT(平空条件 AND HOLDING<0,手数,MARKET);
      FLAG:=0;
   END
IF HOLDING>0 AND ENTERBARS>0 AND 开多最大盈利>0 AND C<开多止盈点位 THEN  //开多移动止损
   BEGIN
      //SELL(1,手数,LIMITR,KDZY+ENTERPRICE);
      平多1:SELL(1,手数,MARKET);
      FLAG:=1;
   END
   ELSE
   BEGIN
      平多0:SELL(平多条件 AND HOLDING>0,手数,MARKET);
      FLAG:=0;
   END

{//止损
IF HOLDING<0 AND (C-ENTERPRICE>ENTERPRICE*0.05) THEN
   BEGIN
   平空止损:SELLSHORT(1,手数,LIMITR,ENTERPRICE*(1+0.05)); ///5%止损
   FLAG:=0;
   END
IF HOLDING>0 AND (C-ENTERPRICE<-ENTERPRICE*0.05) THEN
   BEGIN
   平多止损:SELL(1,手数,LIMITR,ENTERPRICE*(1-0.05));
   FLAG:=0;
   END}
    
IF CROSS(EXITPRICE,C) AND FLAG=1 AND EXITBARS>0 THEN 开空1:BUYSHORT(1,手数,MARKET);
ELSE 开空0:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,MARKET);
IF CROSS(C,EXITPRICE) AND FLAG=1 AND EXITBARS>0 THEN 开多1:BUY(1,手数,MARKET);
ELSE 开多0:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,MARKET);
{BUYSHORT(开空条件 AND HOLDING>=0,手数,MARKET);
BUY(开多条件 AND HOLDING<=0,手数,MARKET);}

KDYL1:HHV(H,ENTERBARS)-ENTERPRICE,COLORBLUE,LINETHICK0;
cond:ENTERPRICE*0.05,COLORred,LINETHICK0;
信号:FLAG,COLORGRAY,LINETHICK0;
当前持仓:HOLDING,COLORGRAY,LINETHICK0;
当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值


 回到顶部