错误、漏洞、问题 - 页 2676

 
Sergey Dzyublik:

MT5 (build 2347)如果事先为它们预留了内存,为什么使用ArrayResize一次向数组添加一个元素时有这么大的开销?

请考虑用ArrayResize改进内部保留算法。

例如,对于类,我们可以假设它们除了构造函数调用之外,还执行某种 "列表中的内部注册"。
而在用ArrayResize保留的框架内,除了直接分配内存之外,你可以尝试优化这个过程。
- 从相邻的创建元素中获取数据(例如,指向虚拟函数 表的指针)。
- 预先执行或为尚未创建的班级的 "内部注册 "保留空间。

谢谢你的留言。

ArrayResize代码受到保护,不会被空调用(当元素的数量没有变化时),所以函数代码不工作。

而元素数量的实际变化会触发ArrayResize函数的一个或另一个部分,这取决于数组的


感谢你提供的代码,我能够将ArrayResize的一个部分的复杂性降低到零,这将加快对象数组的函数的速度
 
Ilyas:

你能告诉我如何减少终端的内存消耗吗?当我运行一个EA时,我要求有几百万点。我在他们身上进行计算,不再需要他们了。我只用tick函数来加载新的ticks,所以没有空隙。


因为这一百万次点击,终端消耗了500Mb的内存,而且不急于释放它。更确切地说,它根本没有释放它。是否有可能强制终端清除其所有的缓存以减少消耗?对于VPS来说,每个终端0.5GB是太多了。

 
fxsaber:

你能告诉我如何减少终端的内存消耗吗?当我运行一个EA时,我要求有几百万个ticks。我在他们身上进行计算,不再需要他们了。我只用tick函数来加载新的ticks,所以没有空隙。


因为这一百万次点击,终端消耗了500Mb的内存,而且不急于释放它。更确切地说,它根本没有释放它。是否有可能强制终端清除其所有的缓存以减少消耗?对于VPS来说,每个终端0.5GB是太多了。

ArrayFree

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

Документация по MQL5: Операции с массивами / ArrayFree
Документация по MQL5: Операции с массивами / ArrayFree
  • www.mql5.com
//| Класс диалога для работы с памятью                               | //| Освобождение памяти текущего массива                             | //| Попытка добавления памяти для текущего массива                   | //| Обработка событий                                                |...
 
Slava:

ArrayFree

当然,是免费的。终端本身在其缓存中存储了刻度,在操作过程中我不需要这些刻度。

对我来说,最好是在冷的时候再养这些虱子。我需要一个机制来 "冷却 "终端。

 

你好,遇到了一个问题,测试器中的CopyTicks和CopyTicksRange不能从其他工具中获取数据...当添加到图表中时,一切都在运作。

建于2363年(和2361年一样)。

我可能犯了一个错误?请帮助,谢谢!

#property copyright "Copyright 2020, LittleBitTime"
#property link      "https://login.mql5.com/ru/users/LittleBitTime"
#property version   "1.00"

int OnInit() {
   return INIT_SUCCEEDED;
}

void OnDeinit(const int reason) {
}

void OnTick() {
   MqlTick LastTick;
   if (SymbolInfoTick(Symbol(), LastTick)) {
      //Print("START");
      
      if (GetTicks("RTS-3.20", LastTick.time_msc) && GetTicks("RTS-6.20", LastTick.time_msc)) {
         Print("История загружена");
      } else {
         Print("Ошибка загрузки истории");
      }
      //Print("END");
   } else {
      Print("Ошибка получения последнего тика, для получения последнего известного времени");
   }
}

