Генератор уникального идентификатора для конкретного показателя - страница 4

 
gchrmt4:
Я не знаю, какую версию MT4 вы используете, но на v616 на моем компьютере WindowFind() возвращает -1 во время OnInit(). В документации всегда говорилось: "WindowFind() возвращает -1, если пользовательский индикатор ищет сам себя во время работы функции init()."


Моя версия - 610.

о боже мой... каждое обновление кажется все более плохим и более плохим... не становится лучше.

У меня был индикатор FFcalendar.

Я восстановил его в версии 604... и он работал хорошо.

Когда я обновился до 610... и скомпилировал его снова... он снова стал ошибаться...

так что я сдался... и скомпилировал снова с версией 509... хахаха (потому что моя версия 604 исчезла).


Ой, простите. Вы правы насчет WindowsFind retun -1.

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

тег

 
Комментарии, не относящиеся к данной теме, были перемещены в раздел "Уровни Fib".
 

Я знаю, что это сообщение ОЧЕНЬ старое, но вот как я решаю проблему уникального имени экземпляра. Я использую комбинацию GetTickCount() вместе с глобальным хранением переменных терминала. Это также работает при разных загрузках экземпляра.

const string _uniqueSeedVarName = "MyVar";
string GetUniqueInstanceName(const string baseName)
{
   uint seed = 1;

   // See if our last stored unique seed value exists
   if (GlobalVariableCheck(_uniqueSeedVarName))
   {
      // It does, so get it
      seed = (uint)GlobalVariableGet(_uniqueSeedVarName);

      // Do some boundary checking and ensure the user didn't muck with the value
      // If we're okay, increment the seed by one      
      if (seed > 0 && seed < UINT_MAX)
         seed = seed + 1;
      else
         // The seed has been corrupted by the user or is too large; reset to current tick count
         seed = GetTickCount();   
   }
   else
      // First time in; initialize the seed to the current tick count
      seed = GetTickCount();

   // Store the value in global terminal variables
   // The user DOES have access to this value, so the handling above should account for any changes the user might make
   GlobalVariableSet(_uniqueSeedVarName, seed);

   // Initialize the random generator
   MathSrand(seed);
  
   // Create a unique instance name in the format of "[BaseName][Random1][Random2]"
   return StringFormat("%s%s%s", baseName, IntegerToString(MathRand()), IntegerToString(MathRand()));
}


А затем просто вызываю ее в OnInit() следующим образом:

   Print(StringFormat("Indicator Id: %s", GetUniqueInstanceName("Sandbox")));


Пока все работает правильно.

 

Большое спасибо. Эта функция решила действительно большую проблему для меня.


cdxadmin:

Я знаю, что это сообщение ОЧЕНЬ старое, но вот как я решаю проблему уникального имени экземпляра. Я использую комбинацию GetTickCount() вместе с глобальным хранением переменных терминала. Это также работает при разных загрузках экземпляра.


А затем просто вызываю ее в OnInit() следующим образом:


Пока все работает правильно.

 
cdxadmin #:

Я знаю, что это сообщение ОЧЕНЬ старое, но вот как я решаю проблему уникального имени экземпляра. Я использую комбинацию GetTickCount() вместе с глобальным хранением переменных терминала. Это также работает при разных загрузках экземпляра.


А затем просто вызываю ее в OnInit() следующим образом:


Пока все работает правильно.

Рабочее решение, спасибо!

 
Позвольте и мне внести свои 5 копеек. ;)

Получить уникальный идентификатор можно простой комбинацией локального  времени и счётчика тиков.



ulong GetUniqueId(void)
{    uint tickCount = GetTickCount();    ulong uniqueId;    do {       uniqueId = ((ulong) TimeLocal() << 32) + (ulong)tickCount;
   } while ( tickCount == GetTickCount() );
   return uniqueId; }
 
Sergey Gridnev #:
Позвольте и мне внести свои 5 копеек. ;)

Получить уникальный идентификатор можно простой комбинацией локального  времени и счётчика тиков.



Ваш вариант рабочий, но менее производительный. Например последовательный вызов функции в цикле 1000 раз занимает 10 секунд. Т.е. максимальная скорость генерации id-шников - это 100 в секунду. Если кому-то нужна более высокая пропускная способность, то можно использовать вот такой вариант. По сути тоже самое, только GetTickCount() заменён на GetMicrosecondCount(). Данная функция генерирует 1 миллион уникальных идентификаторов за ~1438 миллисекунд. Т.е. её скорость ~695410 в секунду.

ulong GetUniqueId()
{
   ulong tickCount = GetMicrosecondCount();
   ulong uniqueId;
   do {
      uniqueId = ((ulong) TimeLocal() << 32) + tickCount;
   } while (tickCount == GetMicrosecondCount());
   return uniqueId;
}