注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

196898jiabeizan的博客

股道 股之道 赌之道 惑之道 非常道 孟子曰 盛极而衰 否极泰来 股之正道也 妖

 
 
 

日志

 
 

小周期图上看到大周期图的MACD  

2009-04-22 12:39:10|  分类: 指标 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、能在小的时段图上看到大时段图的MACD指标。例如,能在5分钟、15分钟、30分钟等图上看到1小时、4小时、24小时等图的MACD

二、目标锁定。无论图表时段怎么切换,目标不变。例如原来是在1小时图上看4小时图MACD,当图表切换到30分钟后,图上仍显示4小时图MACD

本MACD的创新之处是“任意”,在设置上更加灵活,目标图表时段可以任意设置(任意大)。

例如,本指标可以在30分钟、1小时等图上看到虚拟的7小时、8小时等任意图的MACD。

7小时图MACD?没看到过吧小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

本MACD的设置也相当地简单。

比普通MACD增加两个参数:小时数和单位值,用于设置目标时段。两数都必须为正整数,不能为零,乘积就是我们的目标

例如要看12小时图MACD,只要小时数设为12,单位值60(12x60=720分钟=12小时),就可以了

而要看比小时图小的45分钟等图MACD,则要把两参数改为1和45,或者3和15,只要乘积等于目标即可







目的:当价格穿越预先设定的一组均线时,发出报警。一个币对加载了该指标,能同时监控所有直盘和叉盘币对。
 
这个均线组可以是1条或2条或10条或N条均线,总之这组均线条数和参数是可以任意设置的,你想怎么样的一组均线就怎样随你设置。
 
穿越判断。价格和均线组的位置关系有三种:1价格在均线组上方、2价格在均线组中间、3价格地均线组下方。当位置关系由2变1,或由3变1时,我们就认为是上穿条件达到。当位置关系由2变3,或由1变3时,我们就认为是下穿条件达到。
 
穿越期。我们可以把穿越期设为X根K线,即现在已经在均线组上方,而X根K线之前价格在均线组之间或下方。当然X最小为1根K线。
 
还有,这组均线也不一定全部都要穿越。假如我们设了均线组为8条均线,然后我们希望价格穿越这8条均线中的6条时就报警,允许其中的任意2条未穿越,当然全部穿越时也是会报警的。
 
报警间隔。该指标每隔N分钟去检查一次所有币对,如果有币对满足穿越条件的,则发出警报,有几对就报几对,如果一对都没有则不报警。
 
关于均线组的设置。例如:“0.25;0.5;1;2;5;7;10”,这一串数字用分号间隔的7个数,代表了7根均线,均线的单位是“天”,可以为小数,0.25表示6小时,0.5表示12小时,1表示1天,2表示2天等等。数字之间一定要用分号间隔,不能有其他符号,不能有空格。
 
还有一点,本指标均线参数的设置与图表周期无关,即相同的均线参数在不同周期的图表上,结果都一样。但要注意的是,加载指标的图是什么周期,别的图打开的周期最好与这个图打开的周期一致,这样可以避免因为此周期数据未更新而误报


小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

均线会变色,看起来很神秘,但原理其实很简单:


这里实际上有两条均线,一条红线,一条绿线:
当价格在均线上方时,红线显示,绿线隐藏;
当价格在均线下方时,红线隐藏,绿线显示,
所以看起来就只是一条会变色的均线。

要隐藏一条指标线中的其中一段,也很简单,只要把这一段指标线的值赋为空值(EMPTY_VALUE)就行了。

说说容易,但实际操作的时候,我们又遇到了一个小问题,那就是红绿转换点的“断点”问题,红线和绿线不连续了。图:

小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

这个问题着实困扰了我好一阵,后来终于想通了。
原来,画线的条件是:前后两个时点上都必须有值,才能画出线来。而上图中2和3之间应该画上红线,但在3点位上,红线的值为空,所以,红线画不出来。

要让红线、绿线连续,必须使3点位上,既有绿线值又有红线值,这样2和3之间才能出现红线,红线绿才会连续。

小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

为了做到这一点,我们在给指标线循环赋值的时候:

