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

 
Slava :
네. OnInit의 모든 인쇄

고맙습니다. 내가 어떻게 이것에 대해 알아낼 수 있었는지 우연히 눈치채지 않았는지 궁금합니다...


ZY 이 카운터는 로컬 에이전트에 대해서만 남겨둡니다. 클라우드에서는 이런 식으로 로그를 쉽게 스팸할 수 있습니다.

 
fxsaber :

고맙습니다. 내가 어떻게 이것에 대해 알아낼 수 있었는지 우연히 눈치채지 않았는지 궁금합니다...


ZY 이 카운터는 로컬 에이전트에 대해서만 남겨둡니다. 클라우드에서는 이런 식으로 로그를 쉽게 스팸할 수 있습니다.

클라우드에서는 사용할 수 없습니다. 필요가 없기 때문에
 
Slava :

유전학을 실행할 때 맞춤 기준에 따라 최적화합니까?

제시된 로그로 판단하면 OnTester는 모든 경우에 0을 반환했습니다.

보통은 제 기준에 맞춰 최적화를 하는데 여기서는 일반 기준에 따라 해봤습니다. 결과는 비슷합니다.

OnTester는 0을 반환하므로 결과의 0을 이해할 수 있습니다. 문제는 일반 실행(최적화)에서 "0"을 반환하고 "0 결과"(동일한 매개변수 사용)에서 단일 실행에서 정상적인 결과, 그래프 등을 생성하는 이유입니다. 저것들. "Brute Force"에서 무언가가 작동하지 않고 동시에 유전학은 잘 작동합니다. 다른 생각/아이디어가 있습니까?

 
Kuzmich :

다른 생각/아이디어가 있습니까?

비슷한 방식으로 최적화 패스의 모든 정보를 빼냅니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MT5. 전략 테스터. 테스트와 최적화 결과 간의 불일치.

fxsaber , 2017.08.22 11:06

이 줄을 EA에 삽입하십시오.

 #define REPORT_TESTER // В тестере будут автоматически записываться отчеты
#include <Report.mqh>

최적화를 실행합니다. 그런 다음 일치하지 않는 단일 실행을 실행합니다.

다음으로 Optimization 및 Single Pass에서 각각의 패스에 대해 저장된 두 보고서를 비교합니다.

이 두 보고서를 비교한 결과 원인을 빠르게 알 수 있습니다.

 
Socket* 기능에 대한 지식의 일환으로 현재 구현과 관련하여 많은 질문이 제기되었습니다.
목표는 가능한 한 많이 한 것을 개선하는 것이므로 개발자에게 가능한 비판에 화를 내지 말 것을 요청합니다.



1. 소켓 읽기 기능에 대한 "인터페이스"의 강력한 차이에 대한 이유는 명확하지 않습니다.
a) 암호화된 연결의 경우 읽기에 대한 두 가지 기능이 있고 암호화되지 않은 연결에 대한 기능이 하나 있습니다.
b) SocketRead 에서는 명시적으로 timeout_ms 를 지정해야 하지만 SocketTlsReadSocketTlsReadAvailable 에는 그러한 매개변수가 전혀 없습니다(별도의 SocketTimeouts 함수로 설정).
 int   SocketTlsRead( int socket, uchar & buffer[], int buffer_maxlen);
int   SocketTlsReadAvailable( int socket, uchar & buffer[], int buffer_maxlen);

int  SocketRead(int socket, uchar& buffer[], int buffer_maxlen, uint timeout_ms);


2. SocketIsReadable 함수의 이름은 실제로 하는 일과 아무 관련이 없습니다.

 bool   SocketIsWritable( const int   socket); // Return true if writing is possible, otherwise false.
uint    SocketIsReadable ( const int   socket); // Number of bytes that can be calculated. In case of an error, 0 is returned.
bool   SocketIsConnected( const int socket); // New function without description. May be, it returns true if connection is not closed.

실제로 SocketIsReadable은 Ws2_32.dll의 FIONREAD 플래그가 있는 ioctlsocket() 함수와 동일합니다.


