Características da linguagem mql4, sutilezas e técnicas - página 8

 
  1. A primeira chamada do indicador através do Consultor Especialista utilizando iCustom causa o início do OnInit e OnCalculate do indicador
  2. O indicador não chama seu OnCalculate até a próxima chamada do iCustom.
  3. A saída do Expert Advisor chama o indicador OnDeinit.
Os indicadores iCustom não estão completos. E é impossível receber os valores do buffer de indicadores a partir dos indicadores iniciados manualmente, usando ferramentas MQL4.
 
fxsaber:
Os indicadores iCustom não estão completos.

Qual é a incompletude? Os eventos não são tratados?

 
Andrey Khatimlianskii:

Qual é a incompletude? Os eventos não estão sendo processados?

Sim.

 
#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());
}


Aplicação

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

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


A abordagem é boa na medida em que funciona não apenas no fim de semana, no Testador e em tempo real, mas também em dados de terceiros. Ou seja, as citações GMT tiradas de outras fontes que não a MT são determinadas.

 
fxsaber:

E se, em vez deTimeCurrent(), o tempo do último tick no instrumento, o cálculo não for perturbado?

 
Vitaly Muzichenko:

E se, em vez deTimeCurrent(), você tomar o tempo do último tick pelo instrumento, o cálculo não será quebrado?

Não vai. O TimeCurrent afeta o algoritmo muito indiretamente. Você pode tomar o tempo do bar, etc.

É simplesmente necessário calcular a data do último domingo passado (na história dos bares) de qualquer forma - para ter bares antes e depois de domingo. Você pode ao menos usar o TimeLocal para isso.

 
É difícil não gostar de uma linguagem que lhe permita escrever tal código
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();

Tenho certeza de que os desenvolvedores não planejaram tais coisas ao escrever a linguagem. Como se descobriu que a MQL4 está cheia de coisas tão úteis é um mistério.

 
fxsaber:
É difícil não gostar de uma linguagem que lhe permita escrever um código desse tipo

Tenho certeza de que os desenvolvedores não pensaram em tais coisas ao escrever a linguagem. Como se descobriu que a MQL4 está cheia de coisas tão úteis é um mistério.

Não há nenhum mistério. Também a utilizo há muitos anos em mql5, mas temos que converter explicitamente o tipo de posição e o tipo de pedido em int.

Eu apenas declaro um conjunto como este

double  Lots[6] = {0.0};
Você também pode armazenar os tipos de bilhetes em uma matriz.
 
Alexey Viktorov:

Nenhum mistério. Eu a uso há muitos anos e também em mql5, mas você tem que passá-la explicitamente para digitar int.

O significado será bem diferente lá.