1、在 i 时点上,除了给 i 时点赋值,同时还要给 i+1时点赋同色值(以上图为例:我们在给3时点赋绿线值时,同时给4时点赋绿线值;在给2时点赋红线值时,同时再给3点赋红线值;这样3时点上就既有红线值,又有绿线值);

2、赋值的顺序为从左向右,即递减循环,以避免前一操作所赋的值被清空。

这样我们的目的就达到了。

下面这是经过测试的源代码

---------------------------------------------------------------------------------------------------

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
extern int  变色均线=18;
double duo[];
double kong[];
int init()
  {
   SetIndexBuffer(0,duo);
   SetIndexBuffer(1,kong);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexDrawBegin(0,变色均线);
   SetIndexDrawBegin(1,变色均线);
   IndicatorDigits(Digits);
   return(0);
  }
int start()
  {
   double temp0,temp1;
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   for(int i=limit; i>=0; i--)
      {     
      duo[i]=EMPTY_VALUE;
      kong[i]=EMPTY_VALUE;
      temp0=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i);
      temp1=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i+1);
      if(iClose(NULL,0,i)>=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i)) 
            {duo[i]=temp0; duo[i+1]=temp1;}
      else  {kong[i]=temp0; kong[i+1]=temp1;}
      }      
   return(0);
  }
-----------------------------------------------------------------------------------------------------------

当然,上面这个是以价格在均线上下方为条件的,我们也可以以MACD、KDJ、RSI等指标作为均线变色的条件。我们还可以更进一步,把双色线改为三色线等等

 

小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

均线会变色,看起来很神秘,但原理其实很简单:

这里实际上有两条均线,一条红线,一条绿线:

当价格在均线上方时,红线显示,绿线隐藏;

当价格在均线下方时,红线隐藏,绿线显示,

所以看起来就只是一条会变色的均线。

要隐藏一条指标线中的其中一段,也很简单,只要把这一段指标线的值赋为空值(EMPTY_VALUE)就行了。

说说容易,但实际操作的时候,我们又遇到了一个小问题,那就是红绿转换点的“断点”问题,红线和绿线不连续了。图:

小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

这个问题着实困扰了我好一阵,后来终于想通了。

原来,画线的条件是:前后两个时点上都必须有值,才能画出线来。而上图中2和3之间应该画上红线,但在3点位上,红线的值为空,所以,红线画不出来。

要让红线、绿线连续,必须使3点位上,既有绿线值又有红线值,这样2和3之间才能出现红线,红线绿才会连续。

小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

为了做到这一点,我们在给指标线循环赋值的时候:

1、在 i 时点上,除了给 i 时点赋值,同时还要给 i+1时点赋同色值(以上图为例:我们在给3时点赋绿线值时,同时给4时点赋绿线值;在给2时点赋红线值时,同时再给3点赋红线值;这样3时点上就既有红线值,又有绿线值);

2、赋值的顺序为从左向右,即递减循环,以避免前一操作所赋的值被清空。

这样我们的目的就达到了。

下面这是经过测试的源代码

---------------------------------------------------------------------------------------------------

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 Red

#property indicator_color2 Green

extern int  变色均线=18;

double duo[];

double kong[];

int init()

  {

   SetIndexBuffer(0,duo);

   SetIndexBuffer(1,kong);

   SetIndexStyle(0,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE);

   SetIndexDrawBegin(0,变色均线);

   SetIndexDrawBegin(1,变色均线);

   IndicatorDigits(Digits);

   return(0);

  }

int start()

  {

   double temp0,temp1;

   int limit;

   int counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);

   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;

   for(int i=limit; i>=0; i--)

      {     

      duo[i]=EMPTY_VALUE;

      kong[i]=EMPTY_VALUE;

      temp0=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i);

      temp1=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i+1);

      if(iClose(NULL,0,i)>=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i)) 

            {duo[i]=temp0; duo[i+1]=temp1;}

      else  {kong[i]=temp0; kong[i+1]=temp1;}

      }      

   return(0);

  }

-----------------------------------------------------------------------------------------------------------

当然,上面这个是以价格在均线上下方为条件的,我们也可以以MACD、KDJ、RSI等指标作为均线变色的条件。我们还可以更进一步,把双色线改为三色线等等

 