3. 암호화되지 않은 연결을 통해 Socket* 기능을 사용하는 사용자가 데이터 전송 후 서버가 연결을 끊지 않으면 어떻게 최소한의 지연 시간으로 서버로부터 응답을 받을 수 있습니까?

- 시간 지연을 명시적으로 사용하지 않는 SocketIsReadable 함수(예: Sleep 없이)는 0을 반환합니다.
- SocketRead 함수는 읽어야 할 양을 알지 못합니다. 여백과 함께 buffer_maxlen 값을 지정합니다. - timeout_ms 까지 시간 초과를 기다려야 합니다.

네, 이렇게 합니다.

- SocketRead에 1바이트의 데이터가 필요합니다.
- 그런 다음 SocketIsReadable을 사용하여 전체 응답의 크기를 찾습니다.
- SocketRead에서 누락된 길이를 읽습니다.
- 배열을 복사하여 얻은 결과를 하나의 전체로 결합:

 #define PRINT(x) Print ( #x, ": " , string (x))
                
void OnStart () {
   string domain = "www.mql5.com" ;
   int port = 80 ;
 
   string request = "GET / HTTP/1.1\r\nHost: " + domain + "\r\n\r\n" ;
   char req[];
   
   int socket = SocketCreate();
   PRINT(SocketConnect(socket, domain, port, 5000 ));
   int len= StringToCharArray (request,req)- 1 ;
   PRINT(SocketSend(socket,req,len));
   
   
   
   uchar resp[];
   uchar result[];
   
   int resp_result;
   uint resp_len;
   int start_write;
   
   
   resp_len = 1 ;
   resp_result = SocketRead(socket, resp, resp_len, 5000 );
   if (resp_result <= 0 ){
      PRINT( GetLastError ());
       return ;
   }
   start_write = ArraySize (result);
   ArrayResize (result, start_write + resp_result);
   ArrayCopy (result, resp, start_write);
   
   
   resp_len = SocketIsReadable(socket);
   resp_result = SocketRead(socket, resp, resp_len, 5000 );
   if (resp_result <= 0 ){
      PRINT( GetLastError ());
       return ;
   }
   start_write = ArraySize (result);
   ArrayResize (result, start_write + resp_result);
   ArrayCopy (result, resp, start_write);
   
   
   PRINT( CharArrayToString (result));
};

코드가 너무 많지 않습니까?


4. SocketIsReadable은 잘못된 정보를 반환합니다.
인터넷을 끄고 위의 코드를 실행하십시오.
결과적으로 SocketIsReadable은 정상적인 값 1을 반환합니다. 기적.


Socket*과 관련된 전체 질문 및 문제의 약 1/3을 설명하는 것이 가능했습니다.
안타깝게도 모든 것을 확인하고, 설명하고, 다시 확인하는 데 시간이 많이 걸립니다 ... (그래서 계속 될 것이라는 사실은 아닙니다)

일반적인 인상: 모든 것이 급하게 완료되었거나 Socket * 기능이 주니어 개발자에 의해 구현되었습니다.
어쨌든 현재 솔루션은 매우 조잡하고 소켓 사용에 대한 다소 좁은 접근 방식을 다룹니다.

 
MQL5\Include\Math\AlgLib\dataanalysis.mqh - CLinReg:: LRLine 이 1M 이상의 값에 대해 작동하지 않습니까?
 
Kuzmich :

보통은 제 기준에 맞춰 최적화를 하는데 여기서는 일반 기준에 따라 해봤습니다. 결과는 비슷합니다.

OnTester는 0을 반환하므로 결과의 0을 이해할 수 있습니다. 문제는 일반 실행(최적화)에서 "0"을 반환하고 "0 결과"(동일한 매개변수 사용)에서 단일 실행에서 정상적인 결과, 그래프 등을 생성하는 이유입니다. 저것들. "Brute Force"에서 무언가가 작동하지 않고 동시에 유전학은 잘 작동합니다. 다른 생각/아이디어가 있습니까?

