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

 
MK, 표준 라이브러리 에 바이너리 검색을 위한 일반 기능을 추가하지 않겠습니까? ArrayBsearch는 유형이 단순하고 사용자 정의 비교기가 필요하지 않은 단순한 경우에만 유용합니다. 템플릿이 있습니다. C++::std::lower/upper_bound 위에 래퍼를 만드세요. 지금까지는 직접 작성해야 하는데 이는 정상이 아닙니다(cppreference에서 거의 완전히 복사됨).
 template < typename A, typename T, typename Compare>
uint lower_bound( const A &ar[], const T &value, Compare &comp){
   long count = ArraySize (ar);
   uint first = 0 ;
  
   while (count > 0 ){
       uint it = first;
       uint step = count / 2 ;
      it += step;
       if (comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1 ;
      }
       else
         count = step;
   }
   return first;
}

void OnStart (){
   struct M_point{
       double price;
       datetime time;
   };
   M_point ar[ 5 ];
   ar[ 0 ].time = 2 ; ar[ 1 ].time = 4 ; ar[ 2 ].time = 6 ;
   ar[ 3 ].time = 8 ; ar[ 4 ].time = 10 ;
   struct Comp{
       bool comp( const M_point &p, datetime value) { return p.time < value;}
   }cmp;
   datetime value = 6 ;
   lower_bound(ar, value, cmp);
   return ;
}

이 과정에서 몇 가지 질문이 제기되었습니다.
1. Comp에 대해 operator()를 작성하는 것이 불가능한 이유는 무엇입니까(어떤 이유로 금지됨)?
 bool operator ()( const M_point &p, datetime value ) { return p.time < value ;}
2. 일반적인 관행처럼 상수 참조를 허용하는 함수에 prvalue를 전달하는 것이 불가능한 이유는 무엇입니까?
lower_bound(ar, 6 , cmp) ); // ошибка
추신: 그리고 이 경고도 매우 성가십니다: "구조체에 멤버가 없고 크기가 1바이트로 할당되었습니다"
 
coderex :

모든 것이 괜찮습니다. 주문은 OnTradeTransaction을 통해 제어되어야 합니다. 그런데 Plaza2를 통해 거래소에 직접 연결하면 상황은 동일합니다. 주문에 대한 메시지 수신을 제어해야 합니다. 그리고 MT4에서 이 기능은 동기식이지만 MT5에서 동일한 옵션을 사용할 수 있습니다. 이 경우에만 함수가 응답을 수신할 때까지 논리가 중지됩니다.

필요한 경우 제어 클래스를 삭제할 수 있지만 시장 배치를 위해 축소되었지만 곧 지정가 주문으로 마무리할 것입니다.

애플리케이션을 제어하려면 애플리케이션의 배치 사실을 기억해야 합니다. 수업을 중단합니다.
 
fxsaber :
코드 베이스에 무언가를 넣어달라고 부탁합니다! 교육 목적.

나는 당신이 https://www.mql5.com/ru/forum/1111/page1743#comment_2877482 자신을 지적했기 때문에 할 수 없습니다. 최근에 버그를 현지화할 수 없었고 서비스 데스크에서 소스 코드를 생성하는 데 많은 시간을 보냈습니다. 결국 많은 상호 참조로 인해 아무 일도 일어나지 않았습니다(하나는 다른 하나는 기하급수적으로 가져옴) - .ex5를 보냈습니다.

교육 목적을 위해 추가 변수를 도입하지 않고 h()를 단순화하여 f()가 어떤 경우에도 한 번 호출되도록 작업을 제안할 수 있습니다.

 bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef MACRO
         if ( f() )
#endif
         {
                 if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100 :

컴파일 중 오류

(*) 일반적인 경우 템플릿 (1)에서 T 대신에 A - > (2)와 const A - > (3)을 모두 대체할 수 있습니다.

왜요? const가 있는 템플릿은 const가 아닌 것을 수락할 수 없습니다. 이는 계약을 위반합니다.

 
A100 :

교육적 목적으로 작업을 제안할 수 있습니다. 추가 변수를 도입하지 않고 f()가 어떤 경우에도 한 번 호출되도록 h()를 단순화합니다.

 bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef MACRO
         if ( f() )
        {
                g1();
                g2();
        }
#else
         if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky :

왜요? const가 있는 템플릿은 const가 아닌 것을 수락할 수 없습니다. 이는 계약을 위반합니다.

템플릿은 그 자체가 아닙니다(함수와 달리) - 그 작업은 교체를 수행하는 것입니다(#define과 유사). 교체의 결과 모순이 없는 경우(그리고 없는 경우) 템플릿이 해당 작업에 대처했습니다. 적어도 C++에서 이것을 컴파일하려고 시도했지만 컴파일러는 오류나 경고를 제공하지 않았습니다.
 
fxsaber :
이것은 정확히 단순화한 것이 아닙니다. 원래 버전에서 MACRO+2*f+g1+g2=5 - 다음이 있습니다: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin :

누구든지 비슷한 문제가 발생 했습니까? 터미널 또는 광산의 "버그"?

GetLastError() 는 무엇을 반환합니까?
 
fxsaber :

MT5-OrderSend는 완전히 동기화되지 않았습니다. 거래 환경과 동기화되지 않았습니다. 이는 역사의 증언이 실제 상황과 일치하지 않는다는 것을 의미한다.

시간 초과에 대한 이야기는 없습니다. 문제에 대한 신뢰할 수 있는 솔루션이 없기 때문에 동기화 문제는 서버가 아닌 터미널 수준에서 처리해야 합니다.

실제로 MT5 사용자는 MT4 브리지 개발자가 경험한 것을 경험했습니다.

OrderSend가 전송되면 이것이 완료되었음을 기억해야 합니다(잠재적인 취약점이 있음). 또한 해당 메시지가 OnTrade에 도착할 때까지 현재 이력(거래 환경)에 주의를 기울이지 마십시오. 그것이 오면 기억해야 할 것은 잊어버려야 합니다.

STORED 데이터가 없으면 MT4와 같이 이력을 신뢰할 수 있습니다.

MT4-OrderSend가 완전히 동기화되었습니다.
왜 이러는지 궁금...
비동기식 OrderSendAsync로 현명하게 플레이하면 OnTrade와 OnTradeTransaction을 모두 처리할 수 있다는 것을 이해합니다. OrderSend를 사용하면 MT4에서와 같이 간단한 동작을 원합니다. 전화를 걸고 출구에서 이미 열린 위치와 기록이 변경되었습니다.
미묘한 점이 있습니다. 현재 상태가 전역 변수 에 저장되고 상태 변경 대기 시간이 충분히 길고 거래자가 Expert Advisor의 매개변수를 변경하는 경우 전역 변수가 재설정되고 상태가 재설정됩니다.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef MACRO
        }
#endif
                g2();
#ifndef MACRO
        }
#endif
}