//Function iHighestint 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_TIMEFRAMESdouble 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_OPENif(type==MODE_OPEN)
{
ArraySetAsSeries(Arr,true);
CopyOpen(symbol,TF,start,count,Arr);
Result = ArrayMaximum(Arr,0,count) + start;
}
//MODE_LOWif(type==MODE_LOW)
{
ArraySetAsSeries(Arr,true);
CopyLow(symbol,TF,start,count,Arr);
Result = ArrayMaximum(Arr,0,count) + start;
}
//MODE_HIGHif(type==MODE_HIGH)
{
ArraySetAsSeries(Arr,true);
CopyHigh(symbol,TF,start,count,Arr);
Result = ArrayMaximum(Arr,0,count) + start;
}
//MODE_CLOSEif(type==MODE_CLOSE)
{
ArraySetAsSeries(Arr,true);
CopyClose(symbol,TF,start,count,Arr);
Result = ArrayMaximum(Arr,0,count) + start;
}
//MODE_VOLUMEif(type==MODE_VOLUME)
{
ArraySetAsSeries(Volume,true);
CopyTickVolume(symbol,TF,start,count,Volume);
Result = ArrayMaximum(Volume,0,count) + start;
}
//MODE_TIMEif(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 iOpendouble 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_TIMEFRAMESdouble 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);
//----------------------------------------------------------------------------//
}
一般来说,我对这种事态发展持双重态度。
一方面,一个人辛辛苦苦,无怨无悔地发帖、 赞扬和尊重.
另一方面,有必要让拉布霍夫斯愚蠢地将代码从 MT4 移植到 MT5。"愚蠢 "的意思是不去研究语言的可能性,也不深入研究策略本身。
顺便说一句,我自己现在也在这样做:)所以批评是针对我的。
我将尝试阐述 MQL5 的愚蠢和可能性。
以一个简单的函数 iClose 为例,在 MT4 中不可能一次性获取整个时间序列(只能逐个获取),而在 MT5 中,它被优化为复制一个值与复制整个序列之间没有区别(有点夸张,但几乎如此)。因此,通常需要相当多的时间来组织数据将被复制到的数组,所以逐个接收关闭数据毫无意义。此外,这些系列默认情况下已经存在于指标中。因此,在移植时,将代码分为计算代码(复制到指标中)和交易代码(在智能交易系统中执行)是合理的。
我的意思是,一方面,这样的代码对初学者很有用,可以让他们更容易掌握。
另一方面,它设定了错误的编程标准,即通过 G 编程。
顺便说一句,这里还有一个功能供 includnik 使用:
这是给你的进一步完善。
但最好还是在标准圣经的基础上重写一切。
对不起,这里的代码不正确吗?从 MQL4 切换到 MQL5。
为什么不正确,它是正确的(我从那里复制了一些代码)、
但那里没有代码,只有枚举是坏的,其他的都在文章中。
+ 我把 OrderSend 移植到了那里,我认为大部分问题都与设置订单有关。
顺便说一下,还有很多东西没有解决,例如,整个交易功能并没有被破坏(我只做了 OrderSend 和 OrderClose)。
因此,对于爱好者来说,还有开发的空间。
只是文章中的代码和这个库中的代码几乎完全相同,我想可能是文章中的某些地方出错了。
只是文章中的代码和这个库中的代码几乎完全相同,我想可能是文章中的某些地方出错了。
但为什么要发明自行车呢?我复制了已有的代码,进行了编辑,然后添加了我自己的代码。
瞧,一切正常。
这就是为什么要发布源代码,以便其他人可以使用。
否则,每个程序员还是会用汇编语言编写程序。
当我拿到所有必要的功能(包括虚拟交易的会计)时,我很乐意将它们做成类似功能。
现在我需要这些功能,却找不到现成的库。所以我不得不自己做一个。
我已经使用我的库大约三年了,不断对它进行改进。一切都像瑞士手表一样好用。
您提出了一些有趣的观点,我将考虑如何实现。
您发现了一些有趣的地方,我们将考虑如何实现。
关于代码的提示,你发现了哪些有趣的地方?
有些地方比我的更简单、更实用。我没有在某些地方设置错误检查。
我的代码有时要大 3-4 倍。
PS
不过,在我看来,我的代码更符合 MQL4(可能还有其他变体)。
作为iHighest 和 iOpen 的示例(首次实施