오류, 버그, 질문 - 페이지 2654

 

누구든지 이것에 대해 밝힐 수 있습니까?

C#으로 작성되었지만 컴파일된 dll이 있습니다.

- MT5의 경우 일반 C# 프로젝트 - Net Framework dll - 64비트

- MT4의 경우 일반 C# 프로젝트 - Net Framework dll - 32비트이지만 관리되는 C 호출로 래핑됨

dll 소스는 물론 MT4용 래퍼를 제외하고는 100% 동일합니다.

OS Win10-64

글쎄요, 질문 자체는 MT4가 함수 호출 을 정확히 4배 더 빠르게 만드는 이유입니다. 숫자는 MT4에서 7.5초, MT5 30초에서 거의 동일한 100,000개의 dll 호출입니다.

 
Igor Makanu :

누구든지 이것에 대해 밝힐 수 있습니까?

C#으로 작성되었지만 컴파일된 dll이 있습니다.

- MT5의 경우 일반 C# 프로젝트 - Net Framework dll - 64비트

- MT4의 경우 일반 C# 프로젝트 - Net Framework dll - 32비트이지만 관리되는 C 호출로 래핑됨

dll 소스는 물론 MT4용 래퍼를 제외하고는 100% 동일합니다.

OS Win10-64

글쎄요, 질문 자체는 MT4가 함수 호출 을 정확히 4배 더 빠르게 만드는 이유입니다. 숫자는 MT4에서 7.5초, MT5 30초에서 거의 동일한 100,000개의 dll 호출입니다.

임호. 한 경우에는 C-런타임, 다른 경우에는 가상 머신.

 
포럼의 혁신을 놓쳤습니다. 이름은 성이고 날짜와 버튼 옆은 번역이고 숫자는 1 2 3이고 모든 사람이 가지고 있지는 않습니다. 어제는 없었던 것 같습니다. 왜 모든 것이 아닙니다. , 그리고 페이지는 무엇에 정의되어 있습니까?
[삭제]  

EA에는 그래픽 인터페이스가 있습니다. 사용자 이벤트 도 구현됩니다(예: 그래픽 인터페이스 변경 이벤트). 실제 데이터에서 디버그합니다(F5). 사용자 이벤트에 중단점을 두는 즉시 디버거가 중지되지만 이후에 F5 키(디버깅 계속)를 눌러도 그래픽 인터페이스 자체가 변경되지는 않습니다. 질문: 이런 식이어야 하나요, 아니면 디버거 버그인가요?

중단점을 제거하면(디버깅 계속) - 그래픽 인터페이스의 변경이 정상적으로 발생합니다.

MT5 빌드 2340.

 
Vladimir Simakov :

임호. 한 경우에는 C-런타임, 다른 경우에는 가상 머신.

두 dll 모두에서 가상 .Net이 회전하고 있습니다.

코드에서 차이점을 발견했습니다. 32비트 기본 클래스 자체에서 별도의 스레드에서 다른 방식으로 작동하지 않기 때문에 직접 버렸습니다.

마치 결과가 비교 가능한 것처럼 MT5에 대해 동일한 조작을 수행했습니다(각각 세 가지 테스트).

MT5: 사이클 100000, 시간 8.482981초, 사이클 100000, 시간 8.638789초, 사이클 100000, 시간 8.390046초

MT4: 주기 100000, 시간 7.128857초, 주기 100000, 시간 7.176361초, 주기 100000, 시간 7.205439초


좋아, 이것이 Microsoft의 일종의 후크라고 가정해 봅시다.
 

