文档库 最新最全的文档下载
当前位置:文档库 › mt4ea编程自动计算并画出趋势线

mt4ea编程自动计算并画出趋势线

mt4ea编程自动计算并画出趋势线
mt4ea编程自动计算并画出趋势线

mt4ea编程自动计算并画出趋势线

MT4 EA编程自动计算并画出趋势线

通过MT4平台编程,进行自动计算并画出趋势线,其方法如下所示。下面先介绍几个特殊函数,才能正确进行相关编程。

一、基本函数介绍:

1、窗口函数:

WindowBarsPerChart(); //屏幕可见K线总数

解释:该函数返回窗口中可见的K线数目总数,我们在画趋势线时,所选择的K线范围,一定属于在可见的范围之中,否则,难以知道其中的数据,也就不可能去画相应的趋势线了。因此,画趋势线的范围,是由窗口中可见K线数为基础条件的。因此,计算时,首先要获得窗口中的可见K线数。

2、时间序列图表数据:

start); //一组K线最高价的序号

参数说明:

string symbol:选定的货币对,NULL、symbol()均代表当前图表中的货币对

int timeframe:所选时间周期,0代表当前图表中的时间周期

int

type:所选数组的类型,如MODE_HIGH(最高价)、MODE_LOW(最低价)、MODE_OPEN(开盘价)、MODE_CLOSE(收盘价)、MODE_VOLUME(成交量)、MODE_TIME(交易开始时间)

void count:一组K线的计算根数

void start:开始K线的序号

最高价=High[ iHight()];

start); //一组K线最低价的序号

参数说明:

与以上函数相对应,使用方法相同。

最低价=Low[iLowest()];

3、数组函数:

ArrayMaximum(double array[],void count,void start); //数组最大值位置

参数说明:

double array[]://要求搜索的数组

void count://该数组的项目数

void start://开始搜索的序号

最大值=array[Array

Maximum()];

ArrayMinimum(double array[],void count,void start); //数组最小值位置

参数说明:

以上面最大值位置相对应,使用方法相同。

最小值=array[ArrayMinimum()];

ArraySize(object array[ ]); //计算数组项目数——相当于易语言中“取数组成员数()”命令

参数说明:

object array[ ]://需要计算的数组

4、自定义——画线函数:

由于MQL4中并没有内置画线函数,要实现画直线,则必须自己编制,即自定义函数。如下:

Int LineNo=0

V oid iDrawLine(int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice)

{

String myObjectName=”Line” LineNo;

ObjectCreate(myObjectName,OBJ_TREND,0,myFirstTime,my FirstPrice,mySecondTime,mySecondPrice);

ObjectSet(myObjectName,OBJPROP_COLOR,Green);

ObjectSet(myObjectName,OBJPROP_STYLE,STYLE_DOT);

ObjectSet(myObjectName,OBJPROP_WIDTH,1);

ObjectSet(myObjectName,OBJPROP_BACK,false);

ObjectSet(myObjectName,OBJPROP_RAY,false);

I

}

例:iDrawLine(13,close[13],6,close[6]);

//从第13根K线的收盘价,到第6根K线的收盘价之间画一个绿色虚线。

二、趋势线的数学原理:

如下所示,如何计算趋势线呢?下面进行讨论。计算原理如下:

1、第一步:计算K线数目

首先,计算出该图表(屏幕)上的K线总数,使用窗口函数中“WindowBarsPerChart()”进行计算。即:

K线总数(M):M= WindowBarsPerChart();

2、第二步:求该K线中的最高价位置与最低价位置

根据K线数目,使用时间序列图表数据函数,求出最高价、最低位位置。即:

最低价位置(A):A= iLowest(NULL,0,MODE_LOW,M,0);

最高价位置(B):B= iHighest(NULL,0,MODE_HIGH,M,0);

3、第三步:判断趋势是上升或者下降

根据最高价位置与最低价位置进行判断大小,数值大者,距当前K线越远;数值小者,则离当前K线距离越近。

当:A>B时,代表市场处于先低后高走势,属于上升趋势;

当:A时,代表市场处于先高后低走势,属于下降趋势。

4、第四步:根据上升或下降趋势计算基线(校正计算)

根据上升与下降趋结构,分别计算出相应的基准线。

A)当市场=上升时,计算波谷(最低价)基线:

低点位置X1:X1=A;低点的低价Y1:Y1=Low[A];

高点位置X2:X2=B;高点的低价Y2:Y2=Low[B];B)当市场=下跌时,计算波峰(最高价)基线:

高点位置X1:X1=B;高点的高价Y1:Y1=High[B];

低点位置X2:X2=A;低点的高价Y2:Y2=High[A];说明:

一般来说,直接用高点的高价与低点的低价进行连线也可,其产生的误差不是很大,也可使用。但根据“道氏理论”关于趋势的定义,以及市场主力的成本线与利润

线而言,成本是控制的基础,而利润则随市而变。因此,成本线更重要于利润线。其中:

上升行情中,波谷值连线是主力的成本线,波峰连线是主力的利润线;在空头行情中,波峰则是空头主力的成本线,而

波谷则是空头主力的利润线。

而且,在市场的趋势线理论中,凡上升趋势中下破趋势线,则市场反转;反之亦然。因此,成本线是市场的根本。

为了最大程度精确计算趋势线,因此,需要进行校正处理。并且,这种校正处理并不会给编程带来较大的麻烦,也不会导致计算机内存的占用。因此,这里进行校正处理。如下图所示:

5、第五步:根据基线,计算最高价与最低价区间内的价差,并存入数组P[ ]中。

峰谷区间长度(L):L=MathAbs(B-A); //取绝对值,即相距L 根K线

A)当为上升趋势:

直线斜率(R):R=(Low[B]-Low[A])/L; //两点之间的斜率

计算每根K线最低价与趋势基线之移动差值(P[ ]):

差值(P):P[N]= (Low[B]-N*R)- Low[N A]

其中:N=1-L

计算数组内的最大值位置X3:

X3=ArrayMaximum(P[],L,0) B;

第2谷值价格(最低价):Y3=Low[X3];画上升趋势线:myFirstTime:第1点时间——X1=A

myFirstPrice:第1点价格——Y1=Low[A] mySecondTime:第2点时间——X2=X3 mySecondPrice:第2点价格——Y2=Low[X3] iDrawLine(A,Low[A],X3,Low[X3]);

B)当为下跌趋势:

直线斜率(R):R=(High[B]-High[A])/L; //两点之间的斜率计算每根K线最低价与趋势基线之移动差值:

差值(P):P[N]=High[N A]-(High[A] N*R)

其中:N=1-L

计算数组内的最大值位置X3:

X3=ArrayMaximum(P[],L,0) B;

第2峰值价格(最高价):Y3=High[X3];画下跌趋势线:myFirstTime:第1点时间——X1=B

myFirstPrice:第1点价格——Y1=High[B] mySecondTime:第2点时间——X2=X3 mySecondPrice:第2点价格——Y2=High[X3]

iDrawLine(B,High[B],X3,High[X3]);

6、说明:

在计算每根K线的价格与趋势基线的差,按数学应该求它们的垂直线,从而进行比较。根据直角三角形原理,我们知道在这区间内的所有K线均属同一斜率,因此,使用垂直线与斜边线进行相对比较,其结果是一样的,这一点,可以直接通过三角函数可以加以证明得到。直角边=斜边*SinA,它们仅是存在一个变小的系数,对于数值比较大小,则形成相互约分的结果。

因此,为了简化计算,这里直接采用该根K线的最低价与直线相比较,计算出差值即可进行准确比较。

相关文档