MT4平台指标编程.docx

上传人:b****6 文档编号:8078911 上传时间:2023-01-28 格式:DOCX 页数:36 大小:214.73KB
下载 相关 举报
MT4平台指标编程.docx_第1页
第1页 / 共36页
MT4平台指标编程.docx_第2页
第2页 / 共36页
MT4平台指标编程.docx_第3页
第3页 / 共36页
MT4平台指标编程.docx_第4页
第4页 / 共36页
MT4平台指标编程.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

MT4平台指标编程.docx

《MT4平台指标编程.docx》由会员分享,可在线阅读,更多相关《MT4平台指标编程.docx(36页珍藏版)》请在冰豆网上搜索。

MT4平台指标编程.docx

MT4平台指标编程

MT4编程实例:

会变色的均线

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

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

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

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

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

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

图:

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

原来,画线的条件是:

前后两个时点上都必须有值,才能画出线来。

而上图中2和3之间应该画上红线,但在3点位上,红线的值为空,所以,红线画不出来。

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

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

1、在i时点上,除了给i时点赋值,同时还要给i+1时点赋同色值(以上图为例:

我们在给3时点赋绿线值时,同时给4时点赋绿线值;在给2时点赋红线值时,同时再给3点赋红线值;这样3时点上就既有红线值,又有绿线值);

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

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

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

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

#propertyindicator_chart_window

#propertyindicator_buffers2

#propertyindicator_color1Red

#propertyindicator_color2Green

externint变色均线=18;

doubleduo[];

doublekong[];

intinit()

{

SetIndexBuffer(0,duo);

SetIndexBuffer(1,kong);

SetIndexStyle(0,DRAW_LINE);

SetIndexStyle(1,DRAW_LINE);

SetIndexDrawBegin(0,变色均线);

SetIndexDrawBegin(1,变色均线);

IndicatorDigits(Digits);

return(0);

}

intstart()