안녕하세요! 남성 여러분, 즐거운 휴일 보내세요!
테스터에서 지그재그로 형평성을 표시하는 이상한 버그가 무엇인지 이해하지 못합니다. 중개인 주식 섹션, 데모를 엽니다. "결제 방법" 기호의 설정을 "주식 거래소"에서 "외환"으로 변경하면 자산이 정상적으로 표시됩니다. 몇 년 전에도 동일한 현상이 관찰되었습니다. MT5를 펀드에 연결하려고 했고 테스트를 해보고 겁에 질려 모든 것에 침을 뱉었습니다. 이제 나는 다시 시도했고 같은 것을 시도했습니다. 좀 이상한데???

 
lvalue, rvalue, 리터럴 또는 임시 변수와 같이 "원본"에 관계없이 모든 변수가 전달될 수 있도록 "보편적" 인수로 함수를 구현하는 것이 불가능한 이유는 무엇입니까?
이 문제는 "유형이 지정된" 컨테이너 클래스의 메서드에서는 해결할 수 있지만 일반 함수에서는 해결할 수 없습니다.

주요 모순은 전달 구조의 경우 참조에 의한 전달을 사용해야 하고 리터럴 및 임시 변수의 경우 값에 의한 전달을 사용해야 한다는 것입니다.
결과적으로 일반 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(빌드 2340)에 의해 수정 되지 않음) ** 정의되지 않은 동작, 내부 유형 "C"를 사용하여 복잡한 다중 래핑된 개체를 생성하고 완전히 다른 데이터 유형, 아마도 "B", 아마도 "int ", 원하는 대로...
(MT5(빌드 2340)에 의해 수정되지 않음 ) * 컴파일 오류, 함수 포인터 인수를 const ref 템플릿으로 전달할 때 발생하는 버그.
(MT5(build 2340)로 수정되지 않음 ) * Compile Error, B<void*> 개체 뒤에 B<int> 개체가 생성될 수 있지만 이전에 완료되면 컴파일 오류가 발생합니다.


템플릿 기능/클래스 작업의 결함:
(MT5(빌드 2340)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수 내부의 버그 , 명시적 캐스트 작업의 일부로 전달된 포인터는 포인터처럼 다른 경우에는 클래스처럼 작동합니다.
(MT5(빌드 2340)로 수정되지 않음 ) ** 컴파일 오류, 내부 클래스 사용 시 템플릿 클래스 코드 생성 버그.
(MT5(빌드 2340)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수의 템플릿 매개변수에 대한 내부 클래스에 액세스하려고 할 때 발생하는 버그.
(MT5(빌드 2340)에서 수정되지 않음 ) * 컴파일 오류, 템플릿 메서드/클래스 생성 시 버그, 템플릿 매개변수의 "자동 교체" 프로세스가 범위를 넘어 메인 프로그램 코드로 넘어갑니다.
(MT5(빌드 2340)에서 수정되지 않음 ) * 템플릿 클래스가 템플릿 메서드의 반환 값으로 작동할 때 템플릿 클래스 코드가 자동으로 생성되지 않는 버그인 컴파일 오류.
( MT5(build 2340)에 의해 수정되지 않음 ) * 컴파일 오류, 내부 클래스 정의 시 버그 - 기본 클래스를 지정할 때 전역 네임스페이스를 명시적으로 참조할 수 없습니다.


C++와 비교하여 MQL에서 오버로드된 함수 호출의 우선순위 불일치 내 결함:
(MT5(빌드 2340)에 의해 수정되지 않음 ) *** 컴파일 오류, 클래스 A <= B <= C <= D의 상속이 있고 두 개의 오버로딩 기능이 구현된 경우(예: 매개변수 A*가 있는 기능 및 두 번째로 B*를 사용한 다음 MQL에서 이러한 C* 또는 D* 개체의 함수로 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다.
(MT5(빌드 2340)에 의해 수정되지 않음 ) ** 런타임, 오버로드된 템플릿 함수 호출에 대한 우선 순위 불일치.



제안:
링크 - 리터럴 및 임시 변수를 const ref 함수 인수로 전달하는 기능 제공에 대해.
링크 - "프로젝트" 탭에서 프로젝트 파일을 이동할 때 열려 있고 ME 탭에 있는 파일을 이동하려면 위치 경로를 자동으로 업데이트합니다.
링크 - 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'