Caractéristiques du langage mql4, subtilités et techniques - page 8

 
  1. Le premier appel de l'indicateur à travers le conseiller expert utilisant iCustom provoque le démarrage de OnInit et OnCalculate de l'indicateur.
  2. L'indicateur n'appelle pas son OnCalculate avant le prochain appel de iCustom.
  3. La sortie de l'Expert Advisor appelle l'indicateur OnDeinit.
Les indicateurs iCustom ne sont pas complets. Et il est impossible de recevoir les valeurs tampons des indicateurs lancés manuellement, en utilisant les outils MQL4.
 
fxsaber:
Les indicateurs iCustom ne sont pas complets.

Qu'est-ce que l'incomplétude ? Les événements ne sont pas gérés ?

 
Andrey Khatimlianskii:

Qu'est-ce que l'incomplétude ? Les événements ne sont pas traités ?

Oui.

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


Application

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

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


L'approche est bonne dans la mesure où elle fonctionne non seulement sur le week-end, le testeur et le temps réel, mais aussi sur les données de tiers. C'est-à-dire que les citations GMT prises ailleurs que dans MT sont déterminées.

 
fxsaber:

Et si au lieu deTimeCurrent(), le temps du dernier tick sur l'instrument, le calcul n'est pas perturbé ?

 
Vitaly Muzichenko:

Et si au lieu deTimeCurrent(), vous prenez le temps du dernier tick pour l'instrument, le calcul ne sera pas cassé ?

Ça n'arrivera pas. Le TimeCurrent affecte l'algorithme de manière très indirecte. Vous pouvez prendre le temps du bar, etc.

Il faut simplement calculer la date du dernier dimanche passé (dans l'historique des barres) de quelque manière que ce soit - pour avoir des barres avant dimanche et après dimanche. Vous pouvez au moins utiliser TimeLocal pour cela.

 
Il est difficile de ne pas aimer un langage qui permet d'écrire un tel code.
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();

Je suis sûr que les développeurs n'ont pas prévu de telles choses lorsqu'ils ont écrit le langage. Comment il se fait que MQL4 soit plein de choses aussi pratiques est un mystère.

 
fxsaber:
Il est difficile de ne pas aimer un langage qui permet d'écrire un tel code.

Je suis sûr que les développeurs n'ont pas pensé à ce genre de choses en écrivant le langage. Comment il se fait que MQL4 soit plein de choses aussi pratiques est un mystère.

Il n'y a pas de mystère. Je l'utilise depuis de nombreuses années dans mql5 également, mais nous devons convertir explicitement le type de position et le type d'ordre en type int.

Je déclare simplement un tableau comme ceci

double  Lots[6] = {0.0};
Vous pouvez également stocker les types de billets dans un tableau.
 
Alexey Viktorov:

Pas de mystère. Je l'utilise depuis de nombreuses années et dans mql5 aussi, mais vous devez le passer explicitement au type int.

La signification y sera tout à fait différente.

Raison: