Merkmale der Sprache mql4, Feinheiten und Techniken - Seite 8

 
  1. Der erste Aufruf des Indikators durch den Expert Advisor mit iCustom bewirkt den Start von OnInit und OnCalculate des Indikators
  2. Der Indikator ruft sein OnCalculate erst beim nächsten Aufruf von iCustom auf.
  3. Beim Beenden des Expert Advisors wird der Indikator OnDeinit aufgerufen.
Die iCustom-Indikatoren sind nicht vollständig. Und es ist unmöglich, Indikatorpufferwerte von manuell gestarteten Indikatoren mit MQL4-Tools zu erhalten.
 
fxsaber:
Die iCustom-Indikatoren sind nicht vollständig.

Was ist die Unvollständigkeit? Ereignisse werden nicht behandelt?

 
Andrey Khatimlianskii:

Was ist die Unvollständigkeit? Die Ereignisse werden nicht verarbeitet?

Ja.

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


Anmeldung

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

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


Der Ansatz ist insofern gut, als er nicht nur auf Wochenend-, Tester- und Echtzeitdaten, sondern auch auf Daten von Dritten funktioniert. D.h. es werden GMT-Zitate bestimmt, die nicht von MT stammen.

 
fxsaber:

Was wäre, wenn anstelle vonTimeCurrent() die Zeit des letzten Ticks auf dem Instrument die Berechnung nicht stören würde?

 
Vitaly Muzichenko:

Was ist, wenn Sie anstelle vonTimeCurrent() die Zeit des letzten Tick für das Instrument nehmen, wird die Berechnung nicht gebrochen werden?

Das wird es nicht. Der TimeCurrent beeinflusst den Algorithmus nur indirekt. Sie können die Barzeit nehmen usw.

Es ist einfach notwendig, das Datum des letzten vergangenen (in der Geschichte der Balken) Sonntags in irgendeiner Weise zu berechnen - um Balken vor Sonntag und nach Sonntag zu haben. Sie können dafür zumindest TimeLocal verwenden.

 
Es ist schwer, eine Sprache nicht zu mögen, mit der man solchen Code schreiben kann
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();

Ich bin sicher, dass die Entwickler solche Dinge beim Schreiben der Sprache nicht eingeplant haben. Wie es dazu kam, dass MQL4 so viele praktische Dinge enthält, ist ein Rätsel.

 
fxsaber:
Es ist schwer, eine Sprache nicht zu mögen, die es einem erlaubt, einen solchen Code zu schreiben

Ich bin sicher, dass die Entwickler solche Dinge beim Schreiben der Sprache nicht eingeplant haben. Wie es dazu kam, dass MQL4 so viele praktische Dinge enthält, ist ein Rätsel.

Es gibt kein Geheimnis. Ich verwende es seit vielen Jahren auch in mql5, aber wir müssen den Positionstyp und den Auftragstyp explizit in den int-Typ konvertieren.

Ich deklariere einfach ein Array wie folgt

double  Lots[6] = {0.0};
Sie können Ticketarten auch in einem Array speichern.
 
Alexey Viktorov:

Kein Geheimnis. Ich benutze es seit vielen Jahren und auch in mql5, aber man muss es explizit an den Typ int übergeben.

Die Bedeutung wird dort ganz anders sein.