bool GetTicks(string symbol, ulong TimeEnd) {
   ulong TimeStartPeriod = TimeEnd-(60*1000);
   
   MqlTick ticks[];
   bool success = false; //флаг успешного выполнения копирования тиков
   uint start = GetTickCount(); //замерим время старта перед получением тиков
   
   int received = CopyTicksRange(symbol, ticks, COPY_TICKS_ALL, TimeStartPeriod, TimeEnd);
   if (received != -1) {
      //выведем информацию о количестве тиков и затраченном времени времени
      PrintFormat("%s: received %d ticks in %d ms", symbol, received, GetTickCount()-start);
      //если тиковая история синхронизирована, то код ошибки равен нулю
      if (GetLastError() == 0)
         success = true;
      else
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", symbol, received, GetTickCount()-start, _LastError);
   }
   
   if (!success) {
      PrintFormat("Ошибкаp загрузки тиков! " + symbol);
      
      return false;
   }
   
   
   return true;
}
附加的文件:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime:

你好,遇到了一个问题,测试器中的CopyTicks和CopyTicksRange不能从其他工具中获取数据...当添加到图表中时,一切都在运作。

建于2363年(和2361年一样)。

我可能犯了一个错误?请帮助,谢谢!

CopyTicks在测试器中不启动数据上传

首先要求所需仪器的CopyRates。至少1巴。然后将进行抽水和生成蜱虫 序列。

之后,悄悄地要求滴答

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 
Ilyas:

谢谢你的留言。
ArrayResize代码对空调用有保护作用(当元素数量没有变化时),所以该函数代码不起作用。
而元素数量的实际变化,会触发ArrayResize函数的一个或另一个部分,这取决于阵列的

感谢你提供的代码,我成功地将ArrayResize的一个部分的复杂性降低到零,这将加速对象数组的功能

下午好,非常感谢你。
我以前没有用过new操作符,因为从逻辑上讲,它应该比保留内存的ArrayResize要慢。
但我对获得的结果印象深刻,事实证明,反之亦然,通过new运算符的本地数组更快。

MT5(build 2363)。

#define  K 1000
#define  M (1000 * K)

#define    SpeedTest(test_count,msg,EX)        {uint mss=GetTickCount(); ulong count=test_count;for(ulong ii=0;ii<count&&!_StopFlag;ii++){EX;} \
                                              printf("%-60s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
                                              
class A{
public:
   int data;
};


template<typename T>
void test1(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize all",
   {
      T class_array[];
      ArrayResize(class_array, array_size);
   }
   )
};

template<typename T>
void test2(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize one by one with reserved memory",
   {
      T class_array[];
      ArrayResize(class_array, 1, array_size - 1);
      for(int i = 2; i <= array_size; i++){
         ArrayResize(class_array, i);
      }
   }
   )
};

template<typename T>
void test3(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize one by one with new operator",
   {
      T* class_array[];
      ArrayResize(class_array, array_size);
      for (int i = 0; i < array_size; ++i){
         class_array[i] = new T();
      }
      for (int i = 0; i < array_size; ++i){
         delete class_array[i];
      }
   }
   )
};


void OnStart()
{
  const int test_count = 1*K;
  const int array_size = 25*K;  
  
   printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
   test1<A>(test_count, array_size);              // Avg time: release( 730) / debug( 830)
   test2<A>(test_count, array_size);              // Avg time: release(1540) / debug(1720)
   test3<A>(test_count, array_size);              // Avg time: release(1200) / debug(1470)
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
}
  
 
Slava:

CopyTicks在测试器中不启动数据上传

首先要求所需仪器的CopyRates。至少1巴。然后将进行抽水和生成蜱虫 序列。

之后,悄悄地要求滴答

非常感谢,这很有帮助。我在文档中没有找到...还是我看得不够仔细?在那里写一下也不是什么坏事 :)
 
LittleBitTime:
非常感谢你,这对你有帮助。我在文档中找不到它...还是我搜索得不好?在那里写一下就好了 :)

如果能像CopyRates 那样自动上传,那就更好了。

 

昨天清理了我的个人资料中的 "旧 "不活跃代理人名单

一天后,我去看资料,看到代理人名单已经恢复到被删除的条目。

而代理商的创建和活动的日期已经改变了

有一个假设(可能是错误的),即在cloud.mql5.com 上查看代理统计数据后,列表被恢复了