Еще раз про таймзоны, GMT, серверное и локальное время - страница 4

 

SProgrammer писал(а) >>

допсутим известна таймзона и текущее время одного сервера. А остальные вычесляют

это предполагает сохранение данных. да и при работающих серверах можно и без этого обойтись. а хотелось бы универсального кода который работает только с текущим сервером без подсказок извне

 
ForexTools >>:

я сделал свою работу и продаю ее. что тут непоследовательного и не честного? кто хочет - покупает. кто не хочет - не покупает и пишет сам такое же.

я прошу помощи. кто захочет мне помочь - поможет, кто нет - не поможет.

Вы хотите чтобы я вам заплатил за ваше решение? не вопрос - я готов заплатить вам за работающий (даже в выходные дни) код 10WMZ.

Чудной вы наш...

не в деньгах - тем более 10WMZ. )

а помощь вам предложили на уровне идей.

Дороже стоит.

если не поняли - жаль.


МHK выявит вам смещение лучше всего. огрубите результат. вы же знаете, что сдвиг не может быть не кратен 30 минутам.

 
ForexTools писал(а) >>

именно так у меня и сделано. и замечательно работает когда идут котировки. но когда их нет и это первый запуск который пришелся на выходные то вычислить чтото для сохранения в гл.переменную нельзя :(

Когда нет котировкок, тогда берем из гобальной переменной, обратите внимание на проверку if(RefreshRates()){

 
Integer писал(а) >>

Когда нет котировкок, тогда берем из гобальной переменной, обратите внимание на проверку if(RefreshRates()){

Может быть if(RefreshRates()){ вернет тру при запуске на выходные, если в пятницу терминал не до упора работал, не знаю. Можно придумать что-нибудь - сразу на зупске брать значение из глобальной переменной, а считать и обновлять глобальную переменную когда цена изменится.

 
avatara >>:

Чудной вы наш...

если не поняли - жаль.

да я не понимаю. и даже после вашего рисунка не могу понять как имея данные только одного графика все цифры которого имеют привязку к одному и томуже времени сервера(!) вы сможете определить работает сервер в америке или на тайване. и в первом и во втором случае последняя котировка отмечена одним и тем же локальным временем сервера (что то вроде 23.59.59) но в одном случае это -6GMT а во втором +6GMT. Не торопитесь с ответами - не все так просто в этой задачке, иначе я бы ее сюда не выносил ;)
 

нет.

Одного графика и одного сервера мало.

МТ всё это до лампочки пока.

Ищите якорь.

сохраненные данные других серверов, поток данных е-сигнала.

я об этом Вам писал.

Нужно иметь сопоставимость во времени.

Запускайте в процедуре инит идентификацию по известной вам системе координат.

И живите в ней дальше.

 
чтобы совсем было ясно - вот вам совершенно точная аналогия: живут в одном гостиничном номере два трейдера американец и китаец. у обоих абсолютно одинаковые часы Ролекс. У каждого из них они шли по своему местном времени. пока они шли - зная местное время гостиницы можно было определить где чьи часы по разности времени между ними и часами в гостинице. но как только они обое часов остановились в полночь по своему локальному времени (обе стрелки стоят на 12 часах) вы уже не скажите чьи часы американские а чьи - китайские :)
 

да. ;)

Но благодаря их записям в дневнике. можно понять.

они по разному записали максимум по золоту в 15-00 по гринвичу.

один записал, что это было в 18-00, а другой, что в 5-30.

 
avatara >>:

да. ;)

Но благодаря их записям в дневнике. можно понять.

они по разному записали максимум по золоту в 15-00 по гринвичу.

один записал, что это было в 18-00, а другой, что в 5-30.

и какому из них какой Ролекс из двух упавших на пол со столика и при падении перепутавшихся (с временем остановившимся на 12:00) вы отдадите согласно их записям, если по виду они абсолютно одинаковы, но одни часы - точно китайская подделка за 20 баксов а вторые - настоящий Ролекс за 2 штуки? :)))))))

ладно... понятно... решения нет :(


осталось дождаться ответа разработчиков - может смогут они оторвать от пятерки немножко человекочасов и доделать несколько несложных функций в боевые сервера и терминалы четверки ;)

GMTToLocal, GMTToServer, LocalToServer, LocalToGMT, ServerToLocal, ServerToGMT

ну или хотя бы в MarketInfo добавят два параметра MODE_LOCALTIMEZONE и MODE_SERVERTIMEZONE

это ведь действительно важная вещь - иметь возможность точно определить на графике например EURUSD бар на котором был тот самый "максимум по золоту"

 
getch >>:

Отвечу кодом.

Желательно запускать на EURUSD M1-M5:

#property show_inputs

extern int Days = 30; // Количество дней для анализа
extern int Error = 10; // Погрешность в минутах
extern string TimeX = "12:30"; // Время постоянной (GMT+0) наибольшей активности
extern bool Volumes = FALSE;

// Желательно запускать на мелких таймфрэймах
int GetServerGMT( int Days, int Error, string TimeX, bool Volumes )
{
  int i, Pos, Bar1, Bar2;
  double BarLow, BarHigh, Max;

  double BarSize[PERIOD_D1]; // инициализировался нулями
  int BarCount[PERIOD_D1]; // инициализировался нулями

  int Amount = PERIOD_D1 / Period();
  int AmountBars = iBarShift(Symbol(), Period(), Time[0] - Days * PERIOD_D1 * 60);
  
  Error *= 30;
    
  for (i = 1; i <= AmountBars; i++)    
  {
    Bar1 = iBarShift(Symbol(), Period(), Time[i] - Error);
    Bar2 = iBarShift(Symbol(), Period(), Time[i] + Error);
    
    if (Time[Bar2] - Time[Bar1] <= Error + Error)
    {
      Pos = (TimeMinute(Time[i]) + TimeHour(Time[i]) * PERIOD_H1) / Period();

      if (Volumes)
        while (Bar2 <= Bar1)
        {
          BarSize[Pos] += Volume[Bar2];      
          Bar2++;
        }
      else
      {
        BarLow = Low[iLowest(Symbol(), Period(), MODE_LOW, Bar1 - Bar2, Bar2)];
        BarHigh = High[iHighest(Symbol(), Period(), MODE_HIGH, Bar1 - Bar2, Bar2)];
      
        BarSize[Pos] += BarHigh - BarLow;      
      }
      
      BarCount[Pos]++;
    }
  }

  for (i = 0; i < Amount; i++)
    if (BarCount[i] != 0)
      BarSize[i] /= BarCount[i];
      
  Max = BarSize[0];
  Pos = 0;
  
  for (i = 1; i < Amount; i++)
    if (BarSize[i] > Max)
    {
      Max = BarSize[i];
      Pos = i;
    }
    
  Print("TimeX2 = " + TimeToStr(Pos * Period() * 60, TIME_MINUTES));

  i = (Pos * Period() * 60 + Error - StrToTime("1970.01.01 " + TimeX)) / 3600;
    
  return(i);
}

void start()
{
  Print("ServerGMT = " + GetServerGMT(Days, Error, TimeX, Volumes));

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