MT5通过实例学编程,超级详细,痛点讲解,不怕你不会。学会自编不求人 (一)将每日开盘价做成指标显示,日内交易很有用(老手请绕路)

本文是针对MT5编程的初学者教程,通过详细讲解如何创建一个显示每日开盘价的指标,帮助读者理解基本编程概念。程序虽简单,但能引导学习者掌握核心原理,并鼓励举一反三。文中配以图表说明计算过程,适合希望自编指标的交易者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个非常简单的程序,同时也是一个非常有用的指标。

对于新手来说,越是简单的程序,越容易学习。所以让我们从最简单的程序开始。一起搞定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分钟图表是程序中的计算思路

 

好了,各位老铁,觉得还行的话,加个关注,后续还有,很快就能学会把自己的思路转化成程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玻璃房的钥匙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值