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

 
Alain Verleyen:

Je voudrais obtenir l'heure du serveur selon l'heure GMT.

Voici ce que vous obtenez lorsque vous exécutez le script. Il y a une sortie spéciale de deux valeurs : TimeGMT et TimeServerGMT, de sorte que vous pouvez vérifier si elles coïncident.

Si elles sont identiques, vous n'avez pas d'erreur.

 
fxsaber:

Vous obtenez ceci lorsque vous exécutez le script. Deux valeurs y sont spécialement éditées : TimeGMT et TimeServerGMT, afin que vous puissiez vérifier qu'elles correspondent.

Si elles coïncident, il n'y a pas d'erreur, sinon il y a une erreur.

Je l'ai.
 

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

Bibliothèques : TypeToBytes

fxsaber, 2018.03.31 09:24

// Кроссплатформенный пример передачи произвольных данных через пользовательское событие

#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

// Печать произвольных данных
template <typename T>
bool MyPrint( const T &Value )
{
  T Array[1];
  
  Array[0] = Value;
  
  ArrayPrint(Array, _Digits, NULL, 0, WHOLE_ARRAY, ARRAYPRINT_HEADER | ARRAYPRINT_ALIGN);
  
  return(true);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string &sparam )
{
  // Распечатали полученные данные
  if ((id == CHARTEVENT_CUSTOM) &&
      (lparam ?  MyPrint(DATA_STRING::FromString<MqlDateTime>(sparam)) // Получили MqlDateTime
              : !MyPrint(DATA_STRING::FromString<MqlTick>(sparam))))   // Получили MqlTick
    ExpertRemove(); // Вышли из примера
}

void OnInit()
{
  MqlTick Tick;  
  MqlDateTime DateTime;
  
  // Заполнили значения
  SymbolInfoTick(_Symbol, Tick);  
  TimeCurrent(DateTime);

  // Передали
  EventChartCustom(0, 0, 0, 0, DATA_STRING::ToString(Tick));     // Передали MqlTick
  EventChartCustom(0, 0, 1, 0, DATA_STRING::ToString(DateTime)); // Передали MqlDateTime
}
 
fxsaber:

Sparam a une limite de longueur. L'avez-vous pris en compte ?

 
Andrey Barinov:

Sparam a une limite de longueur.

Oui, 128 octets.

const bool Init = EventChartCustom(0, 0, 0, 0, NULL);

void OnChartEvent( const int id, const long&, const double&, const string &sparam )
{
  static int PrevLength = -1;
  
  if (id == CHARTEVENT_CUSTOM)
  {
    const int Length = StringLen(sparam);

    bool Res = (Length != PrevLength);
    
    if (Res)
    {
      string Str;
            
      StringInit(Str, Length + 1, 1);
      
      Res = EventChartCustom(0, 0, 0, 0, Str);
    }
    
    if (!Res)
    {
      Print(PrevLength);
      
      ExpertRemove();
    }
      
    PrevLength = Length;      
  }
}

Avez-vous pris cela en compte ?

Non, c'est ce qu'on peut voir. L'exemple de sparam est donné comme l'une des variantes de stockage de chaînes de caractères.

Vous pouvez rendre le code plus compliqué (l'envoyer par morceaux), mais vous perdrez alors en clarté visuelle.

 
fxsaber:

Je crains que sans un exemple concret, il n'y ait pas d'issue constructive.

Ça donne une image comme ça :


  Print( "TimeServer: ",TimeGMT()-TimeServerGMTOffset() );
  Print( "TimeServerGMT: ",TimeServerGMT() );
  Print( "TimeCurrent: ",TimeCurrent() );
  Print( "TimeLocal: ",TimeLocal() );
  Print( "TimeGMT: ",TimeGMT() );
  Print( "TimeGMTOffset: ",TimeServerGMTOffset() );
  Print( "" );

Et voici l'installateur de mt4 avec un poste de travailGMT+2.

Je m'attendais à voirTimeServer=2018.04.01 05:54:26

Dossiers :
tw4setup.zip  522 kb
 
Vitaly Muzichenko:

Ça donne une image comme ça :

Juste au cas où, donnez-moi le nom du serveur TradersWay-Demo.

SZZ TradersWay-Demo.

Il fonctionne correctement.

2018.04.01 08:36:08.858 TimeServerGMT EURUSDi,M1: TimeServerGMT() = 2018.03.30 19:59:59

Vous ne l'avez peut-être pas.

// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
 
fxsaber:

Juste au cas où, donnez-moi le nom du serveur de négociation.

ZS TradersWay-Demo.

Il fonctionne correctement.

Vous ne l'avez peut-être pas.

Probablement pas. Je ne l'ai probablement pas dans un terminal, je ne change jamais de cadre temporel en dessous de M15.

OK, je vais y regarder de plus près.
 
Vitaly Muzichenko:

Probablement pas. Je ne l'ai probablement pas dans un terminal, je ne change jamais de timeframes en dessous de M15

Faites-le de cette façon

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M15 )
 
fxsaber:

Faites-le.

Je l'ai fait, ça n'a pas montré de conneries. Ce qui est déroutant, c'est que le décalage devrait probablement être -720.



P.S. Encore une fois, je sais que l'équipe +2 heures est écrite sur le site web, mais le robot ne le sait pas.

Si vous exécutez le conseiller expert sur un graphique comme celui-ci, il est peu probable qu'il obtienne le résultat de sortie requis : "Learn the current time server TimeServer()" Je n'ai pas bien compris, peut-être que je fais quelque chose de mal.

Les développeurs devraient peut-être implémenter cette fonction dans le terminal.