以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  请各位版主看下这个代码  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=49782)

--  作者:seemsgood
--  发布时间:2013/3/15 17:48:13
--  请各位版主看下这个代码


DATAPERIODNUMBER:=DATATYPE;
vn:=DATACOUNT;
vh:=HIGH;
vl:=LOW;
variable: vallding[]=0,valldi[]=0;
   
//找出所有顶分型和底分型 
dingcount:=0;
dicount:=0;
for i=3 to vn do
begin
 ktype:=0; //判断是独立K还是分型 初始0
 
 if vh[i-1]>vh[i-2] && vh[i-1]>vh[i] && (vl[i-1]>=vl[i-2] || vl[i-1]>=vl[i]) then
  ktype:=1; 
 if vl[i-1]<vl[i-2] && vl[i-1]<vl[i] && (vh[i-1]<=vh[i-2] || vh[i-1]<=vh[i]) then
  ktype:=2;
 if vh[i-1]>vh[i-2] && vh[i-1]>vl[i] && vl[i-1]<vh[i-2] && vh[i-1]<vh[i] then
  ktype:=3;
 else
  ktype:=4;
 
 
 if ktype=1 then                           //标准顶和含有包含关系的顶
  begin
   
   if vl[i-1]>vl[i-2] && vl[i-1]>vl[i] then  //标准顶
    begin
     vallding[dingcount]:=i-1;
     dingcount:=dingcount+1;
    end;
   else
    begin
     temp_bh:=i-1;
     new_kh:=vh[temp_bh];
     new_kl:=vl[temp_bh];
     
     while (vh[temp_bh-1]<=new_kh) && (vl[temp_bh-1]>=new_kl) || (vh[temp_bh-1]>=new_kh) && (vl[temp_bh-1]<=new_kl) do
      begin
       new_kh:=max(vh[temp_bh-1],vh[temp_bh]);
       new_kl:=max(vl[temp_bh-1],vl[temp_bh]);
       temp_bh:=temp_bh-1;
      end;
     
     temp_bh:=i-1;
     while (vh[temp_bh+1]<=new_kh) && (vl[temp_bh+1]>=new_kl) || (vh[temp_bh+1]>=new_kh) && (vl[temp_bh+1]<=new_kl) do
      begin
       new_kh:=max(vh[temp_bh+1],vh[temp_bh]);
       new_kl:=max(vl[temp_bh+1],vl[temp_bh]);
       temp_bh=temp_bh+1;
      end;
     vallding[dingcount]:=temp_bh;
     dingcount:=dingcount+1;
    end;
  end;
   
 else if ktype=2 then
  
   begin
  
    if vh[i-1]<vh[i-2] and vh[i-1]<vh[i] then //标准底
     begin
      valldi[dicount]:=i-1;
      dicount:=dicount+1;
     end;
    else
     begin
      temp_bh:=i-1;
      new_kh:=vh[temp_bh];
      new_kl:=vl[temp_bh];
      
      while (vh[temp_bh-1]<=new_kh) && (vl[temp_bh-1]>=new_kl) || (vh[temp_bh-1]>=new_kh) && (vl[temp_bh-1]<=new_kl) do
       begin
        new_kh:=min(vh[temp_bh-1],vh[temp_bh]);
        new_kl:=min(vl[temp_bh-1],vl[temp_bh]);
        temp_bh:=temp_bh-1;
       end;
       
      temp_bh=i-1;
      while (vh[temp_bh+1]<=new_kh) && (vl[temp_bh+1]>=new_kl) || (vh[temp_bh+1]>=new_kh) && (vl[temp_bh+1]<=new_kl) do
       begin
        new_kh:=min(vh[temp_bh+1],vh[temp_bh]);
        new_kl:=min(vl[temp_bh+1],vl[temp_bh]);
        temp_bh:=temp_bh+1;
       end;
      valldi[dicount]:=temp_bh;
      dicount:=dicount+1;
     end;
   end;
  
   else if ktype=3 THEN
    begin
     dingordi:=0; //初始0 顶1 底2
     temp_bh:=i-1;
     new_kh:=vh[temp_bh];
     new_kl:=vl[temp_bh];
     
     while (vh[temp_bh-1]<=new_kh) && (vl[temp_bh-1]>=new_kl) || (vh[temp_bh-1]>=new_kh) && (vl[temp_bh-1]<=new_kl) do
      temp_bh:=temp_bh-1;
     
     if vh[temp_bh-1]<vh[temp_bh] && vl[temp_bh-1]<vl[temp_bh-1] then
      dingordi:=1;
     else
      dingordi:=2;
      
     if dingordi=1 then  //判断是顶还是底
      begin
       temp_bh:=i-1;
       new_kh:=vh[temp_bh];
       new_kl:=vl[temp_bh];
      
       while (vh[temp_bh-1]<=new_kh) && (vl[temp_bh-1]>=new_kl) || (vh[temp_bh-1]>=new_kh) && (vl[temp_bh-1]<=new_kl) do
        begin
         new_kh:=max(vh[temp_bh-1],vh[temp_bh]);
         new_kl:=max(vl[temp_bh-1],vl[temp_bh]);
         temp_bh:=temp_bh-1;
        end;
      
       temp_bh:=i-1;
       while (vh[temp_bh+1]<=new_kh) && (vl[temp_bh+1]>=new_kl) || (vh[temp_bh+1]>=new_kh) && (vl[temp_bh+1]<=new_kl) do
        begin
         new_kh:=min(vh[temp_bh-1],vh[temp_bh]);
         new_kl:=min(vl[temp_bh-1],vl[temp_bh]);
         temp_bh:=temp_bh+1;
        end ;
      
       vallding[dingcount]:=temp_bh;
       dingcount:=dingcount+1;
      
      end ;
     else
      begin
       temp_bh:=i-1;
       new_kh:=vh[temp_bh];
       new_kl:=vl[temp_bh];
      
       while (vh[temp_bh-1]<=new_kh) && (vl[temp_bh-1]>=new_kl) || (vh[temp_bh-1]>=new_kh) && (vl[temp_bh-1]<=new_kl) do
        begin
         new_kh:=min(vh[temp_bh-1],vh[temp_bh]);
         new_kl:=min(vl[temp_bh-1],vl[temp_bh]);
         temp_bh:=temp_bh-1;
        end;
      
       temp_bh=i-1;
       while (vh[temp_bh+1]<=new_kh) && (vl[temp_bh+1]>=new_kl) || (vh[temp_bh+1]>=new_kh) && (vl[temp_bh+1]<=new_kl) do
        begin
         new_kh:=min(vh[temp_bh-1],vh[temp_bh]);
         new_kl:=min(vl[temp_bh-1],vl[temp_bh]);
         temp_bh:=temp_bh+1;
        end; 
      
       valldi[dicount]:=temp_bh;
       dicount:=dicount+1;
      end ;
   
    end;
end;   

 

 

for i=1 to ubound(vallding) do
 drawicon(barpos=vallding[i],high,1);
 
 

 这只做了第一步 想DATACOUNT求得加载K线数后 循环一遍 找出我想要的分型来

 

整个实际是个大循环  里面又写了一些代码

 

运行在序列模式下    一运行 金字塔就崩溃退出


--  作者:admin
--  发布时间:2013/3/15 19:01:52
--  
测试中,请耐心等待结果
--  作者:seemsgood
--  发布时间:2013/3/15 19:14:40
--  
恩,谢谢
--  作者:admin
--  发布时间:2013/3/15 22:00:01
--  

循环程序进入死循环了。

 

建议你按照下列步骤进行:

1、不开打开含有该公式的图表,防止再次进入死循环。如果已经进入死循环,按 Ctrl+Alt+Ins键退出死循环关掉图表。

2、打开该公式编辑器,点“调试菜单”-》开始调试。 建议你使用单步跟踪,然后代码中设置断点的方式进行调试,可以逐步的找到死循环的原因。


--  作者:admin
--  发布时间:2013/3/15 22:07:15
--  
如果你还不会使用断点及单步跟踪调试,请参考 http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=332 问题4