错误、漏洞、问题 - 页 561 1...554555556557558559560561562563564565566567568...3184 新评论 Alexey 2011.11.06 13:03 #5601 ArrayInitialize 不工作的代码附在后面,如果我们解开循环,一切正常。而当在类中声明变量和在全局层面上声明相同名称的指标时,就会弹出警告。#property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot Line1 #property indicator_label1 "Line1" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Line2 #property indicator_label2 "Line2" #property indicator_type2 DRAW_LINE #property indicator_color2 clrBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- indicator buffers double Line1Buffer[]; double Line2Buffer[]; //+------------------------------------------------------------------+ int OnInit() { SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA); SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA); ArraySetAsSeries(Line1Buffer,true) ; ArraySetAsSeries(Line2Buffer,true) ; ArrayInitialize(Line1Buffer,EMPTY_VALUE) ; ArrayInitialize(Line2Buffer,EMPTY_VALUE); return(0); } //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { ArraySetAsSeries(price,true) ; int i ; /* for(i=0; i<rates_total;i++) { Line1Buffer[i]=EMPTY_VALUE; Line2Buffer[i]=EMPTY_VALUE ; }*/ for(i=0;i<100;i++) { Line1Buffer[i]=price[i] ; } return(rates_total); } //+------------------------------------------------------------------+ x572intraday 2011.11.07 03:46 #5602 周末,在没有刻度的情况下,我在模拟账户上调试了该指标,在MT5终端的两个实例中运行,但来自不同公司:MetaQuotes和EGlobal。各地的设置都是一样的。为了确定,我进行了离线检查,因此排除了勾股因素。问题是,最简单的 "欠指标 "代码(更不用说成熟的、更复杂的指标)在不同公司的不同终端显示不同数量的结果。#property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 double Buffer[]; int handle; int OnInit() { SetIndexBuffer(0,Buffer,INDICATOR_DATA); handle=iFractals(_Symbol,PERIOD_CURRENT); if(handle==INVALID_HANDLE) return(-1); return(0); } 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[]) { Print(1); return(rates_total); } 1.EGlobal。2.MetaQuotes。我完全卸载了这两个终端(用任务管理器按内存进程检查),再次加载它们并重新编译这两个代码,以防万一。最后--没有变化。 Loky 2011.11.07 06:36 #5603 这并不奇怪,这就是它应该有的样子。 Andrey Dik 2011.11.07 19:16 #5604 MathRound() 在4和5中的工作方式不同,应该是一样的。4p的代码。int start() { double minlot=0.01; double step =0.01; Print(minlot+step*MathRound((0.005 - minlot)/step)); return(0); }5秒代码。void OnStart() { double minlot=0.01; double step =0.01; Print(minlot+step*MathRound((0.005 - minlot)/step)); } Mykola Demko 2011.11.07 20:27 #5605 joo:MathRound()在4和5中的工作方式不同,应该是一样的。4秒代码。5秒代码。问题出在这里。 double y=MathRound(-0.5); Print("Округление -0.5 до ",y);这个值在4和5中的四舍五入是不同的。 x572intraday 2011.11.07 20:53 #5606 Loky: 这一点并不奇怪,这就是它应该有的样子。 而更具体的是? idispatch 2011.11.08 11:39 #5607 为什么MT5在测试中断时不保存订单历史 等?在MT4中,它被保存。另外,从测试图表上看,订单历史中没有定位--通过点击图表查看大面积缩水区域的订单很方便。 Михаил Янович 2011.11.08 22:41 #5608 晚上好。你能解释一下吗,SLeep()方法是如何工作的?它应该在一定时间内暂停专家顾问,还是我错了?{for (int sleep=0;sleep<10000;sleep++)如果(BarsCalculated(Handle)>=o_bars_reoptimizate){ Print(BarsCalculated(Handle)); break; }else Sleep(100);}对于这段代码,我期望的结果是--如果某个指标的计算条数大于某个值,循环就会被打破;否则,在进一步的代码执行中会有100ms的延迟。可能的总延迟是100*10000ms....,这足够计算指标的时间了。那么,为什么代码继续运行呢? (它遵循这个循环)或者在测试器中,这个功能并不像我假设的那样工作。提前感谢您的澄清。 Sergey Gritsay 2011.11.09 06:50 #5609 mi__x__an:晚上好。你能解释一下吗,SLeep()方法是如何工作的?它应该在一定时间内暂停专家顾问,还是我错了?{for (int sleep=0;sleep<10000;sleep++)如果(BarsCalculated(Handle)>=o_bars_reoptimizate){ Print(BarsCalculated(Handle)); break; }else Sleep(100);}对于这段代码,我期望的结果是--如果某个指标的计算条数大于某个值,循环就会被打破;否则,在进一步的代码执行中会有100ms的延迟。可能的总延迟是100*10000ms....,这足够计算指标的时间了。那么,为什么代码继续运行呢? (它遵循这个循环)或者在测试器中,这个功能并不像我假设的那样工作。提前感谢您的澄清。睡眠 在指标中不起作用 x572intraday 2011.11.09 06:51 #5610 例如,文档中的CopyBuffer 导致大脑震荡:"如果你想对指标值进行部分复制到另一个数组(不是指标缓冲区),你应该为此使用中间数组,在其中复制所需的值。并且已经从这个中间数组中执行逐个元素复制所需数量的值到接收数组的正确位置。"int CopyBuffer( int indicator_handle, // handle индикатора int buffer_num, // номер буфера индикатора [...] ); 如果buffer_num 被明确提及,当然意味着 必须通过SetIndexBuffer 将接收数组与一个或另一个序列号的指示器缓冲区初步绑定。但是,"如果我们想把指标的一些值复制到另一个数组(不是指标缓冲区)",我们不能谈论buffer_num,因为它不是指标,而且根据定义我们还没有把它和任何东西连接起来。矛盾?含糊不清?或者,也许我完全是程序化的?我试图找到指标缓冲区的明确定义,但没有成功。真的是通过SetIndexBuffer 链接的任何缓冲区吗,还是不够,它应该是一个带有INDICATOR_DATA 标识符的数组? 1...554555556557558559560561562563564565566567568...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
ArrayInitialize 不工作的代码附在后面,如果我们解开循环,一切正常。
而当在类中声明变量和在全局层面上声明相同名称的指标时,就会弹出警告。
周末,在没有刻度的情况下,我在模拟账户上调试了该指标,在MT5终端的两个实例中运行,但来自不同公司:MetaQuotes和EGlobal。各地的设置都是一样的。为了确定,我进行了离线检查,因此排除了勾股因素。
问题是,最简单的 "欠指标 "代码(更不用说成熟的、更复杂的指标)在不同公司的不同终端显示不同数量的结果。
1.EGlobal。2.MetaQuotes。![荣格全球 荣格全球](https://c.mql5.com/3/6/EGlobal.PNG)
![MetaQuotes MetaQuotes](https://c.mql5.com/3/6/MetaQuotes.PNG)
我完全卸载了这两个终端(用任务管理器按内存进程检查),再次加载它们并重新编译这两个代码,以防万一。最后--没有变化。
MathRound() 在4和5中的工作方式不同,应该是一样的。
4p的代码。
5秒代码。
MathRound()在4和5中的工作方式不同,应该是一样的。
4秒代码。
5秒代码。
问题出在这里。
这个值在4和5中的四舍五入是不同的。
这一点并不奇怪,这就是它应该有的样子。
为什么MT5在测试中断时不保存订单历史 等?在MT4中,它被保存。
另外,从测试图表上看,订单历史中没有定位--通过点击图表查看大面积缩水区域的订单很方便。
晚上好。
你能解释一下吗,SLeep()方法是如何工作的?
它应该在一定时间内暂停专家顾问,还是我错了?
{for (int sleep=0;sleep<10000;sleep++)
如果(BarsCalculated(Handle)>=o_bars_reoptimizate)
{ Print(BarsCalculated(Handle)); break; }else Sleep(100);}
对于这段代码,我期望的结果是--如果某个指标的计算条数大于某个值,循环就会被打破;否则,在进一步的代码执行中会有100ms的延迟。可能的总延迟是100*10000ms....,这足够计算指标的时间了。那么,为什么代码继续运行呢? (它遵循这个循环)或者在测试器中,这个功能并不像我假设的那样工作。提前感谢您的澄清。
晚上好。
你能解释一下吗,SLeep()方法是如何工作的?
它应该在一定时间内暂停专家顾问,还是我错了?
{for (int sleep=0;sleep<10000;sleep++)
如果(BarsCalculated(Handle)>=o_bars_reoptimizate)
{ Print(BarsCalculated(Handle)); break; }else Sleep(100);}
对于这段代码,我期望的结果是--如果某个指标的计算条数大于某个值,循环就会被打破;否则,在进一步的代码执行中会有100ms的延迟。可能的总延迟是100*10000ms....,这足够计算指标的时间了。那么,为什么代码继续运行呢? (它遵循这个循环)或者在测试器中,这个功能并不像我假设的那样工作。提前感谢您的澄清。
例如,文档中的CopyBuffer 导致大脑震荡:"如果你想对指标值进行部分复制到另一个数组(不是指标缓冲区),你应该为此使用中间数组,在其中复制所需的值。并且已经从这个中间数组中执行逐个元素复制所需数量的值到接收数组的正确位置。"
如果buffer_num 被明确提及,当然意味着 必须通过SetIndexBuffer 将接收数组与一个或另一个序列号的指示器缓冲区初步绑定。但是,"如果我们想把指标的一些值复制到另一个数组(不是指标缓冲区)",我们不能谈论buffer_num,因为它不是指标,而且根据定义我们还没有把它和任何东西连接起来。
矛盾?
含糊不清?
或者,也许我完全是程序化的?
我试图找到指标缓冲区的明确定义,但没有成功。真的是通过SetIndexBuffer 链接的任何缓冲区吗,还是不够,它应该是一个带有INDICATOR_DATA 标识符的数组?