init()和OnInit()有什么区别?

时间:2015-03-28 20:25:35

标签: algorithmic-trading mql4 metatrader4 forex

我正在学习MQL4。在他们的参考网站上,创建自定义指标的过程如下:

#property indicator_chart_window

int init(){
    return(0);
}

int deinit(){
    ObjectsDeleteAll();
    return(0);
}

int start(){

    return(0); 
}

但是当我从MetaEditor内部创建一个新的Indicator时,我得到了另一种语法,如下所示:

int OnInit()
 { 
 //--- indicator buffers mapping

 //---
 return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(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 &tick_volume[],
            const long &volume[],
            const int &spread[])
 { 
//---

//--- return value of prev_calculated for next call
return(rates_total);
}

为什么会有所不同?

是否有网络链接,或有人可以推荐我的书? 从我读到的最好的地方是MQL4网站,但它看起来不同,我不知道现在转到哪里。

任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

观察到的差异来自何处?

MQL4 语言已经移动(某个地方关于MetaTrader4终端LiveUpdate版本Build 572 .. 6xx)a"半步"另一代MetaQuotes编程语言(名为MQL5)。

尽管MQL4语言已经跨越多年,并且在概念和执行方面都是成熟稳定的,但是" new" -MQL4引入了一些东西,传统的" MQL4语言(和代码执行环境)尚未准备好使用。

所以,您所做的观察是正确的,因为旧的" -syntax代码片段驻留在许多网页上,并且是一个新的" -syntax,粘贴在空白处/ new 指标模板由" new" - MQL4 - IDE。

在实践中如何处理?

您的"新" -syntax将适用于任何后Build-572 + MetaTrader4终端。你不必担心"不兼容"案例,其中"新"由于MetaTrader4服务器具有内部设置,因此代码将与旧的" -terminal冲突,该内部设置指示服务器愿意允许连接和服务的最老的" - 允许的终端。事实上,这意味着您将更新能够连接/运行连接到代理端的Build-572 MetaTrader4终端,其中" new" -code可能会与"旧的" -syntax规则。

无论如何,为了MQL4语法消除歧义,有一个编译器指令可用:

#property strict             // read MQL4-IDE Help file for more details

答案 1 :(得分:1)

构建600后,MQL4有一些变化。 OnInit()是Init-event处理程序。您仍然可以使用Init(),因为它是向后兼容的。 OnInit()是较新的做法。

部分在线文档已过时且尚未更新。 此链接提供有关更改的信息:http://docs.mql4.com/mql4changes