{

doubletemp0,temp1;

intlimit;

intcounted_bars=IndicatorCounted();

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

if(counted_bars>0)counted_bars--;

limit=Bars-counted_bars;

for(inti=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等指标作为均线变色的条件。

我们还可以更进一步,把双色线改为三色线等等

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

语句简要解释如下:

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

#propertyindicator_chart_window

指标放在主图

#propertyindicator_buffers2

设置指标线数组为2个

#propertyindicator_color1Red

#propertyindicator_color2Green

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

externint变色均线=18;

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

doubleduo[];

设立一个自定义数组,双精度型,名称为duo

该数组在后面用于存储红线数据

doublekong[];

设立一个自定义数组,双精度型,名称为kong

该数组在后面用于存储绿线数据

intinit()

设立初始化函数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函数结束,返回零值

}

intstart()

设立触发函数start。

start为系统规定函数名,函数内容自定义。

当数据变动时,start函数被触发

{

doubletemp0,temp1;

设立双精度型自定义变量temp0、temp1

intlimit;

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

intcounted_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(inti=limit;i>=0;i--)

循环语句,括号中有三个语句:

第一句inti=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编程实例:

在欧元图上显示英磅的RSI指标

作者:

秃鹫来自:

韬客外汇论坛

下面这个图是AUD图上,叠加了英磅的RSI指标。

(当然也可以不叠加,分两个窗口)

从RSI指标图上我们看到,英磅强势,而澳元很弱

下面是指标源码

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

#propertyindicator_separate_window

#propertyindicator_buffers1

#propertyindicator_color1Aqua

#propertyindicator_level130

#propertyindicator_level270

externintRSI=12;

externstring商品="GBPUSD";

doubleind_buffer[];

intinit()

{

SetIndexBuffer(0,ind_buffer);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

IndicatorShortName("RSI("+商品+","+RSI+")");

return(0);

}

intstart()

{

intlimit;

intcounted_bars=IndicatorCounted();

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

if(counted_bars>0)counted_bars--;

limit=Bars-counted_bars;

for(inti=0;i

ind_buffer[i]=iRSI(商品,0,RSI,PRICE_CLOSE,i);

return(0);

}

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

下面是指标叠加的操作方法:

下面是指标叠加的操作方法:

当然这里用的是RSI指标,别的指标如KDJ、威廉等指标也可以类似操作,只要把上面源码中的取值函数和参数换一个行了。

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

语句简要解释如下:

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

#propertyindicator_separate_window

指标放在副图

#propertyindicator_buffers1

设置指标线数组为1个

#propertyindicator_color1Aqua

设置第一条指标线颜色值为Aqua,即介于蓝绿之间的一种颜色

#propertyindicator_level130

在副图中,30值位置上画一条水平直线

#propertyindicator_level270

在副图中,70值位置上画一条水平直线

externintRSI=12;

设立一个自定义变量,允许外部值修改,整数型,变量名为"RSI",默认值12

externstring商品="GBPUSD";

设立一个自定义变量,允许外部值修改,字符串型,变量名为"商品",默认值"GBPUSD"

doubleind_buffer[];

设立一个自定义数组,双精度型

intinit()

设立初始化函数init。

init为系统规定函数名,函数内容自定义。

该函数在指标被加载时运行一次

{

SetIndexBuffer(0,ind_buffer);

设置第一条指标线的数组为ind_buffer

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);

设置第一条指标线的样式,DRAW_LINE表示连续曲线,STYLE_SOLID表示实心线,1号粗线

IndicatorShortName("RSI("+商品+","+RSI+")");

设置指标线的显示简称

return(0);

初始化函数结束

}

intstart()

设立触发函数start。

start为系统规定函数名,函数内容自定义。

当数据变动时,start函数被触发

{

intlimit;

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

intcounted_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(inti=0;i

循环语句,括号中有三个语句:

第一句inti=0;表示循环从i=0开始

第二句i

第三句i++,这是循环步调控制语句,每循环一次后执行一次此语句。

i++相当于i=i+1,即i值在原有数值上增加1

ind_buffer[i]=iRSI(商品,0,RSI,PRICE_CLOSE,i);

此语句为循环体,由于只有一个语句,所以省略花括号

i为图表烛柱的序号,从0开始,右边第1柱序号为0,从右向左递增

iRSI为RSI指标的取值函数

return(0);

start函数结束

}

MT4编程实例:

箭头符号

(1)

上一篇/下一篇2008-03-1621:

49:

48/个人分类:

MT4

查看(808)/评论(0)/评分(0/0)

作者:

秃鹫来自:

韬客外汇论坛

  符号是一种断断续续的指标线。

在指标线有值区域,指标线显示;在指标线无值区域,指标线隐藏。

例如下图:

当价格上穿、下穿均线时,均线上出现一个标记符号。

  原理也很简单:

在上图中,存在二条指标线,一条是均线,另一条是笑脸符号线。

均线在任何位置都有值,所以均线是一条连续的曲线;

当价格上、下穿均线时,符号线被赋予了均线值;而在其他位置上,符号线被赋了空值。

所以只是在价格上、下穿均线的位置上,符号线才有值,才能出现笑脸符号。

因为符号线只是个别位置有值,所以符号线仅在个别位置显现。

符号也正好落在均线上,因为符号线值=均线值。

如果符号线被赋了别的值,例如(符号线=均线+10点),那么符号水平坐标不变,垂直坐标将是均线上方的10点位置。

源码如下:

//======================================================

#propertyindicator_chart_window

#propertyindicator_buffers1

#propertyindicator_color1Yellow

externint均线=10;

doublemk[];

doubletemp0,temp1;

intinit()

{

IndicatorBuffers

(1);

SetIndexBuffer(0,mk);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,204);

IndicatorDigits(Digits);

return(0);

}

intstart()

{

intlimit;

intcounted_bars=IndicatorCounted();

if(counted_bars>0)counted_bars--;

limit=Bars-counted_bars-均线;

for(inti=0;i

{

temp0=iMA(NULL,0,均线,0,0,0,i);

temp1=iMA(NULL,0,均线,0,0,0,i+1);

mk[i]=EMPTY_VALUE;

if(Close[i]>temp0&&Close[i+1]

if(Close[i]temp1)mk[i]=temp0;

}

return(0);

}

//源码到此已结束

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

语句简要解释如下:

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

#propertyindicator_chart_window

指标放在主图

#propertyindicator_buffers1

设置指标线数为1条

#propertyindicator_color1Yellow

设置第一条指标线颜色为黄色

externint均线=10;

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

doublemk[];

设立一个自定义数组,双精度型

doubletemp0,temp1;

设立二个自定义变量,双精度型,变量名为temp0、temp1

intinit()

设立初始化函数init。

init为系统规定函数名,函数内容自定义。

该函数在指标被加载时仅运行一次

{

IndicatorBuffers

(1);

指标线数量为1条

SetIndexBuffer(0,mk);

第一条指标线的数组为mk

SetIndexStyle(0,DRAW_ARROW);

第一条指标线的线型为箭头符号

SetIndexArrow(0,204);

第一条指标线的箭头符号为第204种符号,如果换一个编号,那出现的就是另一种符号。

箭头符号的编码详见《MT4编程参考》

IndicatorDigits(Digits);

设置指标线的小数位数

Digits=当前汇率的小数位数,如日元叉盘Digits=2,其他币对Digits==4

return(0);

函数结束,返回零值

}

intstart()

设立触发函数start。

start为系统规定函数名,函数内容自定义。

当数据变动时,start函数被触发

{

intlimit;

设立整数型自定义变量limit

intcounted_bars=IndicatorCounted();

设立整数型自定义变量counted_bars,并将IndicatorCounted()的值赋给counted_bars

IndicatorCounted()为缓存数量,即已经计算过值的烛柱数

if(counted_bars>0)counted_bars--;

如果counted_bars大于零,则将counted_bars的值减掉1

这是为了配合下一句,以避免limit相差1而发生出错

limit=Bars-counted_bars-均线;

这是给limit赋值

Bars为图表中的柱数

counted_bars为已经赋值的柱数

这样limit的结果就是未赋值的烛柱数

再减去“均线”是因为图表最右边段均线无意义

for(inti=0;i

循环语句,括号中有三个语句:

第一句inti=0;表示循环从i=0开始

第二句i

第三句i++,这是循环步调控制语句,每循环一次后执行一次此语句。

i++相当于i=i+1,即i值在原有数值上增加1

{

temp0=iMA(NULL,0,均线,0,0,0,i);

把均线在i位置上的值赋给temp0

iMA:

均线取值函数

temp1=iMA(NULL,0,均线,0,0,0,i+1);

把均线在(i+1)位置上的值赋给temp1

mk[i]=EMPTY_VALUE;

给数组mk在i位置上赋空值

EMPTY_VALUE就是空值

if(Close[i]>temp0&&Close[i+1]

条件判断语句。

如果在i位置上价格大于均线,并且在(i+1)位置上价格小于均线(即价格上穿均线),则给数组mk在i位置上赋该位置的均线值

Close[i]:

在i位置上收盘价。

&&:

逻辑运算符“并且”

if(Close[i]temp1)mk[i]=temp0;

与上一句相似

}

return(0);

start函数结束语句

把所有时段MACD一起显示

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1