===================================================
语句简要解释如下:
===================================================
#property indicator_chart_window
指标放在主图

#property indicator_buffers 2
设置指标线数组为2个

#property indicator_color1 Red
#property indicator_color2 Green
设置第一条指标线颜色值为Red,第二条颜色值为Green

extern int  变色均线=18;
设立一个自定义变量,允许外部值修改,整数形,变量名为"变色均线",默认值18

double duo[];
设立一个自定义数组,双精度型,名称为duo
该数组在后面用于存储红线数据

double kong[];
设立一个自定义数组,双精度型,名称为kong
该数组在后面用于存储绿线数据

int init()
设立初始化函数init。init为系统规定函数名,函数内容自定义。该函数在指标被加载时运行一次
  {
   SetIndexBuffer(0,duo);
   SetIndexBuffer(1,kong);
   设置第一、二条指标线的数组为duo和kong

   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   设置第一、二条指标线的样式,线型为连续曲线

   SetIndexDrawBegin(0,变色均线);
   SetIndexDrawBegin(1,变色均线);
   设置第一、二条指标线的最左边的起始划线位置

   IndicatorDigits(Digits);
   设置指标精确到的小数位数
   Digits是当前汇率小数位,日系Digits=2,其他币对Digits=4

   return(0);
   init函数结束,返回零值
  }
int start()
设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发
  {
   double temp0,temp1;
   设立双精度型自定义变量temp0、temp1

   int limit;
   设立自定义变量limit,整数型

   int counted_bars=IndicatorCounted();
   设立整数型自定义变量counted_bars,并将IndicatorCounted()的值赋给counted_bars
   IndicatorCounted()为缓存数,即已经计算过值的烛柱数

   if(counted_bars<0) return(-1);
   如果counted_bars值小于零,start函数结束

   if(counted_bars>0) counted_bars--;
   如果counted_bars值大于零,则counted_bars值减掉1。这是为了配合下一句,以避免limit相差1而出错

   limit=Bars-counted_bars;
   给limit赋值
   Bars为图表中的烛柱数
   counted_bars为缓存数,即已经运算过的烛柱数
   这样limit的值就是未经运算的烛柱数
   这样做的目的是避免重复运算,优化程序

   for(int i=limit; i>=0; i--)
   循环语句,括号中有三个语句:
   第一句int i=limit; 表示循环从i=limit开始
   第二句i>=0; 这是循环的条件,如果条件满足则执行大括号中的循环体,如果条件不满足,则中止循环,跳到大括号下面的语句执行
   第三句i--,这是循环步调控制语句,每循环一次后执行一次此语句。
   i--相当于i=i-1,即i值在原有数值上减少1

      {    
      duo[i]=EMPTY_VALUE;
      kong[i]=EMPTY_VALUE;
      给数组duo和kong在i位置上赋空值
      EMPTY_VALUE:空值

      temp0=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i);
      temp1=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i+1);
      把均线在i和i+1位置上均线值,分别赋给temp0和temp1
      这是为了使后面的语句看起来简洁

      if(iClose(NULL,0,i)>=iMA(NULL,0,变色均线,0,MODE_SMA,PRICE_CLOSE,i))
      判断条件语句:如果价格高于均线
            {duo[i]=temp0; duo[i+1]=temp1;}
            判断执行语句:给数组元素duo[i]、duo[i+1]分别赋值
      else  {kong[i]=temp0; kong[i+1]=temp1;}
      如果判断条件不成立,即价格低于均线:则给数组元素kong[i]、kong[i+1]分别赋值
      }     
   return(0);
   start函数结束,返回零值
  }

 

报警功能是MT4的一大特色。

它可以在预定的条件达到时,发出警报。

小周期图上看到大周期图的MACD - 196898jiabeizan - 196898jiabeizan的博客

与指标画线相比,报警语句显得非常简单,

只要在判断语句中加一个报警语句即可

报警方式有:弹出窗口报警、音乐报警、邮件报警等。

如果邮箱开通了手机短信通知,则邮件报警的内容会即时转发到手机上。

1、弹出窗口报警:

当(条件达到)执行此语句时,以弹出窗口警告。

格式:Alert(内容1,内容2,内容3,内容4);

