错误、漏洞、问题 - 页 2654

 

谁能就以下问题给我们指点一下。

有一个用C#写的dll,但被编译了。

- 用于MT5通常的C#项目 - Net Framework dll - 64位

- MT4 - Net Framework dll - 32位,但用管理的C语言调用包装。

来源dll是100%相同的,当然除了MT4包装器。

操作系统 Win10-64

那么,问题是为什么MT4的调用功能 正好快4倍,数字是大约100 000 dll调用MT4为7.5秒,MT5为30秒。

 
Igor Makanu:

谁能就以下问题给我们指点一下。

有一个用C#写的dll,但被编译了。

- 用于MT5通常的C#项目 - Net Framework dll - 64位

- MT4 - Net Framework dll - 32位,但被管理的C语言调用所包裹。

来源dll是100%相同的,当然除了MT4包装器。

操作系统 Win10-64

那么,问题是为什么MT4的调用功能 正好快4倍,数字是大约100 000 dll调用MT4为7.5秒,MT5为30秒。

IMHO。一种情况是C-runtime,另一种情况是虚拟机。

 
错过了论坛上的一个新功能,其中的名字,姓氏,日期和旁边的按钮翻译,数字 - 1 2 3 ,不是每个人都有,昨天我想我没有,为什么不是所有的,和页面的定义是什么?
 

专家顾问中实现了一个图形界面。还实现了用户事件(如GUI变化事件)。我在真实数据上进行调试(F5)。只要我在一个用户事件上设置一个断点--调试器就会停止,但随后按F5(继续调试)并不会导致GUI本身的变化。问题:应该是这样的,还是这是一个调试器的错误?

如果我删除断点(调试继续)--GUI的变化是正常的。

MT5,构建2340。

 
Vladimir Simakov:

IMHO。一种情况是C-runtime,另一种情况是虚拟机。

两个dll中都有一个虚拟的.Net。

我发现了代码中的差异,我甚至把32位基类扔到了一个单独的线程中,因为它没有其他的工作方式。

我对MT5做了同样的操作,结果大致相同(各做了三次测试)。

MT5: cycle 100000 , time 8.482981 sec , cycle 100000 , time 8.638789 sec , cycle 100000 , time 8.390046 sec

MT4: cycle 100000 , time 7.128857 sec , cycle 100000 , time 7.176361 sec , cycle 100000 , time 7.205439 sec


好吧,让我们假设这是微软的某种烈酒
 

问候!祝所有的人节日快乐 !!!!
我不明白在测试器中,股权的 "之 "字形显示是什么奇怪的错误。 我不明白在测试器中,股票显示呈之字形的奇怪错误。如果我把 "结算方式 "的设置从 "交换股票 "改为 "外汇",股权就会正常显示。几年前我也有过同样的经历,我想尝试将MT5连接到一个基金,测试了一下,害怕了,放弃了。现在我又试了一次,结果是一样的。这很奇怪吗?

 
为什么不可能实现一个具有 "通用 "参数的函数,它可以传递任何变量,而不管其 "来源 "如何:lvalue、rvalue、literal或临时变量?
对于 "类型化 "容器类的方法来说,这个问题是可以解决的,但对于普通的函数来说是无法解决的。

主要的矛盾是,对于传输结构,有必要使用引用传输,而对于字词和临时变量--用值传输。
结果,我们得到一个正常lvalue类型的编译错误,因为两个重载函数都适合调用。
作为一个部分解决方案,而且只针对 "原始 "类型,你可以建立12个重载函数。
#define  CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
但是,如果一个函数要接受两个 "通用 "参数,那么只需要144个重载函数来实现它,而在有三个这样的参数的情况下,则需要整个1728个重载函数。


建议。
最后允许用户将字面意义和临时变量作为const ref函数参数 传递。
让它成为一个独立的#指令--无论如何...
 

模板函数/类缓存操作中的缺陷。
( MT5(build 2340)没有修复)**未定义行为,你创建了一个内部类型为 "C "的复杂包装对象,几次后发现它是一个完全不同的数据类型,也许是 "B",也许是 "int",随你怎么想......
( MT5(build 2340)没有修复)* 编译错误,传递函数指针作为const ref模板参数的错误。
(未 被MT5(build 2340)修复) * 编译错误,B<int>对象可以在B<void*>类对象之后创建,但如果在之前创建,会发生编译错误。


模板功能/类工作中的缺陷。
( MT5(build 2340)没有修复)** 编译错误,模板函数中的错误,在显式类型转换 操作中传递的指针表现得像一个类,否则像一个指针。
( MT5(build 2340)没有修复)** 编译错误,使用内部类时模板类代码生成的错误。
( MT5(build 2340)没有修复)** 编译错误,试图为模板函数的模板参数访问内部类时出现错误。
( MT5(build 2340)没有修复)** 编译错误,模板方法/类生成时的错误,模板参数的 "自动替换 "过程超出了范围,进入了主程序代码。
( MT5(build 2340)没有修复)* 编译错误,模板类作为模板方法的返回值时,模板类不能自动生成代码的错误。
( MT5(build 2340)没有修复)* 编译错误,内部类定义中的错误--在指定基类时,没有可能明确引用全局命名空间。


与C++相比,MQL中重载函数调用的缺陷是优先级不匹配。
( MT5(build 2340)没有修复)*** 当有类的继承性A <= B <= C <= D,并且实现了两个重载函数,例如,一个有参数A*,一个有参数B*,那么在MQL中传递这样的函数一个对象C*或D*会导致编译错误 "对重载函数的模糊调用"。
( MT5(build 2340)没有修复)** 运行时,重载模板函数调用的优先级不匹配。



建议。
link- 关于允许字面和临时变量作为const ref函数参数传递。
link- 当在项目标签中移动 项目文件 时,对于在ME标签中打开的移动文件,要自动更新它们的位置路径。
link- 在MQL中引入typedef声明功能。
链接- 关于提供强制生成默认复制构造函数和赋值运算符的可能性。


 

我在寻求帮助,我完全不在状态。

OnChartEvent 中,通过按`C`我取消/恢复了价格图表。

一切都会很好,但如果键盘布局没有选择英语,就无法工作。


如何使按下 "C "的检测与所选择的布局无关?

 
fxsaber:

我在寻求帮助,我完全不在状态。

在OnChartEvent中,通过按`C`我取消/恢复了价格图表。

一切都会很好,但如果键盘布局没有选择英语,就无法工作。


如何使按下 "C "的检测与选定的布局无关?

需要检查lparam

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

对于ru和en键盘布局(包括小写和大写),lparam将是67。

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'