TimeTradeServer аналог для МТ4 - страница 5

 
fxsaber:

Как по рисунку воспроизвести?

По-моему, рисунок очень красноречиво все показывает:

  1. Есть EURUSD.
  2. Есть минутная история.
  3. Есть показания серверного и GMT-времени.
  4. Название ДЦ указал.
  5. Разница между ними должна быть 2, а по факту - 0.
Что еще нужно? Скажите, предоставлю.
 
fxsaber:

Такое изменение внести и будет пахать. Определение лета и зимы не делал, кто-нибудь справится.

Во-первых, не "минус 2", а "плюс 2". Тогда для моего случая сходится.

Во-вторых, для сервера, который имеет смещение 4 часа от GMT Вы посоветуете вместо 2 поставить 4? Тогда и функция не нужна, ставишь изначально известное число и получаешь правильный ответ. )))

 
Ihor Herasko:

Что еще нужно? Скажите, предоставлю.

Код и название торгового сервера, к которому можно подключиться, открыв демо через терминал.

 
Ihor Herasko:

Во-первых, не "минус 2", а "плюс 2". Тогда для моего случая сходится.

Во-вторых, для сервера, который имеет смещение 4 часа от GMT Вы посоветуете вместо 2 поставить 4? Тогда и функция не нужна, ставишь изначально известное число и получаешь правильный ответ. )))

Вы приписали мне утверждение, которого я не делал, а затем сказали, что оно ошибочное. При этом еще попытались пошутить над этим.

 
Dmitry Fedoseev:

Как функция OrderSend() наткнулась на ошибку "рынок закрыт" (есть какая-то такая), прекращаем все попытки торговых операций и ждем изменения цены, что будет означать, что рынок открылся.

Идея конечно может помочь, хотелось бы без лишних ошибок узнавать о закрытии рынка. Надо подумать.

 
Maxim Kuznetsov:
надо искать не последюю (23:59) минутку на EURUSD, а ночь на золоте. Золото торгуется строго по амстердаму, валюты по времени сервера. Отсюда найти GMT смещение сервера

я открою страшную тайну, не каждый день может закончиться в 23:59 :-) , а во сколько он закончиться мы можем заранее и не знать. Например в предпраздничные дни и в пятницу.

 
fxsaber:

Такое изменение внести и будет пахать. Определение лета и зимы не делал, кто-нибудь справится.

Не будет решение работать, на системах, где блин не обновляют систему как поставили :-) Например там по прежнему время переводиться с зимнего на летнее в РФ. Я сталкивался с такими системами...

 
fxsaber:

Код и название торгового сервера, к которому можно подключиться, открыв демо через терминал.

Код: https://www.mql5.com/ru/forum/327616/page3#comment_14093858

Логин: 12752745

investor: yk2mkat

Сервер: Alpari-Demo

TimeTradeServer аналог для МТ4
TimeTradeServer аналог для МТ4
  • 2019.12.02
  • www.mql5.com
Интересует решение этой функции под МТ4 TimeTradeServer...
 
fxsaber:

Вы приписали мне утверждение, которого я не делал, а затем сказали, что оно ошибочное. При этом еще попытались пошутить над этим.

Разве не Вы писали?

Насчет пошутить - никаких шуток. В представленном коде 0 изменен на 2. Ровно настолько, насколько у меня получается расхождение между реальным и расчетным временем сервера. Поэтому и был удивлен подобным подходом: смотрим, какое нужно расхождение и вместо 0 ставим нужное смещение. Здесь не над чем смеяться.

TimeTradeServer аналог для МТ4
TimeTradeServer аналог для МТ4
  • 2019.12.03
  • www.mql5.com
Интересует решение этой функции под МТ4 TimeTradeServer...
 
Ihor Herasko:

Код: https://www.mql5.com/ru/forum/327616/page3#comment_14093858

Логин: 12752745

investor: yk2mkat

Сервер: Alpari-Demo

Ihor Herasko:

Разве не Вы писали?

Насчет пошутить - никаких шуток. В представленном коде 0 изменен на 2. Ровно настолько, насколько у меня получается расхождение между реальным и расчетным временем сервера. Поэтому и был удивлен подобным подходом: смотрим, какое нужно расхождение и вместо 0 ставим нужное смещение. Здесь не над чем смеяться.

Проверочный код

#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/forum/327616/page4#comment_14098877
// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( const bool SummerTime = false )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - SummerTime - 2) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}

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

// https://www.mql5.com/ru/forum/170953/page8#comment_6940794
void OnStart()
{  
  PRINT(TimeGMT());
  PRINT(TimeServerGMT());  
}


Результат на машине, у которой тот же GMT, что и в Альпари.

2019.12.03 19:28:09.048 Test5-3 EURUSD,M1: TimeServerGMT() = 2019.12.03 17:28:12
2019.12.03 19:28:09.048 Test5-3 EURUSD,M1: TimeGMT() = 2019.12.03 17:28:09


Проверил 

AccountServer() = AMPGlobalUSA-Demo

Все правильно показывает.

Причина обращения: