文章 "从 MQL4 迁移到 MQL5" - 页 4

 
Interesting :

我开始对这个设计的功能产生了很大的怀疑。无论我如何努力去理解这个区块的逻辑,我都无法理解(我也很努力)....。

怀疑什么?它算对了。

//+------------------------------------------------------------------+
//|测试。mq5
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
 
DC2008 :

有什么问题吗?他算得没错。

现在开始耍花招


1.在 MT4 中,我们写下这一行并在 H4 上执行代码

Print(iBarShift(Symbol(),Period(),1274356800,false)); //日期 20.05.2010 12:00 pm

然后在 MT5 和字符串中做同样的操作。

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

结果得到 8。


2.然后,我们在 D1 上执行完全相同的操作。

结果 MT4 返回 -1,MT5 返回 0。

现在谁能告诉我iBarShiftMQL4 的实现与必要的...

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

试试这个:

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

再说一遍,你读过你所写的功能吗?

在 mcl4 上写得很清楚

double iClose( string symbol, int timeframe, int shift)
shift 参数指定的相应图表(符号时间框架)中返回条形图的收盘价。如果出现错误,函数返回 0。要获取更多错误信息,请调用 GetLastError() 函数。
对于当前图表,收盘价信息在预定义的Close[] 数组中。

您有....

return(-1);

版主在看什么?

 

感谢 CoreWinTT。

修正了以下函数:iClose、iLow、iHigh、iOpen、iTime、iVolume。如果出现错误,它们将返回 0 而不是 -1。

 

它们什么时候会出现在图书馆?

这样他们至少

因为如果你打开它,问题就出现了,而上述书面???? 的含义。

并至少收集所有问题都已解决的函数,并着手研究其余函数中的错误。

 
bool  SetIndexBuffer(
   int                    index,         // 缓冲区索引
   double                 buffer[],      // 数组
   ENUM_INDEXBUFFER_TYPE  data_type      // 我们要存储的内容
   );

前几天,有人提出了一种创建 μl4 环境的巧妙方法

数组。

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[])

的数组来创建一个 μl4 环境,但由于这些数组具有常量状态,因此很难使用它们。

您无法创建全局缓冲区

因为它们必须借助

SetIndexBuffer

使用全局 声明的double 类型一维动态数组关联指定的指示器缓冲区。

但只有 double 类型的数组和卷无法通过。

剩下的唯一办法就是在 mql4 模块中启动这些数组。

这实际上等同于重写 indicator....

 
CoreWinTT:

它们什么时候会出现在图书馆里?

已经有了。
 
它是空的,也曾是空的,只有一堆定义,再无其他....
 
CoreWinTT:

它们什么时候会出现在图书馆?

这样他们至少

因为如果你打开它,问题就出现了,而上述书面???? 的含义。

并至少收集所有问题都已解决的函数,并着手研究其余函数中的错误。

长期以来,在私人图书馆中有很多关于这一主题的解决方案。

例如,我从一开始就使用 IsTesting() 和类似的东西,而且很长时间以来,所有问题都是用日期和时间解决的(当然,还有其他解决方案)....。

另外,MT5 本身也存在此类 "过时解决方案"...