从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);
} 回复看看 赚钱,赚积分。顶.... 围观中~~~ 支持楼主 学习。。。顶。。。 MQL5真是大势所趋啊,很高级,很智能 MQL5真是大势所趋啊,很高级,很智能
生活需要每天的在学习