Características da linguagem mql5, subtilezas e técnicas - página 79

 
Alain Verleyen:

Eu gostaria de obter o horário do servidor de acordo com a GMT.

Isto é o que se obtém quando se corre o guião. Há uma saída especial de dois valores: TimeGMT e TimeServerGMT, para que você possa verificar se eles coincidem.

Se forem os mesmos, não tem erro.

 
fxsaber:

Recebes isto quando geres o guião. Dois valores são especialmente emitidos ali: TimeGMT e TimeServerGMT, para que você possa verificar se eles correspondem.

Se coincidirem, não há erro, senão há um erro.

Já está.
 

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Bibliotecas: 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:

O Sparam tem um limite de comprimento. Você já levou isso em conta?

 
Andrey Barinov:

O Sparam tem um limite de comprimento.

Sim, 128 bytes.

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;      
  }
}

Já levou isso em conta?

Não, isso é o que você pode ver a partir dele. O exemplo da sparam é dado como uma das variantes de armazenamento de cordas.

Você pode tornar o código mais complicado (envie-o em pedaços), mas perderá a clareza visual então.

 
fxsaber:

Receio que, sem um exemplo concreto, não haja uma saída construtiva.

Está a dar uma imagem como esta:


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

E aqui está o instalador do mt4 com um turno de trabalhoGMT+2.

Estava à espera de verTimeServer=2018.04.01 05:54:26

Arquivos anexados:
tw4setup.zip  522 kb
 
Vitaly Muzichenko:

Dá uma imagem como esta:

Só por precaução, dê-me o nome do servidor TradersWay-Demo.

SZZ TradersWay-Demo.

Funciona correctamente.

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

Pode não o ter.

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

por precaução, dá-me o nome do Servidor de Negociação.

ZS TradersWay-Demo.

Funciona correctamente.

Pode não o ter.

Provavelmente não. Provavelmente não o tenho em nenhum terminal, nunca mudo o tempo abaixo de M15

Está bem, vou investigar mais um pouco.
 
Vitaly Muzichenko:

Provavelmente não. Provavelmente não o tenho em nenhum terminal, nunca mudo os prazos abaixo de M15.

Faça-o desta maneira

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

Faz isto.

Fê-lo, não mostrou nenhuma merda. O que é confuso é que o turno provavelmente deveria ser -720



P.S. Novamente, eu sei que o turno +2 horas está escrito no site, mas o robô não sabe disso.

Se você executar o Expert Advisor em um gráfico como este, é improvável que obtenha o resultado de saída necessário: "Aprenda o servidor de tempo atual TimeServer()" Eu não acertei, talvez eu esteja fazendo algo errado.

Talvez os desenvolvedores devam implementar a função no terminal.