错误、漏洞、问题 - 页 2243

 
Vitaly Murlenko:

mql4指标中的代码停止工作了。我怎样才能修复它?

编辑器说'ObjectSetInteger'--没有一个重载可以应用于函数调用

它已经工作了多年,然后突然停止。不过,这很可惜。


else{// Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger(ChartID(),Open_name,OBJPROP_ARROWCODE,OpenArrowCode);//код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet(Open_name,OBJPROP_COLOR,ObjColor);//цвет стрелки
}

但你为什么要把两种风格混为一谈呢?如果你用第一行来指定箭头代码,那么就用第二行来指定相同的风格。

ObjectSetInteger(0,Open_name,OBJPROP_COLOR,ObjColor); //цвет стрелки
 

试图向市场上传新版本的指标。 测试以错误结束。错误报告如附录中的图片,内容如下。

test on EURUSD,H1 (netting) test on XAUUSD,D1 (netting) test on GBPUSD,M30 (netting) test on EURUSD,M1 (netting) 2016.05.31 21:45:00 Access violation at 0x00007FF7FD1CA04B read to 0xFFFFFFFFFFFFFFFF 2016.05.31 21:45:00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 2016.05.31 21:45:00 00007FF7FD1CA015 53 push rbx 2016。05.31 21:45:00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016。05.31 21:45:00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00007FF7FD1CA033 E88852CAFF call 0x7ff7fce6f2c0 ; #2504(metatester64.exe) 2016.05.31 21:45:00 00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016。05.31 21:45:00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 2016.05.31 21:45:00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
也许问题出在测试器上?
附加的文件:
 
Artyom Trishkin:

只是你为什么要把这两种风格混在一起?如果你用第一行来设置箭头代码,那么就用第二行来设置同样的风格。

谢谢你,这很有帮助。

两种风格?我不知道这些风格。只是以前你只能以这种方式做这一部分。已经有了变化。我使用MQL4编程已经超过10年了。而现在开发者改变了语言,我的许多代码不再工作了。我非常失望。这些变化并不是为了更好的发展。这意味着我必须重做大量的代码。尽管它们是旧的,但它们被大量使用。

 
Gennadiy Stanilevych:

试图向市场上传新版本的指标。 测试以错误结束。如附录中图片所示的错误报告,内容如下。

也许问题出在测试器上?

请向servicedesk提出请求,我们会解决这个问题。


UPD: 找到了你的请求。
 
Artyom Trishkin:

释放任何动态数组的缓冲区,并将零维的大小设为0。

当编写脚本和指标时,可能很少需要使用ArrayFree()函数,因为所有使用过的内存都会被立即释放,在自定义指标 中,对数组的主要工作表现为对指标缓冲区的访问,其大小由终端的执行子系统自动管理。

如果你在程序中需要在复杂的动态条件下管理内存,ArrayFree()函数将允许你明确地立即释放不再需要的动态数组所占用的内存

你看到了吗?没有必要。

自然,一旦内存被释放出来,然后你通过给数组分配一个大小来再次分配它,没有人能够保证它的内容。

使用数组初始化:ArrayInitialize()

你是什么意思,没有人保证内容?如果记忆被释放了,它就消失了,那么你怎么能把垃圾放进去呢?还是说清除内存意味着允许该内存被程序的另一部分使用,而不是真正的清除?

 
Aleksey Vyazmikin:

你说没有人保证内容是什么意思?如果记忆已经被清除,它就不再存在,那么它怎么会有垃圾在里面呢?还是说清除内存意味着允许该内存被程序的另一部分使用,而不是真正的清除?

ArrayResize没有清理内存,这就是为什么它包含垃圾,来自之前的 "消费者"。

这样做是为了提高速度,因为在为数组分配内存 后,在99.99(9)%的情况下,用户会用他的数据来 "填充 "它。


 
Vitaly Murlenko:

谢谢你,这很有帮助。

两种风格?我不知道这些风格。只是以前你只能以这种方式做这一部分。已经有了变化。我使用MQL4编程已经超过10年了。而现在开发者改变了语言,我的许多代码不再工作了。我非常失望。这些变化并不是为了更好的发展。这意味着我必须重做大量的代码。它们可能是旧的,但它们有一整车的用途。

在mql4 ObjectSetXXX-function被引入之前,箭头代码不就是这样设置的吗?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

我也用mql写了大约10年(也许更久--时间过得真快......)--我开始忘记严格意义上的四元函数--我尽可能地写多平台代码。

 
Ilyas:

ArrayResize并没有清除内存,这就是为什么它包含了前一个 "消费者 "的垃圾。

这样做是为了提高速度,因为在向数组分配内存 后,在99.99(9)%的情况下,用户会用他的数据来 "填充 "它。


那么为什么数值是 "垃圾 "常量,甚至在重启终端后也是如此?

就我个人而言,我被简单地将另一个数组中的单元格内容相加所困扰,我为这个问题困惑了很久。

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

那么为什么数值是 "垃圾 "常量,甚至在重启终端后也是如此?

就我个人而言,我在对另一个数组的单元格内容进行简单求和时被烧伤了,我想了很久都不知道哪里出了问题。

未初始化的数组中包含什么样的数据并不重要,在任何时候,数据都可能发生变化,没有人保证其价值。
这就是为什么使用未初始化的变量(读取内存)有时会导致需要很长时间才能找到原因的情况。

  1. 在一台电脑上工作,在另一台电脑上不工作
  2. 在终端工作,在测试器中不工作
  3. 终端/操作系统更新,程序表现不同
  4. 增加了打印停止工作。
  5. 等。

我只能给出一些建议。
你应该养成总是初始化数据的习惯,这样将来你就不会浪费大量的时间去寻找与缺乏初始化有关的错误。

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

你说没有人保证内容是什么意思?如果记忆已经被清除,它就不再存在,那么它怎么会有垃圾在里面呢?还是说清除内存意味着允许该内存被程序的另一部分使用,而不是真正的清除?

你说 "不 "是什么意思?你不从主板插槽中取出内存条。而如果内存存在并被释放(不是用一个值初始化,而是被释放),那么它就被用于其他程序的需要。

原因: