测试版530中的阵列大小调整问题 - 页 3

 
RaptorUK:

我不熟悉MT3,但我认为在MT3上运行的代码也能在MT4上运行 ......这就是MT4-->MT5的问题,也是情况不同的原因。

大多数MT4用户不会编码,如果他们在MT4上喜欢的指标在MT5上不存在,那么他们就不会使用MT5。

据我所知,MT3的代码不能在MT4上运行,语言是非常不同的。关于MT4/MT5的争论是无休止的,有很多因素导致了MT4的生存,我甚至不确定MT5是否打算完全取代MT4。

总之,关于新版本,Metaquotes说它将在ex4层面向后兼容,但在mq4层面并不真正兼容。

 

我快速看了一下新的元编辑器的帮助,新版本mql4看起来与旧版本的区别比我想象的要大。

 
angevoyageur:

据我所知,MT3的代码不能在MT4上运行,其语言非常不同。关于MT4/MT5的争论是无止境的,有很多因素导致了MT4的生存,我甚至不确定MT5是否打算完全取代MT4。

总之,关于新版本,Metaquotes说它将在ex4层面向后兼容,但在mq4层面并不真正兼容。

与当前的.ex4指标、脚本和EA的兼容性不仅仅是语言的问题,还涉及到终端和工作方式的变化。 例如,策略测试器 的变化可能会破坏主要用于策略测试器的EA,而同样的EA在实时图表上可以正常工作,但它不再能发挥其主要功能。
 
angevoyageur:

据我所知,MT3的代码不能在MT4上运行,其语言非常不同。关于MT4/MT5的争论是无止境的,有很多因素导致了MT4的生存,我甚至不确定MT5是否打算完全取代MT4。

总之,关于新版本,Metaquotes说它将在ex4层面向后兼容,但在mq4层面并不真正兼容。

在我看来,它应该是在mq4层面向后兼容的,包含的自定义指标 是原始的mql4版本,只是改变了init()函数的名称,它们在新的编译器中编译并在新的终端上运行,这意味着我们仍然可以使用IndicatorCounted()编码指标,如果我们想...

init()现在被称为int OnInit(void),它确实返回(INIT_SUCCEEDED)。

 
SDC:

在我看来,它应该是在mq4层面上可以向后兼容的,包括的自定义指标是原始的mql4版本,只是改变了init()函数的名称,它们在新的编译器中编译并在新的终端上运行,这意味着我们仍然可以使用IndicatorCounted()来编写指标,如果我们想...

init()现在被称为int OnInit(void),它确实返回(INIT_SUCCEEDED)。

很抱歉,它不会向后兼容mq4级别,见第一个测试版的公告。

与旧的MQL4版本的不同之处。

  • 改变了AND/OR逻辑操作的优先级。现在,一切都与标准的C/C++相似。

  • 引入了缩短的逻辑表达式的评估。现在,当一个逻辑表达式在达到其终点之前被评估时,其余的后续表达式不会被评估,就像在C/C++中一样。

  • 现在只有整数值被用于开关 运算符。以前可以使用实数值。

  • 在变量名中不能再使用点符号了。另外,'@'、'$'和'?'符号也不能在变量名中使用。

  • 严格了对起始 函数的要求。以前可以在启动函数中设置参数。现在,所有的init、start、deinit、OnInit、OnStart、OnTick、OnTimer 和其他入口点都应该与它们的签名完全一致。

  • 由于关键字的扩展,诸如short、long、float、const、virtual、input、delete、new、do、char 等名称现在不能使用。

  • 现在,导入的dll函数不能接受MQL字符串数组作为参数,就像在MQL5中一样

  • 引入了预定义的 _Period, _Symbol, _LastError, _CriticalError, _StopFlag, _Point, _Digits, _UninitReason, _RandomSeed 变量名称,可能与现有源文件中以相同名称声明的简单变量产生冲突。

  • datetime类型已成为8字节的类型,就像在MQL5中一样。

这些差异并不关键,可以很容易地在代码中得到纠正。作为回报,我们获得了多个MQL5的功能,提高了执行速度,并进行了更严格的质量控制。

这不是很严重的变化,但这意味着没有100%的向后兼容(mq4)。
 
SDC:

...

init()现在被称为int OnInit(void),它确实返回(INIT_SUCCEEDED)。

你可以使用这两个版本。
 

我喜欢metaeditor的新功能

 

我认为当新版本发布时,会给论坛上的新手带来很多困惑,因为新的mql4文档是基于mql5编码的。这意味着在这个论坛和代码库中描述的很多东西都会与mql4文档相矛盾。

从新的mql4文档中设置一个指标缓冲区。(这实际上是有错误的,不会被编译)

#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input bool               AsSeries=true;
input int                period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- indicator buffers
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   if(AsSeries) ArraySetAsSeries(MABuffer,true);
   Print("Indicator buffer is timeseries = ",ArrayGetAsSeries(MABuffer));
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Indicator buffer after SetIndexBuffer() is timeseries = ",
         ArrayGetAsSeries(MABuffer));
   
//--- change the oredr of accessing elements of the indicator buffer
   ArraySetAsSeries(MABuffer,AsSeries);
   
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   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[])
  {
//--- Copy the values of the moving average in the buffer MABuffer
   int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);
 
   Print("MABuffer[0] = ",MABuffer[0]);// Depending on the value AsSeries
                                      // Will receive a very old value
                                      // Or for the current unfinished bar
 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
SDC:

我认为当新版本发布时,会给论坛上的新手带来很多困惑,因为新的mql4文档是基于mql5编码的。这意味着在这个论坛和代码库中描述的很多东西都会与mql4文档相矛盾。

从新的mql4文档中设置一个指标缓冲区。(这实际上是有错误的,不会被编译)

是的,你是对的,这将是一个困难的过渡。然而,我认为这不是对新手 的困难,而是对那些还不了解mql5的mql4程序员的困难。一般来说,新手们不会阅读文档
 

你已经在MQL5中编码了吗,Angevoyageur?