Caractéristiques du langage mql5, subtilités et techniques - page 75

 
Vitaly Muzichenko:

J'ai mis l'EA sur le graphique le samedi, mais l'EA peut obtenir l'heure du dernier tick, il est par exemple dans Market Watch 23:58, et mon heure locale est 04:45. L'heure du serveur, je ne la connais pas.

Ma question est la suivante : combien de temps s'est écoulé entre le dernier tick et l'heure du serveur (heure du terminal) ?

J'ai réfléchi pendant un moment. Il s'avère qu'il n'y a aucune différence lorsqu'un EA est attaché à un graphique. Tant qu'il n'y a pas de tic-tac réel, nous ne pouvons pas exécuter la partie de l'algorithme du programme qui utilise le temps réel du serveur.

Si des calculs sont nécessaires avant l'arrivée du tick, demandez ServerGMTOffset.

Ainsi, le problème peut être résolu même sans ServerTradeTime().

 
Ihor Herasko:

J'y ai réfléchi. Il s'avère qu'il n'y a aucune différence lorsque l'EA est attaché au graphique. Tant qu'il n'y a pas de tic-tac réel, nous ne pouvons pas exécuter la partie de l'algorithme du programme qui utilise le temps réel du serveur.

Si des calculs sont nécessaires avant l'arrivée du tick, demandez ServerGMTOffset.

Ainsi, le problème peut être résolu même sans ServerTradeTime().

L'utilisateur ne connaît pas l'Offset du serveur, il ne le connaît pas.

Seules deux valeurs sont connues, et ces données ne suffisent pas à calculer"combien de temps s'est écoulé entre le dernier tick et l'heure du serveur(terminal)".

C'est une tâche très particulière et je ne vois pas de solution, comme vous.

 
Vitaly Muzichenko:

J'ai mis l'EA sur le graphique le samedi, mais l'EA peut obtenir l'heure du dernier tick, il est par exemple dans Market Watch 23:58, et mon heure locale est 04:45. L'heure du serveur, je ne la connais pas.

La question est de savoir combien de temps s'est écoulé entre le dernier tick et l'heure du serveur (heure du terminal).

Ce n'est pas seulement une heure, c'est une date. C'est-à-dire la date et l'heure. Ainsi, l'opération arithmétique avec ces données donnera la différence en secondes, ce qui n'est pas difficile à traduire en jours, heures, minutes et secondes.

De plus, vous devez vérifier ce que TimeTradeServer affichera pendant les week-ends.

2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeCurrent() = 2018.03.29 14:59:54
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeLocal() = 2018.03.29 15:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMT() = 2018.03.29 12:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMTOffset() = -10800
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeTradeServer() = 2018.03.29 15:00:03
Faites attention à l'écart entre l'heure du serveur et l'heure locale, puis à la correspondance exacte entre l'heure locale et l'heure estimée du serveur.
 
Pour le forex, vous pouvez refaire ce code à partir de quatre

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Caractéristiques du langage mql4, subtilités et astuces

fxsaber, 2018.03.29 14:32

#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());
}
 
fxsaber:
Vous pouvez refaire ce code pour les forex

Merci, je vais regarder. Mais là encore, il existe des symboles non forex.

Ce qui n'est pas pratique, c'est que vous ne pouvez pas obtenir simplement et brièvement l'heure actuelle du serveur, à tout moment.

Alexey Viktorov:

Les deux ne sont pas seulement des heures, mais aussi des dates. En d'autres termes, il s'agit à la fois de la date et de l'heure. Ainsi, l'opération arithmétique avec ces données donnera la différence en secondes, ce qui n'est pas difficile à traduire en jours, heures, minutes et secondes.

En outre, nous devons vérifier le week-end ce que TimeTradeServer affiche.

Faites attention à l'écart entre les secondes de l'heure du serveur et l'heure locale, puis à la correspondance exacte entre l'heure locale et le calcul de l'heure du serveur.

Je l'ai imprimé de la même manière, mais comment l'utiliser le week-end. En général, les informations doivent être testées.

La tâche est minimale :"combien de temps s'est écoulé entre le dernier tick et l'heure du serveur (du terminal)".

if( TimeCurrent()<TimeServer()-60 ) Alert( "нет котировок более 1-й минуты" );
 
Vitaly Muzichenko:

Merci, je vais jeter un coup d'oeil. Mais là encore, il existe des symboles non-forex.

Si le courtier a au moins un symbole forex, il fonctionnera pour les autres.

Si le courtier n'a pas un seul symbole Forex, la question du caractère raisonnable se pose.

 
Vitaly Muzichenko:

Merci, je vais regarder. Mais là encore, il existe des symboles non forex.

Il n'est pas pratique de ne pas pouvoir obtenir simplement et brièvement l'heure actuelle du serveur, à tout moment.

Je l'ai aussi imprimé, mais comment l'utiliser ce week-end. En général, vous devez faire tourner les informations fournies.

La tâche est minimale :"combien de temps s'est écoulé entre le dernier tick et l'heure du serveur (terminal)".

Bien sûr, nous devons le vérifier, mais à en juger par la différence entre TimeCurrent et TimeTradeServer, nous pouvons supposer que la différence va s'accroître.

Veuillez me dire si l'heure du serveur MQ-demo est la même qu'à Moscou.

 
Alexey Viktorov:

Cela vaut la peine de vérifier, mais la différence entre TimeCurrent et TimeTradeServer suggère que la différence va s'élargir.

Veuillez me dire si l'heure de mon serveur MQ-demo est la même que l'heure de Moscou et ce qu'il montre si l'heure du serveur n'est pas la même que l'heure locale.

Robo

Mon heure locale était 17:17:13

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

fxsaber, 2017.05.19 22:35

TimeTradeServer peut renvoyer toutes sortes d'absurdités. Par exemple, une valeur inférieure à TimeCurrent. Cela annule complètement son application pratique.

Si je comprends bien l'idée, le TimeTradeServer doit calculer le temps écoulé après avoir reçu le TimeCurrent et ajouter cette différence, émulant en quelque sorte les futures valeurs du TimeCurrent.

Maintenant, après avoir exécuté le conseiller expert

#define  TOSTRING(A) #A + " = " + (string)(A) + "\n"

void OnInit()
{
  EventSetTimer(1);
}

void OnTimer()
{
  Comment(TOSTRING(TimeTradeServer()) + TOSTRING(TimeCurrent()));
}

vous pouvez voir n'importe quel non-sens.

Notez les dates.

 
fxsaber:

Et qui est à blâmer pour cela, le terminal, ou le DC avec les paramètres tordues ?