交易危机

 找回密码
 快捷注册(禁q号)

QQ登录

只需一步,快速开始

搜索
广告位
查看: 2386|回复: 6
打印 上一主题 下一主题

[代码] 60日均线通道指标半成品(frlin2003)

  [复制链接]

2128

主题

6万

积分

157

精华

大型投行

金钱
61435 美元
权重
640
跳转到指定楼层
楼主
发表于 2018-8-1 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
欢迎优化!
文件存放位置不解释。关于程序问题不解释。

  1. //根据某种条件,将 上行/震荡/下行 用不同的颜色分割开
  2. //编译者:平衡;[url=www.fx3Q.com]www.fx3Q.com[/url] 众汇论坛
  3. #property indicator_buffers 7
  4. #property indicator_color1 Red
  5. #property indicator_color2 Blue
  6. #property indicator_color3 Green
  7. #property indicator_color4 Blue
  8. #property indicator_color5 Red
  9. #property indicator_color6 Blue
  10. #property indicator_color7 Green

  11. #property indicator_chart_window

  12. extern int 平均振幅周期=60;
  13. int 均线周期=60;

  14. double 上行标示缓冲区[];
  15. double 震荡标示缓冲区[];
  16. double 下行标示缓冲区[];

  17. /*
  18. int 符号代码_上行=225;
  19. int 符号代码_震荡=224;
  20. int 符号代码_下行=226;
  21. */

  22. int 符号代码_上行=159;
  23. int 符号代码_震荡=159;
  24. int 符号代码_下行=159;

  25. double 上轨缓冲区[];
  26. double 上中缓冲区[];
  27. double 下轨缓冲区[];
  28. double 下中缓冲区[];

  29. int init()
  30. {
  31. //---- indicators
  32.    IndicatorBuffers(7);
  33. //----
  34.   
  35.    SetIndexStyle(0,DRAW_LINE,EMPTY,2);
  36.    SetIndexBuffer(0,上轨缓冲区);
  37.    SetIndexDrawBegin(0,均线周期);

  38.    SetIndexStyle(1,DRAW_LINE,EMPTY,2);
  39.    SetIndexBuffer(1,上中缓冲区);
  40.    SetIndexDrawBegin(1,均线周期);
  41.    
  42.    SetIndexStyle(2,DRAW_LINE,EMPTY,2);
  43.    SetIndexBuffer(2,下轨缓冲区);
  44.    SetIndexDrawBegin(2,均线周期);
  45.    
  46.    SetIndexStyle(3,DRAW_LINE,EMPTY,2);
  47.    SetIndexBuffer(3,下中缓冲区);
  48.    SetIndexDrawBegin(3,均线周期);

  49.    SetIndexStyle(4,DRAW_ARROW,0,0);
  50.    SetIndexArrow(4,符号代码_上行);
  51.    SetIndexBuffer(4,上行标示缓冲区);
  52.    SetIndexEmptyValue(4,0.0);

  53.    SetIndexStyle(5,DRAW_ARROW,0,0);
  54.    SetIndexArrow(5,符号代码_震荡);
  55.    SetIndexBuffer(5,震荡标示缓冲区);
  56.    SetIndexEmptyValue(5,0.0);
  57.    
  58.    SetIndexStyle(6,DRAW_ARROW,0,0);
  59.    SetIndexArrow(6,符号代码_下行);
  60.    SetIndexBuffer(6,下行标示缓冲区);
  61.    SetIndexEmptyValue(6,0.0);

  62.    return(0);
  63. }

  64. int deinit()
  65. {
  66. //----
  67.    
  68. //----
  69.    return(0);
  70. }

  71. int start()
  72. {
  73.    double 振幅之和;
  74.    double 平均振幅[];
  75.    double 旧Slope[];
  76.    double 新Slope[];
  77.    double 轨道宽度;
  78.    double 均线值[];。

  79.    
  80.    ArrayResize(平均振幅,Bars);   //无法使用如下语句:平均振幅[Bars],中括号内不可以放入变量,只能使用函数在声明后重新设定数组大小
  81.    ArrayResize(旧Slope,Bars);    //会导致程序运行较慢?
  82.    ArrayResize(新Slope,Bars);
  83.    ArrayResize(均线值,Bars);
  84.    
  85.    int i,j,limit,counted_bars=IndicatorCounted();
  86.    if(counted_bars>0)
  87.       counted_bars--;
  88.    limit=Bars;//-counted_bars;
  89.    
  90. //----
  91.    if(Bars<=均线周期) return(0);    //一般碰不到这情况,可删除

  92. //首次加载指标时,将最久远的60个无法得出数据的柱值清零,有必要加这行吗?也许可以忽略删除
  93.    if(counted_bars<1){
  94.       for(i=1;i<=均线周期;i++)
  95.       {
  96.          新Slope[Bars-i]=EMPTY_VALUE;
  97.       }
  98.    }

  99. //计算平均振幅
  100.    for(i=0; i<limit; i++){
  101.       振幅之和=0.0;
  102.       for(j=i;j<i+平均振幅周期;j++){
  103.          振幅之和+=High[j]-Low[j];
  104.       }
  105.       平均振幅[i]=振幅之和/平均振幅周期;  //计算10个k的平均高低价差
  106.       //平均振幅[i]=平均振幅[i]/0.0001;     //换算成"点"
  107.    }

  108. //计算旧Slope 和 新Slope
  109.    for(i=0; i<limit; i++)
  110.    {
  111.       均线值[i]=iMA(NULL,0,均线周期,0,0,0,i);
  112.       旧Slope[i]=(iMA(NULL,0,均线周期,0,0,0,i)-iMA(NULL,0,均线周期,0,0,0,i+1))/0.0001;    //60个周期内,平均每个k的移动距离---换算成"点"
  113.                                                                                           //不管平台的Point是0.0001还是0.00001,使用0.0001代表按思维小数来算
  114.       新Slope[i]=旧Slope[i]/(平均振幅[i]/0.0001)*10;      //新slope=旧slope/振幅 //10为凑数     //(平均振幅[i]/0.0001)=换算成"点"
  115.       //暂时没有乘/除 以系数
  116.    }

  117. //反向循环,从过去算到现在

  118. //7种可能性
  119. /*
  120. 只上行
  121. 1界线-----------
  122. 上行(之前从1上面下来,之前状态为上行)/震荡(之前从0.2上来,之前状态为震荡)
  123. 0.2界线---------
  124. 只震荡
  125. -0.2界线--------
  126. 下行/震荡
  127. -1界线----------
  128. 只下行
  129. */

  130.    //Comment(DoubleToStr(新Slope[10018],10));     //实测:Bars=10078,limit=10078    新Slope[10018]=6518.365错数   新Slope[10017]=正常
  131.    //Comment(DoubleToStr(新Slope[limit-1-均线周期],10));

  132.    
  133.    int 行情标示 = -2; //1为上行;0为震荡;-1为下行
  134.    int 判断启动开关 = 0;//0为关,1为开
  135.    
  136.    int 上行界 = 1;
  137.    double 上行转震荡界 = 0.2;
  138.    int 下行界 = -1;
  139.    double 下行转震荡界 = -0.2;
  140.    
  141.    for(i=limit-1-均线周期; i>=0; i--)
  142.    {      
  143.    //计算轨道宽度
  144.       轨道宽度=平均振幅[i]*4;

  145.       if(新Slope[i]>=1){
  146.          判断启动开关=1;      //从第一个上行开始启动
  147.       }
  148.       if(判断启动开关==0) continue;
  149.       
  150.       if(新Slope[i]>=上行界){
  151.          上行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);      //箭头一律画在-3的位置
  152.          行情标示=1;
  153.          上轨缓冲区[i]=均线值[i]+轨道宽度;
  154.          上中缓冲区[i]=均线值[i]+轨道宽度/2;

  155.          continue;
  156.       }
  157.       else if (新Slope[i]<上行界 && 新Slope[i]>上行转震荡界 && 行情标示==1){
  158.          上行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  159.          上轨缓冲区[i]=均线值[i]+轨道宽度;
  160.          上中缓冲区[i]=均线值[i]+轨道宽度/2;
  161.          continue;
  162.       }
  163.       else if (新Slope[i]<上行界 && 新Slope[i]>上行转震荡界 && 行情标示==0){
  164.          震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  165.          上中缓冲区[i]=均线值[i]+轨道宽度/2;
  166.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  167.          continue;
  168.       }
  169.       else if (新Slope[i]<=上行转震荡界 && 新Slope[i]>=下行转震荡界){
  170.          震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  171.          上中缓冲区[i]=均线值[i]+轨道宽度/2;
  172.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  173.          行情标示=0;
  174.          continue;
  175.       }
  176.       else if (新Slope[i]>下行界 && 新Slope[i]<下行转震荡界 && 行情标示==0){
  177.          震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  178.          上中缓冲区[i]=均线值[i]+轨道宽度/2;
  179.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  180.          continue;
  181.       }
  182.       else if (新Slope[i]>下行界 && 新Slope[i]<下行转震荡界 && 行情标示==-1){
  183.          下行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  184.          下轨缓冲区[i]=均线值[i]-轨道宽度;
  185.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  186.          continue;
  187.       }
  188.       else if(新Slope[i]<=下行界){
  189.          下行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  190.          行情标示=-1;
  191.          下轨缓冲区[i]=均线值[i]-轨道宽度;
  192.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  193.          continue;
  194.       }

  195. //两种大幅度情况:从 X<-0.2的下行,直接进入X>0.2的震荡
  196.       else if (新Slope[i]<上行界 && 新Slope[i]>上行转震荡界 && 行情标示==-1){
  197.          震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  198.          行情标示=0;
  199.          上中缓冲区[i]=均线值[i]+轨道宽度/2;
  200.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  201.          continue;
  202.       }
  203.       else if (新Slope[i]>下行界 && 新Slope[i]<下行转震荡界 && 行情标示==1){
  204.          震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
  205.          行情标示=0;
  206.          上中缓冲区[i]=均线值[i]+轨道宽度/2;
  207.          下中缓冲区[i]=均线值[i]-轨道宽度/2;
  208.          continue;
  209.       }

  210.    }
  211.    return(0);
  212.   }

复制代码




来源: 60日均线通道指标半成品(frlin2003)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 转播转播 分享分享 分享淘帖 支持支持 保留保留

4

主题

9227

积分

0

精华

所有交易让市场验证

操盘专家

金钱
9227 美元
权重
8
沙发
发表于 2019-1-19 21:49 来自手机 | 只看该作者
消灭零回复
您需要登录后才可以回帖 登录 | 快捷注册(禁q号)

本版积分规则

QQ|黄金吧|黄金论坛|手机版|指标下载|非农|目录|交易危机

版权所有: ©2014-2021 fx3q.com Powered by Discuz! X3
皖ICP备: 2024050410号-2

风险提示:杠杆风险高,交易要谨慎 声明:坛友发言和回复均为个人观点,不代表论坛立场。
若有侵权请联系fx3q@qq.com删除

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