어드바이저(PM의 ex5)와 최적화 조건을 공유할 수 있나요?

말씀하신 문제를 재현하고 싶습니다.

연구 후 전문가는 영구적으로 삭제됩니다.

 
Slava :

어드바이저(PM의 ex5)와 최적화 조건을 공유할 수 있나요?

말씀하신 문제를 재현하고 싶습니다.

연구 후 전문가는 영구적으로 삭제됩니다.

그리고 내 고문의 모습은? 비슷한 문제가 있습니다. 이익이 고려되지 않으므로 최적화가 작동하지 않습니다.
 
Slava :

어드바이저(PM의 ex5)와 최적화 조건을 공유할 수 있나요?

말씀하신 문제를 재현하고 싶습니다.

연구 후 전문가는 영구적으로 삭제됩니다.

비공개로 답변했습니다.

 
Sergey Dzyublik :
Socket* 기능에 대한 지식의 일환으로 현재 구현과 관련하여 많은 질문이 제기되었습니다.
목표는 가능한 한 많이 한 것을 개선하는 것이므로 개발자가 가능한 비판에 화를 내지 않기를 바랍니다.



1. 소켓 읽기 기능에 대한 "인터페이스"의 강력한 차이에 대한 이유는 명확하지 않습니다.
a) 암호화된 연결의 경우 읽기 기능이 두 가지 있고 암호화되지 않은 연결의 경우 하나가 있습니다.
b) SocketRead 에서는 명시적으로 timeout_ms 를 지정해야 하지만 SocketTlsReadSocketTlsReadAvailable 에는 이러한 매개변수가 전혀 없습니다(별도의 SocketTimeouts 함수에 의해 설정됨).


2. SocketIsReadable 함수의 이름은 실제로 하는 일과 아무 관련이 없습니다.

실제로 SocketIsReadable은 Ws2_32.dll의 FIONREAD 플래그가 있는 ioctlsocket() 함수와 동일합니다.


3. 암호화되지 않은 연결을 통해 Socket* 기능을 사용하는 사용자가 데이터 전송 후 서버가 연결을 끊지 않으면 어떻게 최소한의 지연 시간으로 서버로부터 응답을 받을 수 있습니까?

- 시간 지연을 명시적으로 사용하지 않는 SocketIsReadable 함수(예: 절전 모드 없음)는 0을 반환합니다.
- SocketRead 함수는 읽어야 할 양을 알지 못합니다. 여백과 함께 buffer_maxlen 값을 지정합니다. - timeout_ms 까지 시간 초과를 기다려야 합니다.

예, 다음과 같이 완료됩니다.

- SocketRead에 1바이트의 데이터가 필요합니다.
- 그런 다음 SocketIsReadable을 사용하여 전체 응답의 크기를 찾습니다.
- SocketRead에서 누락된 길이를 읽습니다.
- 배열을 복사하여 얻은 결과를 하나의 전체로 병합:

코드가 너무 많지 않습니까?


4. SocketIsReadable은 잘못된 정보를 반환합니다.
인터넷을 끄고 위의 코드를 실행하십시오.
결과적으로 SocketIsReadable은 정상적인 값 1을 반환합니다. 기적.


Socket*과 관련된 전체 질문 및 문제의 약 1/3을 설명하는 것이 가능했습니다.
안타깝게도 모든 것을 확인하고, 설명하고, 다시 확인하는 데 시간이 많이 걸립니다 ... (그래서 계속 될 것이라는 사실은 아닙니다)

일반적인 인상: 모든 것이 급하게 완료되었거나 Socket * 기능이 주니어 개발자에 의해 구현되었습니다.
어쨌든 현재 솔루션은 매우 조잡하고 소켓 사용에 대한 다소 좁은 접근 방식을 다룹니다.

1. 인터페이스입니다.

TLS 기능은 복잡한 경우를 지원하는 도우미입니다. SocketTimeouts 설정에 문제가 없습니다. 사용하기에 가장 좋습니다.


2. 기능을 올바르게 수행합니다.

