Características del lenguaje mql4, sutilezas y técnicas - página 8

 
  1. La primera llamada del indicador a través del Asesor Experto utilizando iCustom provoca el inicio de OnInit y OnCalculate del indicador
  2. El indicador no llama a su OnCalculate hasta la siguiente llamada de iCustom.
  3. Al salir del Asesor Experto se llama al indicador OnDeinit.
Los indicadores de iCustom no están completos. Y es imposible recibir los valores del buffer de los indicadores iniciados manualmente, utilizando las herramientas MQL4.
 
fxsaber:
Los indicadores de iCustom no están completos.

¿Qué es lo incompleto? ¿No se manejan los eventos?

 
Andrey Khatimlianskii:

¿Qué es lo incompleto? ¿No se procesan los eventos?

Sí.

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


Aplicación

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

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


El planteamiento es bueno porque no sólo funciona en fin de semana, en Tester y en tiempo real, sino también con datos de terceros. Es decir, se determinan las cotizaciones GMT tomadas de otras fuentes que no sean MT.

 
fxsaber:

¿Qué pasa si en lugar deTimeCurrent(), el tiempo de la última garrapata en el instrumento, el cálculo no se altera?

 
Vitaly Muzichenko:

¿Y si en lugar deTimeCurrent() se toma la hora del último tick del instrumento, el cálculo no se romperá?

No lo hará. El TimeCurrent afecta al algoritmo de forma muy indirecta. Puedes tomar el tiempo de la barra, etc.

Simplemente hay que calcular la fecha del último domingo pasado (en el historial de bares) de cualquier manera - para tener bares antes del domingo y después del domingo. Al menos puedes usar TimeLocal para esto.

 
Es difícil que no te guste un lenguaje que te permite escribir semejante 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();

Estoy seguro de que los desarrolladores no planearon estas cosas cuando escribieron el lenguaje. Cómo es que MQL4 está lleno de cosas tan útiles es un misterio.

 
fxsaber:
Es difícil que no te guste un lenguaje que te permite escribir un código así

Estoy seguro de que los desarrolladores no planearon estas cosas cuando escribieron el lenguaje. Cómo es que MQL4 está lleno de cosas tan útiles es un misterio.

No hay ningún misterio. Yo también lo he utilizado durante muchos años en mql5, pero tenemos que convertir explícitamente el tipo de posición y el tipo de orden en tipo int.

Simplemente declaro un array así

double  Lots[6] = {0.0};
También puede almacenar los tipos de entradas en una matriz.
 
Alexey Viktorov:

No es un misterio. Yo lo uso desde hace muchos años y en mql5 también, pero hay que pasarlo explícitamente a tipo int.

El significado será muy diferente allí.