|
欢迎优化!
文件存放位置不解释。关于程序问题不解释。
- //根据某种条件,将 上行/震荡/下行 用不同的颜色分割开
- //编译者:平衡;[url=www.fx3Q.com]www.fx3Q.com[/url] 众汇论坛
- #property indicator_buffers 7
- #property indicator_color1 Red
- #property indicator_color2 Blue
- #property indicator_color3 Green
- #property indicator_color4 Blue
- #property indicator_color5 Red
- #property indicator_color6 Blue
- #property indicator_color7 Green
- #property indicator_chart_window
- extern int 平均振幅周期=60;
- int 均线周期=60;
- double 上行标示缓冲区[];
- double 震荡标示缓冲区[];
- double 下行标示缓冲区[];
- /*
- int 符号代码_上行=225;
- int 符号代码_震荡=224;
- int 符号代码_下行=226;
- */
- int 符号代码_上行=159;
- int 符号代码_震荡=159;
- int 符号代码_下行=159;
- double 上轨缓冲区[];
- double 上中缓冲区[];
- double 下轨缓冲区[];
- double 下中缓冲区[];
- int init()
- {
- //---- indicators
- IndicatorBuffers(7);
- //----
-
- SetIndexStyle(0,DRAW_LINE,EMPTY,2);
- SetIndexBuffer(0,上轨缓冲区);
- SetIndexDrawBegin(0,均线周期);
- SetIndexStyle(1,DRAW_LINE,EMPTY,2);
- SetIndexBuffer(1,上中缓冲区);
- SetIndexDrawBegin(1,均线周期);
-
- SetIndexStyle(2,DRAW_LINE,EMPTY,2);
- SetIndexBuffer(2,下轨缓冲区);
- SetIndexDrawBegin(2,均线周期);
-
- SetIndexStyle(3,DRAW_LINE,EMPTY,2);
- SetIndexBuffer(3,下中缓冲区);
- SetIndexDrawBegin(3,均线周期);
- SetIndexStyle(4,DRAW_ARROW,0,0);
- SetIndexArrow(4,符号代码_上行);
- SetIndexBuffer(4,上行标示缓冲区);
- SetIndexEmptyValue(4,0.0);
- SetIndexStyle(5,DRAW_ARROW,0,0);
- SetIndexArrow(5,符号代码_震荡);
- SetIndexBuffer(5,震荡标示缓冲区);
- SetIndexEmptyValue(5,0.0);
-
- SetIndexStyle(6,DRAW_ARROW,0,0);
- SetIndexArrow(6,符号代码_下行);
- SetIndexBuffer(6,下行标示缓冲区);
- SetIndexEmptyValue(6,0.0);
- return(0);
- }
- int deinit()
- {
- //----
-
- //----
- return(0);
- }
- int start()
- {
- double 振幅之和;
- double 平均振幅[];
- double 旧Slope[];
- double 新Slope[];
- double 轨道宽度;
- double 均线值[];。
-
- ArrayResize(平均振幅,Bars); //无法使用如下语句:平均振幅[Bars],中括号内不可以放入变量,只能使用函数在声明后重新设定数组大小
- ArrayResize(旧Slope,Bars); //会导致程序运行较慢?
- ArrayResize(新Slope,Bars);
- ArrayResize(均线值,Bars);
-
- int i,j,limit,counted_bars=IndicatorCounted();
- if(counted_bars>0)
- counted_bars--;
- limit=Bars;//-counted_bars;
-
- //----
- if(Bars<=均线周期) return(0); //一般碰不到这情况,可删除
- //首次加载指标时,将最久远的60个无法得出数据的柱值清零,有必要加这行吗?也许可以忽略删除
- if(counted_bars<1){
- for(i=1;i<=均线周期;i++)
- {
- 新Slope[Bars-i]=EMPTY_VALUE;
- }
- }
- //计算平均振幅
- for(i=0; i<limit; i++){
- 振幅之和=0.0;
- for(j=i;j<i+平均振幅周期;j++){
- 振幅之和+=High[j]-Low[j];
- }
- 平均振幅[i]=振幅之和/平均振幅周期; //计算10个k的平均高低价差
- //平均振幅[i]=平均振幅[i]/0.0001; //换算成"点"
- }
- //计算旧Slope 和 新Slope
- for(i=0; i<limit; i++)
- {
- 均线值[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 旧Slope[i]=(iMA(NULL,0,均线周期,0,0,0,i)-iMA(NULL,0,均线周期,0,0,0,i+1))/0.0001; //60个周期内,平均每个k的移动距离---换算成"点"
- //不管平台的Point是0.0001还是0.00001,使用0.0001代表按思维小数来算
- 新Slope[i]=旧Slope[i]/(平均振幅[i]/0.0001)*10; //新slope=旧slope/振幅 //10为凑数 //(平均振幅[i]/0.0001)=换算成"点"
- //暂时没有乘/除 以系数
- }
- //反向循环,从过去算到现在
- //7种可能性
- /*
- 只上行
- 1界线-----------
- 上行(之前从1上面下来,之前状态为上行)/震荡(之前从0.2上来,之前状态为震荡)
- 0.2界线---------
- 只震荡
- -0.2界线--------
- 下行/震荡
- -1界线----------
- 只下行
- */
- //Comment(DoubleToStr(新Slope[10018],10)); //实测:Bars=10078,limit=10078 新Slope[10018]=6518.365错数 新Slope[10017]=正常
- //Comment(DoubleToStr(新Slope[limit-1-均线周期],10));
-
- int 行情标示 = -2; //1为上行;0为震荡;-1为下行
- int 判断启动开关 = 0;//0为关,1为开
-
- int 上行界 = 1;
- double 上行转震荡界 = 0.2;
- int 下行界 = -1;
- double 下行转震荡界 = -0.2;
-
- for(i=limit-1-均线周期; i>=0; i--)
- {
- //计算轨道宽度
- 轨道宽度=平均振幅[i]*4;
- if(新Slope[i]>=1){
- 判断启动开关=1; //从第一个上行开始启动
- }
- if(判断启动开关==0) continue;
-
- if(新Slope[i]>=上行界){
- 上行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i); //箭头一律画在-3的位置
- 行情标示=1;
- 上轨缓冲区[i]=均线值[i]+轨道宽度;
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- continue;
- }
- else if (新Slope[i]<上行界 && 新Slope[i]>上行转震荡界 && 行情标示==1){
- 上行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 上轨缓冲区[i]=均线值[i]+轨道宽度;
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- continue;
- }
- else if (新Slope[i]<上行界 && 新Slope[i]>上行转震荡界 && 行情标示==0){
- 震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- continue;
- }
- else if (新Slope[i]<=上行转震荡界 && 新Slope[i]>=下行转震荡界){
- 震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- 行情标示=0;
- continue;
- }
- else if (新Slope[i]>下行界 && 新Slope[i]<下行转震荡界 && 行情标示==0){
- 震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- continue;
- }
- else if (新Slope[i]>下行界 && 新Slope[i]<下行转震荡界 && 行情标示==-1){
- 下行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 下轨缓冲区[i]=均线值[i]-轨道宽度;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- continue;
- }
- else if(新Slope[i]<=下行界){
- 下行标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 行情标示=-1;
- 下轨缓冲区[i]=均线值[i]-轨道宽度;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- continue;
- }
- //两种大幅度情况:从 X<-0.2的下行,直接进入X>0.2的震荡
- else if (新Slope[i]<上行界 && 新Slope[i]>上行转震荡界 && 行情标示==-1){
- 震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 行情标示=0;
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- continue;
- }
- else if (新Slope[i]>下行界 && 新Slope[i]<下行转震荡界 && 行情标示==1){
- 震荡标示缓冲区[i]=iMA(NULL,0,均线周期,0,0,0,i);
- 行情标示=0;
- 上中缓冲区[i]=均线值[i]+轨道宽度/2;
- 下中缓冲区[i]=均线值[i]-轨道宽度/2;
- continue;
- }
- }
- return(0);
- }
复制代码
|
|