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

 
fxsaber :

ArrayResize에 대한 질문입니다. 나는 즉시 몇 기가바이트를 예약합니다. 그리고 점차적으로 원래 Reserve보다 작은 Size를 늘립니다.

크기를 늘리는 동안 TaskManager에서 메모리 소비가 증가하는 이유는 무엇입니까?

의도적으로 우리는 이것을 위해 아무 것도하지 않습니다. 이것은 OS의 기능입니다(사용자에게 실제로 기가바이트가 필요합니까?

프로그램의 중요한 지점에서 "핫" 메모리를 갖고 싶다면 이 지점 이전에 할당된 청크의 페이지를 "실행"하여 프로세스의 가상 메모리 페이지가 물리적이 되도록 해야 합니다.


그러나 MQL에서는 어레이의 예약된 섹션에 액세스할 수 없습니다.

 
Ilyas :

의도적으로 우리는 이것을 위해 아무 것도하지 않습니다. 이것은 OS의 기능입니다(사용자에게 실제로 기가바이트가 필요합니까?

프로그램의 중요한 지점에서 "핫" 메모리를 갖고 싶다면 이 지점 이전에 할당된 청크의 페이지를 "실행"하여 프로세스의 가상 메모리 페이지가 물리적이 되도록 해야 합니다.


그러나 MQL에서는 어레이의 예약된 섹션에 액세스할 수 없습니다.

고맙습니다. 기가바이트에 대해 본격적인 ArrayResize 를 즉시 수행하면 성능에 어떤 영향을 미칠지 궁금합니다.

 
void OnStart ()
{   datetime m_stoptime = 0 ;
//1.
   if (m_stoptime < TimeCurrent ())
   {
       //расчеты   
   }


//2.
   MqlTick last_tick;
   if ( SymbolInfoTick ( _Symbol , last_tick))
   {   if (m_stoptime < last_tick.time) 
      {
         //расчеты
      }
   }
//3. 
      const int start = 0;
       const int count = 1 ;
       datetime time[ 1 ];
       if ( CopyTime ( _Symbol , PERIOD_M1 ,start,count,time)> 0 )
      {
         if (m_stoptime < time[ 0 ]) 
         {
         //расчеты
         }
      }
}

테스트됨, 내 Expert Advisor를 5000개 패스에 대해 최적화 할 때 전체 검색 시작, 테스터의 로그에 따라 계산됨

1. 14:04:28.365 - 14:15:47.481 = 11분 19초

2. 13:49:56.885 - 14:00:30.819 = 10분 34초

3. 14:28:35.89 - 14:41:11.659 = 12분 36초


원칙적으로 예상대로 옵션 번호 2가 더 빠르며 5000 패스의 경우 게인이 약 30 초이며 이것도 나쁘지 않습니다.

 

WinAPI를 통해 이 메뉴를 호출할 수 있도록 도와주세요.

선택한 어드바이저 이름이 있는 라인을 가져옵니다. MT4와 달리 ComboBox에는 하나만 있습니다.

그러나 메뉴를 호출하려면 - 나가지 않습니다. BM_CLICK은(는) 도움이 되지 않습니다.


ZY x64에서 메시지를 무엇을 추적합니까?


WM_LBUTTONDOWN을 통해 문제를 해결했습니다.

 
null static이 하나가 아닌 것이 버그입니까?
 int Array0[] = {};
 
지하실의 지표를 해도에 직접 오버레이하는 모바일 터미널 이 가능합니까?
 
Igor Makanu :

원칙적으로 예상대로 옵션 번호 2가 더 빠르며 5000 패스의 경우 게인이 약 30 초이며 이것도 나쁘지 않습니다.

비슷한 결과가 수집되는 지점이 있으면 좋을 것입니다. 옵티마이저와 관련이 있습니다.

 
fxsaber :

비슷한 결과가 수집되는 지점이 있으면 좋을 것입니다. 옵티마이저와 관련이 있습니다.

지원합니다. 테스트하고 결과를 게시하는 것이 이번이 처음이 아닙니다.

그러나 나는 지점을 열 준비가되지 않았습니다 .... 교육이 나쁘고 책임감이 압도되고 주제를 최신 상태로 유지합니다 ... 할 수 있을지 모르겠습니다 (((

추신: 위의 예에 따라 .... 어제 이 주제에 대해 다시 쓰기로 결정하지 않았습니다. 예에서 2번 SymbolInfoTick() on SymbolInfoInteger (_Symbol, SYMBOL_TIME)가 필요합니다.

ZYZY: 여기에 내가 사용하는 예가 있습니다. 5분의 불연속성을 가진 옵티마이저에서 시간을 찾는 것이 더 편리합니다. 패스 수가 적으므로 옵티마이저의 시간은 일반적으로 ushort에서 2바이트로 만들어집니다(0인 경우). - 그러면 이 옵션이 사용되지 않고 여전히 백로그가 있습니다. - 바이트로 작업하는 것이 더 빠른 방법을 확인하지만 지금은 아닙니다. - 내 예에서는 OnInit()에서 한 번 바이트로 나누었습니다. - 중요하지 않습니다.

 class CWorkTime
{
private :
   int                m_starthour, m_stophour, m_startmin, m_stopmin;
   datetime           m_starttime, m_stoptime;
   bool               UseThisSession, NotIntraDay;
   void               setTodayWorkTime();
public :
   void               CWorkTime( const ushort worktime);
   bool               Disable(); };
//+------------------------------------------------------------------+
void CWorkTime::CWorkTime( const ushort worktime): UseThisSession( true )
{   union UShortToByte { ushort u_short; uchar byte[ 2 ]; } ShortToByte;
   if (worktime == 0 )
   {  UseThisSession = false ;
       Print ( "EA working time is not used" ); }
   else
   {  ShortToByte.u_short = worktime;
       int t = ( int )(ShortToByte.byte[ 0 ] * 5.625 );
      m_starthour = ( int )(t / 60 );
      m_startmin = t % 60 ;

      t = ( int )(ShortToByte.byte[ 1 ] * 5.625 );
      m_stophour = ( int )(t / 60 );
      m_stopmin = t % 60 ;
      NotIntraDay = m_starthour > m_stophour ? true : false ;
      setTodayWorkTime();
       printf ( "EA working time start: %d h %d min , end: %d h %d min" , m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+
void CWorkTime::setTodayWorkTime()
{   MqlDateTime dtstart, dtstop;
   TimeCurrent (dtstart);
   dtstop         = dtstart;
   dtstart.hour   = m_starthour;
   dtstart.min    = m_startmin;
   dtstop.hour    = m_stophour;
   dtstop.min     = m_stopmin;
   m_starttime    = StructToTime (dtstart);
   m_stoptime     = StructToTime (dtstop);
   if (NotIntraDay) m_stoptime += 86400 ; }
//+------------------------------------------------------------------+
bool CWorkTime::Disable( void )
{   bool result    = false ;
   if (UseThisSession)
   {   datetime time = ( datetime ) SymbolInfoInteger ( _Symbol , SYMBOL_TIME );
       if (m_stoptime < time) setTodayWorkTime();
      result      = time >= m_starttime && time <= m_stoptime ? false : true ; }
   return (result); };
//+------------------------------------------------------------------+

용법:

 int OnInit ()
  {
   WorkTime= new CWorkTime(EA_Time);
   }

void OnTick ()
  {
     bool DisableTradingByTime=WorkTime.Disable();
.....
     if (DisableTradingByTime) return ;

저것들. Disable() 메서드의 결과는 true 휴무 시간, false - 작업입니다.

 
fxsaber :

비슷한 결과가 수집되는 지점이 있으면 좋을 것입니다. 옵티마이저와 관련이 있습니다.

비슷한 주제가 있습니다.

Алгоритмы, методы решений, сравнение их производительности
Алгоритмы, методы решений, сравнение их производительности
  • 2017.12.10
  • www.mql5.com
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений...
 

몇 가지 세부 정보가 있습니다. 소켓이 연결될 때(SocketIsConnected()가 true를 반환함) SocketTlsReadAvailable()이 오류(5273 ERR_NETSOCKET_IO_ERROR)를 반환하는 이유는 무엇입니까?

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

오류, 버그, 질문

알랭 벌리앙 , 2019.08.29 01:17

mql SocketXXX() 함수에 대해 이 게시물은 주로 Metaquotes 개발자를 위한 것입니다. @Renat Fatkhullin, @Slava, @Ilyas

보안 연결을 통한 메시지 수신을 제어하기 위해 아래 코드를 사용하고 있습니다.

 int socket;
//+------------------------------------------------------------------+
//| void OnTimer()                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   string message;
   if (receive(message))
     {
       //--- ...     
     }
  }
//+------------------------------------------------------------------+
//| Call every X ms                                                  |
//+------------------------------------------------------------------+
bool receive( string &message)
  {
//--- ...
   char response[];
   message= "" ;

   ResetLastError ();
   uint len= SocketIsReadable (socket);
   if (len> 1 )
     {
       int read= SocketTlsReadAvailable (socket,response,len);

       //--- analyze the response 
       if (read> 0 )
        {
         //--- ...

         message= CharArrayToString (response, 0 ,read);
         return ( true );
        }
       else if (read==- 1 )
        {
         if ( SocketIsConnected (socket))
           {
             printf ( "ERROR: %i, socket(%i) read: len=%i" , _LastError ,socket,len);
           }
         else
           {
             printf ( "ERROR: %i, socket(%i) not connected. len=%i" , _LastError ,socket,len);
             //--- ...            
           }
        }
     }
   else
     {
       if ( _LastError != 0 )
         printf ( "ERROR: %i (SocketIsReadable)." , _LastError );
     }
//--- ...
   return ( false );
  }

대부분의 경우 올바르게 작동합니다. 그런데 가끔 소켓이 연결되어 있는데도 에러가 나고 잠시 후(1~5/6 에러) 계속 작동이 됩니다.

...데이터/메시지가 올바르게 수신됨

2019.08.29 00:45:43.019 XXXX(EURUSD, H1) 오류: 5273, 소켓(1), 읽기: len=437
2019.08.29 00:45:43.237 XXXX(EURUSD, H1) 오류: 5273, nest(1), 읽기: len=1242

...데이터/메시지가 올바르게 수신됨

오류 5273은 매우 일반적이며 별로 도움이 되지 않습니다. 그러한 오류에 대한 추가 정보를 얻을 수 있습니까?