mql4 언어의 기능, 미묘함 및 작업 방법 - 페이지 8

 
  1. iCustom을 사용하여 EA를 통한 표시기의 첫 번째 호출은 표시기의 OnInit 및 OnCalculate를 트리거합니다.
  2. 다음 iCustom 호출까지 표시기는 OnCalculate를 호출하지 않습니다.
  3. Expert Advisor를 종료하면 표시기의 OnDeinit가 실행됩니다.
iCustom 표시기가 완전하지 않습니다. 그리고 MQL4 도구를 사용하여 수동으로 시작된 표시기에서 표시기 버퍼 값을 가져올 수 없습니다.
 
fxsaber :
iCustom 표시기가 완전하지 않습니다.

열등감이란? 이벤트가 처리되지 않습니까?

 
Andrey Khatimlianskii :

열등감이란? 이벤트가 처리되지 않습니까?

네.

 
#property strict

#define HOUR 3600
#define DAY ( 24 * HOUR)
#define WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false , string Symb = NULL , const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
   if (Symb == NULL )
    Symb = _Symbol ;
    
   return ( iTime (Symb, TimeFrame, iBarShift (Symb, TimeFrame, time) - (NextBar ? 1 : 0 )));
}

datetime GetTimeDayOfWeek( const int Shift = 0 , const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
   const datetime Res = TimeCurrent () / DAY * DAY;
  
   return (Res - (((WEEK + ( TimeDayOfWeek (Res) - Day )) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
   const datetime Sunday = GetTimeDayOfWeek();
  
   return ((( int ) MathRound (( double ) MathMin (Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true )) / HOUR) - 3 ) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
   return ( TimeCurrent () + TimeServerGMTOffset());
}


애플리케이션

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{  
  PRINT( TimeGMT ());
  PRINT(TimeServerGMT());  
}


이 접근 방식은 주말, 테스터 및 실시간뿐만 아니라 타사 데이터에서도 작동하기 때문에 좋습니다. 저것들. MT에서 가져오지 않은 따옴표의 GMT에 의해 결정됩니다.

 
fxsaber :

그러나 TimeCurrent () 대신 기호에 대한 마지막 틱의 시간을 취하면 계산이 위반되지 않습니까?

 
Vitaly Muzichenko :

그러나 TimeCurrent () 대신 기호에 대한 마지막 틱의 시간을 취하면 계산이 위반되지 않습니까?

깨지지 않을 것입니다. TimeCurrent 알고리즘은 매우 간접적으로 영향을 받습니다. 바 시간 등을 가질 수 있습니다.

일요일 이전과 이후에 막대가 있도록 마지막 과거(막대 역사) 일요일의 날짜를 계산하는 방법을 사용하면 됩니다. 즉, 이를 위해 최소한 TimeLocal을 사용할 수 있습니다.

 
이와 같은 코드를 작성할 수 있는 언어를 사랑하지 않는 것은 어렵습니다.
 double Lots[] = { 0 , 0 , 0 , 0 , 0 , 0 };

for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
   if ( OrderSelect (i, SELECT_BY_POS ))
    Lots[ OrderType ()] += OrderLots ();

나는 개발자들이 언어를 작성할 때 그런 것들을 생각하지 않았을 것이라고 확신합니다. MQL4에 그런 편리한 것들이 많이 있다는 것이 어떻게 밝혀졌는지는 미스터리입니다.

 
fxsaber :
이런 코드를 작성할 수 있는 언어를 사랑하지 않는 것은 어렵습니다.

나는 개발자들이 언어를 작성할 때 그런 것들을 생각하지 않았을 것이라고 확신합니다. MQL4에 그런 편리한 것들이 많이 있다는 것이 어떻게 밝혀졌는지는 미스터리입니다.

수수께끼가 없습니다. 나는 이것을 수년 동안 사용해 왔으며 mql5에서도 위치와 순서의 유형을 명시적으로 int 형변환하면 됩니다.

나는 단지 다음과 같이 배열을 선언한다.

 double Lots[ 6 ] = { 0 .0};
배열에 티켓을 저장할 수도 있습니다.
 
Alexey Viktorov :

수수께끼가 없습니다. 나는 이것을 수년 동안 사용해 왔으며 mql5에서도 int 유형 으로 명시적으로 전달하면 됩니다.

따라서 의미가 완전히 다를 것입니다.