客服热线:18391752892

从MACD理解MQL5编程框架

   日期:2019-01-12     浏览:29    
马上注册,结交更多好友,下载更多资源

您需要 登录 才可以下载或查看,没有帐号?注册    以前自己比较擅长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);
 }
外汇交易有很大的风险性,本站所有资源均来自网络,请选择使用,如若出现亏损,本站不承担任何责任!


特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关行情
推荐行情
点击排行