报警内容为字符串型,内容之间加逗号

例如:

Alert( Symbol(),"4小时图MACD上穿零轴");

2、音乐报警:

当(条件达到)执行此语句时,播放一段音乐。

格式:PlaySound("音乐文件名.wav");

文件类型为wav格式,并且保存在C:\Program Files\MetaTrader4\sounds目录中

文件名加引号

3、邮件报警:

当(条件达到)执行此语句时,发送一个邮件。

(收发件人地址在MT4系统中设置详见《MT4编程实例1:一个简单的小程序,让你的手机摇身变成外汇行情接收机》)

格式:SendMail(标题1+标题2, 内容1+内容2);

标题之间以加号连接,内容之间也以加号连接

邮件标题和邮件内容以逗号间隔

 

下面是《价格穿越某均线报警》举例

+---------------------------------

#property indicator_chart_window

extern int 警戒均线=20;

int mark=0;

int start()

{

    if(   iHigh(0,0,0) >= iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,0)

       && iHigh(0,0,1) <  iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,1)

       && mark != 1   )

          {

            Alert(Symbol(),"向上触及30均线");

            mark = 1;

          }

    if(   iLow(0,0,0) <= iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,0)

       && iLow(0,0,1) >  iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,1)

       && mark != 2   )

          {

            Alert(Symbol(),"向下触及",警戒均线,"均线");

            mark = 2;

          }

    return(0);

}

+---------------------------------

部分语句说明:

#property indicator_chart_window

此句是把程序放在主图,当然这此例中放在副图也一样

extern int    定义一个外部参数变量,整数型,允许外部值修改

int                定义一个整数型变量

int start()    定义触发函数

if()                判断

iHigh()        最高价值函数

iLow()         最低价值函数

iMA()           移动平均线值函数

Alert()         报警函数

Symbol()    商品名称函数

&&              逻辑运算符“并且”

!=                逻辑运算符“不等于”

MODE_SMA     简单移动平均模式

PRICE_CLOSE  以收盘价计算

再说一下自定义变量mark的作用:

mark的初值是0,当上穿报警时给mark赋值1,当下穿报警时给mark赋值2。

这样当mark的值为1时,说明已经对上穿报过警了,就不能再次对上穿报警;

当mark的值为2时,说明已经对下穿报过警了,就不能再次对下穿报警。

这样就起到了消除重复报警的作用。

 

=============================================

语句简要解释如下:

=============================================

#property indicator_chart_window

指标放在主图

extern int 警戒均线=20;

设立一个自定义变量,允许外部值修改,整数形,变量名为"警戒均线",默认值20

int mark=0;

设立一个自定义变量,整数型,变量名为mark,并赋初值0

此变量在后面用于记录是否报警,设计是这样的:

如果mark=0,则从未报过警

如果mark=1,则已经向上报过警

如果mark=2,则已经向下报过警

int start()

设立触发函数start。start为系统规定函数名,函数内容自定义。当数据变动时,start函数被触发

{

    if(   iHigh(0,0,0) >= iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,0)

       && iHigh(0,0,1) <  iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,1)

       && mark != 1   )

      条件判断语句。这里用到逻辑运算符&&,就是“并且”,条件有三个,三个条件要同时成立,则整个条件才成立

      第一个条件:最高价大等于均线。iHigh是烛柱最高价取值函数,iMA是均线取值函数

      第二个条件:前一烛柱最高价小于均线

      第三个条件:mark不等于1。如果mark不等于1,就说明指标没有对上穿报过警

          {

            Alert(Symbol(),"向上触及30均线");

            mark = 1;

          }

          花括中为条件执行语句。Alert是报警语句,Symbol()是商品名称取值函数

          报警语句执行后,给mark赋值1,这样就记录了已经向上报过警了

    if(   iLow(0,0,0) <= iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,0)

       && iLow(0,0,1) >  iMA(0,0,警戒均线,0,MODE_SMA,PRICE_CLOSE,1)

       && mark != 2   )

          {

            Alert(Symbol(),"向下触及",警戒均线,"均线");

            mark = 2;

          }

    return(0);

    start函数结束语句,返回零值

}






  评论这张
 
阅读(974)| 评论(0)