mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 196

 
fxsaber :

시간이 어디에서 오는지에 대한 가정은 없습니다(저도 동일합니다). 아마도 시간대에 따라 다릅니다.


그래서 더 이상 흥미롭지 않습니다.

추측이 없습니다. 모스크바가 있습니다. GMT로 한 시간이 아니라 ... 다른 생각은 없습니다.

 

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

터미널의 자동 오류 모니터링 - 솔루션은 무엇입니까?

레나트 팻쿨린 , 2021.01.22 16:12

Print(NULL)를 통해 디스크에 로그를 강제로 덤프하는 문서화되지 않은 방법이 있습니다.

 

Andrey Khatimlianskii :

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

터미널의 자동 오류 모니터링 - 솔루션은 무엇입니까?

레나트 팻쿨린 , 2021.01.22 16:12

Print(NULL)를 통해 디스크에 로그를 강제로 덤프하는 문서화되지 않은 방법이 있습니다.

시원한!

 
Andrey Khatimlianskii :

fxsaber :

시원한!

확인하지 않고 급하게 공유합니다.

 
Andrey Khatimlianskii :

확인하지 않고 급하게 공유합니다.


그리고 문자열이 첫 번째 null인 경우 인쇄에서
 

차트 표시(활성화 안 함) 옵션(MT5만 해당)

 // Показывает (не активирует) данный чарт.
bool ChartShow( const long Chart )
{
   const bool IsDocked = ChartGetInteger (Chart, CHART_IS_DOCKED );
  
   return ( ChartSetInteger (Chart, CHART_IS_DOCKED , !IsDocked) && 
         ChartSetInteger (Chart, CHART_IS_DOCKED , IsDocked) &&
         ChartGetInteger (Chart, CHART_WINDOW_HANDLE ));  
}


사용 예.

 // Переключает чарты клавишами клавиатуры '<'/'>'.

#define KEY_LEFT2 188    // '<'
#define KEY_RIGHT2 190 // '>'

int GetExpertCharts( long &Charts[], const string ExpertName = NULL )
{
   int Amount = 0 ;
  
   for ( long Chart = ChartFirst (); Chart != - 1 ; Chart = ChartNext (Chart))
     if ((ExpertName == NULL ) || ( ChartGetString (Chart, CHART_EXPERT_NAME ) == ExpertName))
    {
      Amount = ArrayResize (Charts, Amount + 1 , 10 );
      
      Charts[Amount - 1 ] = Chart;
    }
    
   return ( ArrayResize (Charts, Amount));
}

long ChartNextShow( const long Chart, const int Step = 1 )
{
   long ResChart = Chart;
  
   long Charts[];  
   const int Size = GetExpertCharts(Charts);
  
   if ((Size > 1 ) && ( bool )(Step % Size))
     for ( int i = 0 ; i < Size; i++)  
       if (Charts[i] == Chart)
      {
        ResChart = Charts[(i + ((Step > 0 ) ? Step : (Size - ((-Step) % Size)))) % Size];
        
        ChartShow(ResChart); // https://www.mql5.com/ru/forum/170952/page196#comment_20841674
        
         break ;
      }

   return (ResChart);  
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & ) 
{         
   static long Chart = ChartID ();
  
   if (id == CHARTEVENT_KEYDOWN ) 
     switch (( int )lparam)
    {
     case KEY_LEFT2:
      Chart = ChartNextShow(Chart, - 1 ); // Показали чарт слева
       break ;

     case KEY_RIGHT2:
      Chart = ChartNextShow(Chart); // Показали чарт справа
       break ;
    }
}

안타깝게도 차트를 활성화하는 옵션을 찾지 못했습니다. 만 표시.

 
오래된 문제를 해결합니다.
 /*
// https://www.mql5.com/ru/forum/1111/page2863#comment_18591240
#define VALUE 10

#define MACROS

#ifdef MACROS
  // Нужно VALUE увеличить в два раза.
#endif
*/

// https://www.mql5.com/ru/forum/1111/page2965#comment_20841725
#define MACRO(  x, y, z )       enum nn ##z { y = x };
#define MACRO2( x, y )          MACRO( x, y, __LINE__ )

// https://www.mql5.com/ru/forum/1111/page2866#comment_18603128
#define VALUE 10

MACRO2(VALUE, VALUE_TMP) // VALUE_TMP - поле enum, поэтому имя не должно повторяться.
#undef VALUE
#define VALUE (VALUE_TMP * 2 )

void OnStart ()
{
   Print (VALUE);
}

이 옵션이 이 옵션보다 좋습니다.

 #define MACRO3(x, y)             const int y = x;

MACRO3(VALUE, VALUE_TMP)

왜냐하면 변수 없이 합니다. 모든 값은 컴파일 시간에 설정됩니다. @A100 감사합니다!

 
fxsaber :

안타깝게도 차트를 활성화하는 옵션을 찾지 못했습니다. 만 표시.

이해가 안가는데…………이걸 말씀하시는 겁니까? 이것은 스크립트입니다.


추신; 뭐야

   const bool IsDocked = ChartGetInteger (Chart, CHART_IS_DOCKED );

문서에서 아무것도 찾을 수 없습니다 ...

파일:
200.mq5  2 kb
 
Alexey Viktorov :

추신; 뭐야

문서에서 아무것도 찾을 수 없습니다 ...

이것은 차트에서 Alt+D입니다.

 
Alexey Viktorov :

이해가 안가는데…………이걸 말씀하시는 겁니까? 이것은 스크립트입니다.

고마워, 내가 뭔가를 망쳤어. 물론 이전에는 달성할 수 없었던 더 높은 차트 관리가 나타났습니다. 하지만 내 목표는 달랐다.

 // Активирует данный чарт.
bool ChartActivate( const long Chart )
{
   return ( ChartSetInteger (Chart, CHART_BRING_TO_TOP , true ) && ChartGetInteger (Chart, CHART_WINDOW_HANDLE ));
}


사용 예.

 // Переключает чарты с одним и тем же советником клавишами клавиатуры '<'/'>'.

void ChartNextActivate( const int Step = 1 , const bool Expert = true )
{
   long Charts[];  
   // https://www.mql5.com/ru/forum/170952/page196#comment_20841674
   const int Size = GetExpertCharts(Charts, Expert ? ChartGetString ( 0 , CHART_EXPERT_NAME ) : NULL );
   const long Chart = ChartID ();
  
   if ((Size > 1 ) && ( bool )(Step % Size))
     for ( int i = 0 ; i < Size; i++)  
       if (Charts[i] == Chart)
      {
         // https://www.mql5.com/ru/forum/170952/page197#comment_20845067
        ChartActivate(Charts[(i + ((Step > 0 ) ? Step : (Size - ((-Step) % Size)))) % Size]);
        
         break ;
      }

   return ;  
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & ) 
{         
   if (id == CHARTEVENT_KEYDOWN ) 
     switch (( int )lparam)
    {
     case KEY_LEFT2:
      ChartNextActivate(- 1 );
       break ;

     case KEY_RIGHT2:
      ChartNextActivate();      
       break ;
    }
}