분명히 당신은 TCP 연결 끊김 감지의 문제를 인식하지 못하고 있습니다. 연결이 올바르게 종료된다는 보장을 감지하는 것은 매우 어렵습니다(추가 호출로 인해 리소스 집약적). 모든 네트워크 구현은 이 문제를 겪고 있습니다.

우리의 SocketIsReadible 구현은 연결 끊김 감지를 할 만큼 충분히 똑똑합니다. 깨끗한 0바이트를 만나면 소켓이 완전한지 확인하는 추가 작업을 수행합니다.

   //+------------------------------------------------------------------+
   //| Доступно для чтения?                                             |
   //+------------------------------------------------------------------+
   UINT32 IsReadible( void )
     {
       unsigned long size= 1 ;     // специально, чтобы убиться при попытке чтения, если сокет мертв
       //--- проверка
       if (m_socket!=INVALID_SOCKET)
        {
         //--- считаем количество доступных для чтения байт
         if (ioctlsocket(m_socket,FIONREAD,&size)!= 0 )
           {
             Close ();
             return ( 1 );         // вернем 1, чтобы убиться при попытке чтения
           }
         //--- если нет данных, проверим сокет на завершенность
         if (size== 0 )
           {
            timeval wait_time;
            fd_set  fd;
             //--- ждём
            FD_ZERO(&fd);
            FD_SET(m_socket,&fd);

            wait_time.tv_sec = 0 ;           // секунды
            wait_time.tv_usec= 1000 ;       // микросекунды
             //--- ждём
             if (select( 0 ,&fd, NULL , NULL ,&wait_time)> 0 )
               return ( 1 );                 // вернем 1, чтобы убиться при попытке чтения
           }
        }
       //--- размер
       return (size);
     }

완료 플래그 없이 바이트 수를 반환하므로 후속/임박한 SocketRead 읽기 시도가 일반적으로 실패하도록 1바이트를 반환합니다.

왜 맞습니까? 프로그래머가 만드는 대부분의 코드는 다음과 같이 이마에 작성되어 있기 때문입니다.

 if (SocketIsReadible(...)> 0 )
  {
   if (SocketRead( )< 1 )
     return ( false );
   ...
  }
... уходим на следующий круг ожидания

실제로 작업의 결과는 읽기를 직접 시도할 때 확인됩니다.


3. 읽고 있는 데이터의 정확한 크기를 모르는 경우 실제로 읽기 전에 SocketIsReadible()을 수행해야 합니다.

SocketisReadible / SocketRead 바인딩은 프로그램의 실행 흐름에 대한 제어를 잃지 않을 기회를 제공합니다(제어 손실을 거의 0으로 최소화하기 위해). 이렇게 하면 네트워크 시간 초과가 발생하지 않습니다.

예, 몇 줄의 코드가 더 있지만 밀리초 동안 (대략) 제어를 잃지 않을 것입니다. 네트워크 데이터가 없는 경우 수행할 작업을 결정합니다.


4. 두 번째 단락에서 설명합니다.

읽기를 자극하기 위해 1을 발행하고 읽기 오류로 종료합니다.



귀하의 결론이 잘못되었습니다.

이것이 전혀 보장되지 않는 TCP/IP 전송의 특성입니다. 거기에서 TCP 신호의 일부가 없을 때 필터/방화벽의 네트워크 블랙홀로 날아갈 수 있습니다. 시간 초과 및 데이터 흐름에 대한 원시 제어를 통해 이를 감지하고 독립적으로 연결을 끊을 수 있습니다.

TLS 구현을 포함하여 네트워크 기능에 액세스하기 위한 원시/직접 인터페이스를 제공했습니다. 그것들을 사용한다면 보호/제어 SocketIsReadible/SocketRead 핸들러에서 원시 함수를 올바르게 래핑해야 하는 사람은 바로 당신입니다.

사소한 것까지 생각하지 않고 높은 수준의 요청을 하고 싶다면 WebRequest 기능이 있습니다. 모든 보호 기능이 내장되어 있습니다.