shanwenlong1234 发表于 2014-12-12 08:47:15

从MACD理解MQL5编程框架

   以前自己比较擅长MQL4,感觉基于该框架比较符合自己的编程习惯。的确,MQL4的结构很清晰,初始化、析构、主函数基本保留了C的大部分特性,而且在习惯上也便于接受。但是在随着国际ATC锦标赛的进行,亲眼见证了该技术的更新,为何之前MQL4要迁移到MQL5去做呢?这个初次很让我不解,因为对于已经习惯了MQL4的我要更换习惯,确实很麻烦,看了那么多届的比赛,自己也开始冲动想一试身手,结果技术更新了。最近接触了一位参加ATC的台湾朋友,他说MQL5的确功能要强大很多,能够支持OO、Pointer、STL等,在习惯上更贴近C++。于是说得我开始有些心动,终于按耐不住想去了解一下,我知道习惯了MQL4,学习MQL5是一件很轻松的事,很多基本库函数还是保留的,但要自己改变习惯还是一件很痛苦的事(选择IT本来就需要持续更新学习的)。究竟MQL5到底有多强大呢?早上我就顺便看了一下最传统的MACD代码,虽然我还没有接触到朋友上面所说的功能,但是大致浏览了一下技术文档,的确有这方面的介绍。MACD部分代码如下:void OnInit()    这个就是MQL4中的init()函数,也就是对程序的初始化,包括整体的布局、参数初始化、一些基本需要调用的函数定义等等
{
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpFastEMA)+","+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
   ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_EMA,InpAppliedPrice);
//--- initialization done
}
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int OnCalculate    这个函数相当于主函数,其中rates_total是代表所有的柱体,函数执行就看该值是否为零,如果为零,则在前台图表中不会有所反应,初看被那么多函数参数吓到了,其实这个就是针对每个Flag进行逐一计算的过程,也就是这些参数为什么要取用地址&,而不用实参的缘故。prev_calculated就是未参与计算的部分,因为包括当前柱体在内的以前的所有柱体数构不成函数计算的要求,相当于从哪一根柱体开始计算,之前的柱体就置空的意思。
(const int rates_total,    const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[])
{
//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
   {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
   }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
   {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
   }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
   {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
   }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
   {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
   }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
   {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
   }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
      ExtMacdBuffer=ExtFastMaBuffer-ExtSlowMaBuffer;
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.标红的就是MACD核心计算部分,和MQL4是一样的思路,做法也是一样的,遍历所有柱体进行运算。
   return(rates_total);
}

syvecbmy 发表于 2014-12-12 09:17:15

回复看看

香港第一金 发表于 2014-12-12 22:15:35

赚钱,赚积分。顶....

记忆开始 发表于 2014-12-13 03:41:06

9624木头人 发表于 2014-12-13 12:00:42

围观中~~~

zh198611 发表于 2014-12-15 07:36:11

支持楼主

XWZ 发表于 2015-1-7 18:32:01

学习。。。顶。。。

ny1990 发表于 2015-7-4 17:07:32

MQL5真是大势所趋啊,很高级,很智能

ny1990 发表于 2015-7-4 17:09:50

MQL5真是大势所趋啊,很高级,很智能

Gnay 发表于 2015-7-4 19:26:37


生活需要每天的在学习
页: [1] 2 3
查看完整版本: 从MACD理解MQL5编程框架