这是一个非常简单的程序,同时也是一个非常有用的指标。
对于新手来说,越是简单的程序,越容易学习。所以让我们从最简单的程序开始。一起搞定MT5吧
程序虽然简单,但是里边包含的知识原理是一样的。
看完一个程序,争取会写一堆类似的,举一反三。
通过例子学习编写程序。
下图是做完的每日开盘价。
//+------------------------------------------------------------------+
//| 开盘价.mq5 |
//| Copyright 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//#property-是一个程序里边的声明。就是预先声明一些变量,可以供整个程序使用
//下边的这好几个//#property
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//上边这三行#property对一些简单小程序没什么用,放哪儿就行了。
//下边的这些#property在编写指标的时候必须用到。这个地方搞懂了,看指标类代码的时候就不会被吓住了。同时自己编写指标的时候也要对这个地方有耐心,这个地方不认真,
//后边的代码写的再好,图表上显示的也是乱码,非常的打击新手村村民的信心。
//buffers指的是缓存。1就是1个缓存。我们在这儿只需要显示1根线。需要几根就填几根,最多8根
#property indicator_buffers 1
//plots指的是划线。1就是画一根线(这个线既包括线也包括箭头等等,都叫plots)。
#property indicator_plots 1
//chart表示的是主图。因为我们这个指标写的是开盘价,所以必须用_chart_。但是编写像kdj之类指标,是放在副图上的,就需要用_separate_。
#property indicator_chart_window
//_color表示所画这根线的颜色。_color1里边的这个1表示的是第一号缓存。
//小问题:如果这儿需要3根线,那么需要怎么写呢?
#property indicator_color1 clrOrchid
//_type表示的是划线的类型。_type1表示的是第一号缓存的划线类型
#property indicator_type1 DRAW_LINE
//_color1,_type1只是划线属性里边的两个,其他的还有好多,比如:_width(宽度),_style(样式)等等。
//_type,_style这儿有个比较,_type表示线,箭头,标签,等等。_style表示的是一条线,应该画实线还是画虚线等等。
//-------以上就是编写指标程序的准备工作,这个工作简单而重要,用的好就可以做出各种样式复杂的指标
//-------
double a[]; //定义一个数组。这个数组对应的就是上面的那个_buffers 1。
//+------------------------------------------------------------------+
//|OnInit是初始化函数。这个函数在指标刚开始的时候会启用,然后就不用了。在点上边那个“编写”按钮的时候也会调用一次。然后就不用了。 |
//+------------------------------------------------------------------+
int OnInit()
{
//SetIndexBuffer函数可以把我们声明的缓存buffers和上边定义的数组变量a[]绑定起来,也就是一一对应起来
//这儿的0是缓存的编号,也就是第0号缓存。上文的buffers 1指的是1个缓存。
SetIndexBuffer(0,a,INDICATOR_DATA); //给缓存绑定序号
return(INIT_SUCCEEDED); //返回初始化成功,这个是系统自带,就是说系统初始化成功了。
}
//+------------------------------------------------------------------+
//|OnCalculate这个函数是指标程序里最主要的函数,图标上价格的每一次跳动,这个函数都会计算一次,所以这个函数调用的最频繁。
/*关于这个函数的一些讲解:
1.const,这个词是一个限制符,限制住后边的变量不要被改动。也就是计算的过程中不能给这个变量赋值。
2.里边的数组time[],open[].....等等这些是一般数组,不是时间序列。数组和时间序列有什么不同呢?数组起始点,也就是第0号在最左边。
而时间序列的起始点,也就是第0号在最右边。
3.prev_calculated,这个变量必须要讲一下,继续往下看。
*/
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, //图表k线总根数
const int prev_calculated, //已经被计算过的k线根数
const datetime &time[], //时间
const double &open[], //开盘价
const double &high[], //最高价
const double &low[], //最低价
const double &close[], //收盘价
const long &tick_volume[], //单笔成交量
const long &volume[], //成交量
const int &spread[]) //点差
{
//
/*关于prev_calculated。
1.这个变量是用来减少重复计算的。比如说一张图表上有10万根k线,如果每一次都从第0号开始计算一遍,那么就会极大的浪费电脑资源。这个变量就可以解决这个问题,
这个变量把之前计算过的k线记下来,新的k线出现时,就不再计算原来的了,只计算新的就行了。
*/
int limit; //先定义一个变量
if(prev_calculated==0) //prev_calculated==0,表示之前没有计算过,这时候需要计算全部数据
{
limit=rates_total;
}
else //prev_calculated不等0的情况,表示之前有一部分数据已经计算过了。就不在参与计算了
{
limit=prev_calculated;
}
//----下边的这一小小的部分就是计算部分。我们新手村的刚开始最喜欢这一部分。但苦于搞不定上边那些没用的,然后程序总是出错。
/*
看图表
*/
for(int i=0; i<limit; i++)
{
int sj=iBarShift(Symbol(),PERIOD_D1,time[i],true);
a[i]=iOpen(Symbol(),PERIOD_D1,sj);
}
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
这个15分钟图表是程序中的计算思路
好了,各位老铁,觉得还行的话,加个关注,后续还有,很快就能学会把自己的思路转化成程序