Как получить текущее время с миллисекундами? - страница 2

 
Ihor Herasko:

И не нужно использовать комментарий для собственных целей. Это поле может быть затерто (изменено) сервером.

P. S. Не спрашивайте меня, зачем оно вообще нужно. Я сам не знаю )))

Ну это я как бы понял уже :) Тут не хватает разработчика, чтобы объяснить, зачем это поле дано устанавливать пользователю, если система пользовательский комментарий затрёт в неожиданный момент, не описанный в документации.


Для текущих моих нужд мне важно чтобы при установке двух групп ордеров советник не сумел обеим группам одну и ту же метку сгенерировать. По этому мне в данном случае не важна синхронизация 0 миллисекунды с концом секунды.

Если брать просто datatime, то за 1 секунду алгоритм сможет обработать две группы по два ордера и всем четырём сгенерируется одинаковая метка.

По этому я сейчас делают вот так:

int milliseconds = (int)(GetTickCount() % 1000);                                                                                                                                                                                           
string identifier = Id+"-Order-"+TimeToStr(TimeCurrent(), TIME_DATE)+"."+IntegerToString(milliseconds);

...

OrderSend(Symbol(), buyType, lots, buyOrderOpenPrice, slippage, buyOrderStopLoss, buyOrderTakeProfit, identifier, magic, expiration, buyColor);


А потом мониторю увеличение OrderHistoryTotal() и обнаруживаю, что вытащенный из истории мой отработавший ордер в комментарии не имеет того, что я туда ему вписывал.


Видимо остаётся кодировать magic.

Думаю конвертировать int magic советника в строку и конвертировать дату с миллисекундами в строку целых чисел, а затем конкатенацию и обратно StringToInteger().

 
vipermagi:

Ну это я как бы понял уже :) Тут не хватает разработчика, чтобы объяснить, зачем это поле дано устанавливать пользователю, если система пользовательский комментарий затрёт в неожиданный момент, не описанный в документации.

Думаю, что даже они не ответят. Скорее всего, задумка была одна, а в процессе разработки все поменялось. Вышла такая вот фича.

Для текущих моих нужд мне важно чтобы при установке двух групп ордеров советник не сумел обеим группам одну и ту же метку сгенерировать. По этому мне в данном случае не важна синхронизация 0 миллисекунды с концом секунды.

Кроме как для идентификации разных групп ордеров время нужно? Например, для того, чтобы потом определить, когда именно имел место первый сигнал.

Если время используется только как идентификатор, то о нем вообще можно забыть и использовать какой-нибудь свой алгоритм генерации идентификаторов ордеров. Например, индексировать. Открывается первая группа ордеров - ID = 0, вторая группа - ID = 1 и т. д. Если группа с каким-либо ID исчезает, то этот ID становится свободным и может быть использован новой группой ордеров. Или же не использовать такой ID, просто увеличивая его для каждой новой группы, пока не дойдем до переполнения.

 

Я когда-то думал об идее с 2-мя полями комментариев к ордеру. 1-й пользовательский, что пользователь вписал - то там и осталось. Второй - короткий, системный. Туда пишет только система. Но видимо разработчикам это не надо.

Есть еще одна идея, но у нее плохая переносимость между компьютерами.

struct TOrderData
{
  ulong ticket,
  string MyLongComment;
  ulong MyId;
  ...
};
После высталения ордера заполняем данные структуры, пихаем в массив. Храним по вкусу - на чарте в виде графических объектов, в файле, на Web-сервере.
 

Вот кому нужно время с миллисекундами:

long TimeLocal_ms() 
{ 
  static long mcsec0= 0;
  if (mcsec0==0) { datetime t=TimeLocal();  while(TimeLocal()<t+1);  mcsec0= GetMicrosecondCount(); }
  long delta_mcsec= GetMicrosecondCount() - mсsec0;
  return (long)TimeLocal()*1000 + delta_mcsec/1000%1000;
}

При желании можно аналогично сделать и микросекундное.