错误、漏洞、问题 - 页 2677

 
fxsaber:

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

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

没有注意到这一点。

void OnStart()
  {
   Print("используется памяти до закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   MqlTick items[];
   ulong t0=GetMicrosecondCount();
   uint    count=CopyTicks(Symbol(),items,COPY_TICKS_INFO,0,100000000);
   t0=GetMicrosecondCount()-t0;
   Print ("Загружено за "+string(t0/1000)+" миллисекунд "+ (string)count+ " тиков");
   Print("используется памяти после закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   ArrayFree(items);
   Print("используется памяти после ArrayFree: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
  }


SZY 可悲的是,在内存中,ticks是以每个tick 60字节的大小无包装存储的。可以很容易地打包5次(每个tick~12字节)。

 
Stanislav Korotky:

最好是像CopyRates那样进行自动下载。

在这种情况下,时间框架是未知的。下载是由一个周期符号请求发起的。

考虑可以做什么

 
Nikolai Semko:

没有注意到。

你必须看一下终端的消费情况。

void OnStart()
  {
//   Print("используется памяти до закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   Print("используется памяти до закачки истории: "+string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+" Mb");
   MqlTick items[];
   ulong t0=GetMicrosecondCount();
   uint    count=CopyTicks(Symbol(),items,COPY_TICKS_INFO,0,1 e7);
   t0=GetMicrosecondCount()-t0;
   Print ("Загружено за "+string(t0/1000)+" миллисекунд "+ (string)count+ " тиков");
//   Print("используется памяти после закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   Print("используется памяти после закачки истории: "+string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+" Mb");
   ArrayFree(items);
//   Print("используется памяти после ArrayFree: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   Print("используется памяти после ArrayFree: "+string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+" Mb");
  }


其结果是在一个已经运行了很长时间的终端上。没有EA/指示器运行。两张图表,M1栏只显示当年的情况。

используется памяти до закачки истории: 1043 Mb
Загружено за 11223 миллисекунд 10000000 тиков
используется памяти после закачки истории: 1675 Mb
используется памяти после ArrayFree: 1102 Mb

60Mb还没有发布。空终端机的消耗量超过了一千兆字节。减少消耗的唯一方法是重新加载终端。

 
Sergey Dzyublik:

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

MT5(build 2363)。

在测试版2364中发布(不幸的是,它在模板内的new T()有一个编译器错误)。

这里是你的脚本的日志。

2020.03.19 10:39:45.784 Test (EURUSD,H1)        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
2020.03.19 10:39:46.765 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=984
2020.03.19 10:39:48.233 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1469
2020.03.19 10:39:49.944 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
2020.03.19 10:39:50.923 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=969
2020.03.19 10:39:52.392 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1484
2020.03.19 10:39:54.100 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
2020.03.19 10:39:55.079 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=985
2020.03.19 10:39:56.548 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1469
2020.03.19 10:39:58.258 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
2020.03.19 10:39:59.237 Test (EURUSD,H1)        Test Class ArrayResize all                                  : loops=1000 ms=984
2020.03.19 10:40:00.705 Test (EURUSD,H1)        Test Class ArrayResize one by one with reserved memory      : loops=1000 ms=1469
2020.03.19 10:40:02.416 Test (EURUSD,H1)        Test Class ArrayResize one by one with new operator         : loops=1000 ms=1703
你可以看到对象的ArrayResize已经开始快速工作了。

再一次,ArrayResize函数的一个部分的复杂性从对数降低到了零
 
Ilyas:
我们可以看到,现在对象的ArrayResize更快。
我们再一次成功地将ArrayResize函数的一个部分的复杂性从对数降低到零。

我设法比较了ArrayResizeReserve和ArrayOnNew在一个真实项目中的速度,数据类型 是有一个int字段的类,记录数是20M。

在MT5(build 2363)中,除了一个ArrayOnNew之外,所有的参数都比ArrayResizeReserve差。

读/写访问(std::fill_n, std::copy, std::vector::clear): 2-2.5倍
对于 "冷"/"热 "内存一次性创建所有元素(std::vector::resize)--
1.1-1.2倍
对于 "热 "内存逐一创建所有元素(std::vector::push_back)--
1.2倍

 

帮助(编辑)中的这些链接导致了一个找不到的页面


 
MT5错误(build 2363)与C++的模板函数相比,MQL中的模板函数的执行优先级不匹配(在线https://onlinegdb.com/HkNqBDZ88
当第一个 "测试 "函数包含一个
完全专业化的 模板基类作为参数时,问题 就出现了。
而第二个 "测试 "函数重载了第一个,是一个模板函数,并包含一个非专门 的模板基类作为参数。

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   A<B<int>>::test(bb);         //'test' - ambiguous call to overloaded function        
}
 
大家好!!!。问题:我在copyutera上使用两个平台MT4和MT5,MT4连接到信号没有任何问题。但我不能从MT5连接到另一个信号。我有一个账户,资金的流动被显示出来,但是账户中没有账号,我在终端的仪表板上没有信号按钮。我租了一个服务器,vps,我写了我需要迁移,但迁移按钮不起作用。请告诉我为什么。
 
Anna:
大家好!!!。我的问题是:我在我的copyutera上使用两个平台MT4和MT5。 我从MT4连接到信号,没有任何问题。但我不能从MT5连接到另一个信号。我有一个账户,资金的流动被显示出来,但是账户中没有账号,我在终端的仪表板上没有信号按钮。我租了一个服务器,vps,我写了我需要迁移,但迁移按钮不起作用。请告诉我为什么。

MetaTrader 5(用于终端的内置虚拟主机租赁)需要一个64位的操作系统。

 

在Win 10上,有人连接本地代理吗?

试着连接2台电脑,远程代理不断地准备-连接-准备-连接......。没有工作。

我看了一下防火墙,我认为Metatrader代理有一个复选标记,通过文件导出-导入代理,也可以看到端口和PC的名称。

我怀疑我需要在其他地方转发端口?