资料库: TimeSeries - 处理时间序列的函数库 - 页 2

 

一般来说,我对这种事态发展持双重态度。

一方面,一个人辛辛苦苦,无怨无悔地发帖、 赞扬和尊重.

另一方面,有必要让拉布霍夫斯愚蠢地将代码从 MT4 移植到 MT5。"愚蠢 "的意思是不去研究语言的可能性,也不深入研究策略本身。

顺便说一句,我自己现在也在这样做:)所以批评是针对我的。

我将尝试阐述 MQL5 的愚蠢和可能性。

以一个简单的函数 iClose 为例,在 MT4 中不可能一次性获取整个时间序列(只能逐个获取),而在 MT5 中,它被优化为复制一个值与复制整个序列之间没有区别(有点夸张,但几乎如此)。因此,通常需要相当多的时间来组织数据将被复制到的数组,所以逐个接收关闭数据毫无意义。此外,这些系列默认情况下已经存在于指标中。因此,在移植时,将代码分为计算代码(复制到指标中)和交易代码(在智能交易系统中执行)是合理的。

我的意思是,一方面,这样的代码对初学者很有用,可以让他们更容易掌握。

另一方面,它设定了错误的编程标准,即通过 G 编程。

顺便说一句,这里还有一个功能供 includnik 使用:

// 它在斜面上
MqlTick last_tick;
#define Ask last_tick.ask
#define Bid last_tick.bid
// 它在 OnTick 中
SymbolInfoTick(_Symbol,last_tick);
// 现在你可以在任何地方使用它
 Ask; // и
 Bid;
 

这是给你的进一步完善。

但最好还是在标准圣经的基础上重写一切。

附加的文件:
 
对不起,是否有不正确的代码?从 MQL4 迁移到 MQL5
 
BoraBo:
对不起,这里的代码不正确吗?从 MQL4 切换到 MQL5。

为什么不正确,它是正确的(我从那里复制了一些代码)、

但那里没有代码,只有枚举是坏的,其他的都在文章中。

+ 我把 OrderSend 移植到了那里,我认为大部分问题都与设置订单有关。

顺便说一下,还有很多东西没有解决,例如,整个交易功能并没有被破坏(我只做了 OrderSend 和 OrderClose)。

因此,对于爱好者来说,还有开发的空间。

 
Urain:

只是文章中的代码和这个库中的代码几乎完全相同,我想可能是文章中的某些地方出错了。

 
BoraBo:

只是文章中的代码和这个库中的代码几乎完全相同,我想可能是文章中的某些地方出错了。

但为什么要发明自行车呢?我复制了已有的代码,进行了编辑,然后添加了我自己的代码。

瞧,一切正常。

这就是为什么要发布源代码,以便其他人可以使用。

否则,每个程序员还是会用汇编语言编写程序。

[删除]  
komposter:

当我拿到所有必要的功能(包括虚拟交易的会计)时,我很乐意将它们做成类似功能。

现在我需要这些功能,却找不到现成的库。所以我不得不自己做一个。

我已经使用我的库大约三年了,不断对它进行改进。一切都像瑞士手表一样好用。

您提出了一些有趣的观点,我将考虑如何实现。

 
Interesting:

您发现了一些有趣的地方,我们将考虑如何实现。

你能从代码中告诉我你发现了哪些有趣的地方吗?
[删除]  
sergeev:
关于代码的提示,你发现了哪些有趣的地方?

有些地方比我的更简单、更实用。我没有在某些地方设置错误检查。

我的代码有时要大 3-4 倍。

PS

不过,在我看来,我的代码更符合 MQL4(可能还有其他变体)。

[删除]  

作为iHighest 和 iOpen 的示例(首次实施

//Function iHighest
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) export 
//Returns the shift of the maximum value over a specific number of periods depending on type. 
{
//----------------------------------------------------------------------------//
//工作变量
ENUM_TIMEFRAMES TF; //Period as ENUM_TIMEFRAMES

double Arr[];
long Volume[];
datetime Time[];

int Result = -1; //Returned importance
//----------------------------------------------------------------------------//

TF = MinuteToPeriod(timeframe);

  if(start<0)  start = 0;
  if(count<=0) count = Bars(symbol,TF);
//MODE_OPEN
  if(type==MODE_OPEN)
  {
  ArraySetAsSeries(Arr,true);

  CopyOpen(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_LOW
  if(type==MODE_LOW)
  {
  ArraySetAsSeries(Arr,true);

  CopyLow(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_HIGH
  if(type==MODE_HIGH)
  {
  ArraySetAsSeries(Arr,true);

  CopyHigh(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_CLOSE
  if(type==MODE_CLOSE)
  {
  ArraySetAsSeries(Arr,true);

  CopyClose(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_VOLUME
  if(type==MODE_VOLUME)
  {
  ArraySetAsSeries(Volume,true);

  CopyTickVolume(symbol,TF,start,count,Volume);

  Result = ArrayMaximum(Volume,0,count) + start;
  }
//MODE_TIME
  if(type==MODE_TIME)
  {
  ArraySetAsSeries(Time,true);

  CopyTime(symbol,TF,start,count,Time);

  Result = ArrayMaximum(Time,0,count) + start;
  }
//检查是否存在错误 
  if(GetLastError()!=0)
  {
  Result = -1; //错误信息
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
//Function iOpen
double iOpen(string symbol, int timeframe, int shift) export 
//Returns Open value for the bar of indicated symbol with timeframe and shift.
// 如果本地历史记录为空(未加载),函数返回 0。
//对于当前图表,开盘价信息位于名为 Open[] 的预定义数组中。 
{
//----------------------------------------------------------------------------//
//工作变量
ENUM_TIMEFRAMES TF; //Period as ENUM_TIMEFRAMES

double Arr[];

double Result = 0; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

  if(shift>=0)
  {
  TF = MinuteToPeriod(timeframe);

  CopyOpen(symbol,TF,0,Bars(symbol,TF),Arr);
  
    if(ArraySize(Arr)>0)
    {
    ArraySetAsSeries(Arr,true);
    Result = Arr[shift];
    } 

  }
//检查是否存在错误 
  if(GetLastError()!=0)
  {
  Result = 0; //错误信息
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}