加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

分笔分段公式,部分dll源代码

(2009-05-16 07:24:37)
标签:

杂谈

分类: 公式代码
处理笔关系的源代码  作者:悟多
  1. function bi(pData:pTagCALCINFO):integer;stdcall;export;
  2. var
  3. i,j,k,l,m,n:integer;
  4. p1,p2,s:single;
  5. ctfg,bictfg:boolean;
  6. buf:array[0..9] of single;
  7. begin

  8. //adjustdd(1,prnum-2); //合并多顶连续
  9. //找和后面不构成一笔的情况
  10. //去掉后面一个,然后再同取高值或低值
  11. i:=1;
  12. while i<(prnum-1) do
  13. begin


  14.   k:=pr[i].flag;
  15.   if k<>0 then
  16.     begin
  17.       j:=i+1;
  18.       l:=pr[j].flag;
  19.       while (l=0) and (j<prnum-1) do //找到下一个不为0的
  20.         begin
  21.           j:=j+1;
  22.           l:=pr[j].flag;
  23.         end;//找到两个值;
  24.       if l=0 then
  25.         break;  
  26.      //判断包含后的距离
  27.      fillchar(buf,36,0);
  28.      m:=0;
  29.      for k:=i to j do
  30.       begin
  31.         s:=pr[k].hprice;
  32.         ctfg:=false;
  33.         for l:=0 to 5 do //查找是否在队列中
  34.           begin
  35.             if s=buf[l] then
  36.               begin
  37.                 ctfg:=true;
  38.                 break;
  39.               end;
  40.           end;
  41.         if not ctfg then //如果不在队列中
  42.           begin
  43.             for l:=0 to 5 do
  44.               if buf[l]=0 then
  45.               begin
  46.                 buf[l]:=s;
  47.                 m:=m+1;
  48.                 break;
  49.               end;
  50.           end;
  51.         if m >= 4 then
  52.           break;
  53.       end;//end for


  54.       bictfg:=false;
  55.       //缺口处理过程

  56.         begin

  57.           s:=0;
  58.           if pr[i].flag=-1 then//向上
  59.                 begin
  60.                 for k:=i to j-1 do
  61.                 begin
  62.                   p1:=pdata^.m_pdata[k].m_fHigh;
  63.                   p2:=pdata^.m_pdata[k+1].m_fLow;
  64. //                  p1:=pr[k].hprice;
  65.   //                p2:=pr[k+1].lprice;
  66.                   if p2>p1 then
  67.                     s:=(p2/p1 -1)+s;
  68.                 end;
  69.                 end
  70.               else//向下
  71.                 begin
  72.                 for k:=i to j-1 do
  73.                   begin
  74.        //           p1:=pr[k].lprice;
  75.        //           p2:=pr[k+1].hprice;

  76.                   p1:=pdata^.m_pdata[k].m_flow;
  77.                   p2:=pdata^.m_pdata[k+1].m_fhigh;
  78.                     if p1>p2 then
  79.                        s:=abs(p2/p1 -1)+s;
  80.                   end;
  81.                 end;

  82.           if s>=biQUEKOU then
  83.             bictfg:=true;

  84.         end;


  85.       if m>=4 then//包含后大于4根,再次判断
  86.         begin
  87.            if j-i >=4  then //不包含,至少5根
  88.               begin
  89.                 if prtype<>MIN5_DATA then  //5分钟分笔幅度太小的,舍掉
  90.                   bictfg:=True
  91.                 else
  92.                 begin
  93.                 if pr[j].flag=1  then
  94.                 begin
  95.                    s:=(pr[j].hprice-pr[i].lprice)/pr[i].lprice;
  96.                    if (j-i>=6) or (s>=0.008) then
  97.                     bictfg:=true;
  98.                   end;
  99.                   
  100.                 if pr[j].flag=-1  then
  101.                   begin
  102.                     s:=(pr[i].hprice-pr[j].lprice)/pr[i].hprice;
  103.                     if (j-i>=6) or (s>=0.008) then
  104.                       bictfg:=true;
  105.                     end;
  106.                 end;
  107.               end;
  108.         end;// end m>=4
  109.       if not bictfg then //如果不是一笔,进行下面的处理
  110.         begin
  111.           k:=i;
  112.           l:=pr[k].flag;
  113.           k:=k+1;
  114.           while (l<>pr[k].flag) and (k<prnum-1) do //取下相同的顶或底
  115.             k:=k+1;
  116.           if l=1 then//如果是顶
  117.             begin
  118.               p1:=pr[i].hprice;
  119.               p2:=pr[k].hprice;
  120.               if p1>=p2 then //前顶比后顶高;
  121.                 begin
  122.                   pr[j].flag:=0;
  123.                   pr[k].flag:=0;
  124.                 end
  125.                 else//前顶比后顶矮
  126.                 begin
  127.                   pr[i].flag:=0; //先把自己去掉
  128.                   n:=j;
  129.                   m:=pr[n].flag;
  130.                   n:=n-1;
  131.                   while (m<>pr[n].flag) and (n>0) do
  132.                     n:=n-1;
  133.                   p1:=pr[n].lprice;
  134.                   p2:=pr[j].lprice;
  135.                   if p1<p2 then
  136.                     begin
  137.                       pr[j].flag:=0;
  138.                     end
  139.                     else
  140.                       pr[n].flag:=0;
  141.                 end;//end else
  142.             i:=i-1;
  143.             end;
  144.           if l=-1 then
  145.             begin
  146.               p1:=pr[i].lprice;
  147.               p2:=pr[k].lprice;
  148.               if p1<=p2 then  //前底比后底矮
  149.                 begin
  150.                   pr[j].flag:=0;
  151.                   pr[k].flag:=0;

  152.                 end
  153.                 else//前底比后底高
  154.                 begin
  155.                   pr[i].flag:=0;
  156.                   n:=j;
  157.                   m:=pr[n].flag;
  158.                   n:=n-1;
  159.                   while (m<>pr[n].flag) and (n>0) do
  160.                     n:=n-1;
  161.                   p1:=pr[n].hprice;
  162.                   p2:=pr[j].hprice;
  163.                   if p1>p2 then
  164.                       pr[j].flag:=0
  165.                     else
  166.                       pr[n].flag:=0;
  167.                 end;
  168.             i:=i-1;
  169.             end;

  170.         end;
  171.     end;// end if k<>0;

  172.   i:=i+1;
  173. end; // end while;

  174. {
  175. //检查第一笔
  176. i:=0;
  177. while (i<prnum-1) and (pr[i].flag=0) do
  178.   i:=i+1;
  179. if pr[i].flag=-1 then
  180.   begin
  181.     k:=0;
  182.     s:=pr[0].lprice;
  183.     for j:=0 to i do
  184.       if pr[j].lprice<s then
  185.         begin
  186.           k:=j;
  187.           s:=pr[j].lprice;
  188.         end;
  189.     pr[i].flag:=0;
  190.     pr[k].flag:=-1;
  191.   end;
  192. if pr[i].flag=1 then
  193.   begin
  194.     k:=0;
  195.     s:=pr[0].hprice;
  196.     for j:=0 to i do
  197.       if pr[j].hprice>s then
  198.         begin
  199.           k:=j;
  200.           s:=pr[j].hprice;
  201.         end;
  202.     pr[i].flag:=0;
  203.     pr[k].flag:=1;
  204.   end;
  205.          }
  206. checkhl();  
  207. //检查最后一笔的高低点

  208. i:=prnum-1;
  209. while (pr[i].flag=0) and (i>0) do
  210.   i:=i-1;
  211. if pr[i].flag=1 then
  212.   begin
  213.     for j:=i+1 to prnum-1 do
  214.     begin
  215.     if pr[j].hprice>pr[i].hprice then
  216.       begin
  217.         pr[i].flag:=0;
  218.         Break;
  219.       end;
  220.     end;
  221.   end;
  222. if pr[i].flag=-1 then
  223.   begin
  224.     for j:=i+1 to prnum-1 do
  225.     if pr[j].lprice<pr[i].lprice then
  226.       begin
  227.         pr[i].flag:=0;
  228.         break;
  229.       end;
  230.   end;
  231.          

  232. for i:=0 to prnum-1 do
  233. begin
  234.   pdata^.m_pResultBuf[i]:=pr[i].flag;
  235. end;
  236. result:=1;

  237. end;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有