Ошибки, баги, вопросы - страница 3740

 
Sergey Gridnev #:
А если заменить на 
Приходит министр сельского хозяйства к М. С. Горбачеву.
- Михаил Сергеевич, беда, в стране куры дохнут.
- Ничего страшного, нарисуйте перед каждой курицей желтый круг.
Пожал плечами министр, ушел. Через две недели приходит:
- Михаил Сергеевич, все равно дохнут.
- Впишите в желтый круг зеленый квадрат.
Пожал плечами, ушел. Приходит через неделю:
- Михаил Сергеевич, дохнут ведь, совсем мало осталось.
- Впишите в зеленый квадрат красный треугольник Проходит месяц,
встречает Горбачев Министра и воспрашает, а чтож вы не заходите не
рассказываете как там куры?
- Да понимаете Михаил Сергеевич, сдохли все.
- Ах как жаль, у меня еще так много идей!
Лучше конструктив.
 
fxsaber #:
Подскажите, как на одном включенном Агенте получить разные Random-значения?

Не ответ на вопрос, но мизерное исследование по самому Random.
#property tester_no_cache

input int inSeed = 0;
sinput uint inAmount = 1000;

ulong GetSum( const int Seed, uint Amount = 1000 )
{
  MathSrand(Seed);

  ulong Sum = 0;

  while ((bool)Amount--)
    Sum += MathRand();
    
  return(Sum);  
}

double OnTester()
{    
  // Среднее слагаемое относительно максимума MathRand.
  return((double)GetSum(inSeed * 100, inAmount) / (SHORT_MAX * inAmount));
}


В среднем MathRand выдает ~центр своего диапазона. Наверное, это правильно.

 
fxsaber #:
Лучше конструктив.
Это и был конструктив, вроде бы.

Замените GetMicrosecondCount() на GetTickCount().
 
Sergey Gridnev #:
Это и был конструктив, вроде бы.

Замените GetMicrosecondCount() на GetTickCount().
Речь вел о том, чтобы не сводить обсуждение к гаданию. Попробуйте на своей машине. У меня ситуация ожидаемо не изменилась после замены.
 
fxsaber #:
мизерное исследование по самому Random.

В среднем MathRand выдает ~центр своего диапазона. Наверное, это правильно.

Нужно было убедиться в равномерности распределения.

void OnStart()
{
  const long Amount = 1e9;
  
  int Array[SHORT_MAX + 1];  
  ArrayInitialize(Array, 0);
  
  for (long i = 0; i < Amount; i++)
    Array[MathRand()]++;
    
  vector Vector;  
  Vector.Assign(Array);
  
#define TOSTRING(A) #A + " = " + (string)(Vector.##A()) + " "  
  Print(TOSTRING(Min) + TOSTRING(ArgMin));
  Print(TOSTRING(Max) + TOSTRING(ArgMax));
  Print(TOSTRING(Median));

  Print(Amount / SHORT_MAX);
}
Min = 29959.0 ArgMin = 11746 
Max = 31059.0 ArgMax = 28130 
Median = 30518.0 
30518

Подтвердилась.

 
fxsaber #:
Речь вел о том, чтобы не сводить обсуждение к гаданию. Попробуйте на своей машине. У меня ситуация ожидаемо не изменилась после замены.
Это очень странно и похоже на баг, т.к. GetTickCount() должен запрашивать значение у опереционки и, соответственно, при каждом запуске возвращать разное значение.
 
Sergey Gridnev #:
Это очень странно и похоже на баг, т.к. GetTickCount() должен запрашивать значение у опереционки и, соответственно, при каждом запуске возвращать разное значение.
Разрешающая способность этой функции столь велика, что будут возвращаться одинаковые значения.
#property tester_no_cache

input int inRange = 0;

double OnTester() { return(GetTickCount()); }

Запускаю в мат. режиме. Один проход значительно короче мин. шага GetTickCount.

 
fxsaber #:
Разрешающая способность этой функции столь велика, что будут возвращаться одинаковые значения.

Запускаю в мат. режиме. Один проход значительно короче мин. шага GetTickCount.

Ну, если это весь код тестируемого советника, то не удивительно.
В этом случае, лично я вижу выход в искусственном замедлении выполнения. Например, в OnInit() получить значение из GetTickCount(), сравнить его с аналогичным в OnTestet(), и если они равны, выполнить Sleep(1).
 
Sergey Gridnev #:
выполнить Sleep(1).
Sleep в Тестере эмулируется и является пустышкой в мат. режиме.
 

Как это понимать?

2026.05.16 15:54:50.365 Ticks   USDRUBrfd: received too many containers without changes [52]

uint getticks=2000;//количество тиков, которые необходимо получить      
      while(attempts<10)
      {
         //--- замерим время старта перед получением тиков
         uint start=GetTickCount();
//--- запросим тиковую историю с момента Data_GetTick
         received = CopyTicks(my_Sym_Name, arr_Tick, COPY_TICKS_ALL, dtStart, getticks);
         Print(my_Sym_Name," - Попытка №",attempts," Результат получения тиков",received);
         if(received!=-1)
         {
            //--- выведем информацию о количестве тиков и затраченном времени времени
            PrintFormat("%s: received %d ticks in %d ms",my_Sym_Name,received,GetTickCount()-start);
            //--- если тиковая история синхронизирована, то код ошибки равен нулю
            if(GetLastError()==0)
            {
               success=true;
               break;
            }
            else
               PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                           my_Sym_Name,received,GetTickCount()-start,_LastError);
         }
         attempts++;//--- считаем попытки
         Sleep(1000*60*5);//--- пауза в 300 секунд (5 минут) в ожидании завершения синхронизации тиковой базы

      }
В логе:
2026.05.16 15:53:34.485 Tick_Sinhronizator_AF (USDJPYrfd,M15)   USDRUBrfd - Попытка №0 Результат получения тиков-1
2026.05.16 15:58:34.505 Tick_Sinhronizator_AF (USDJPYrfd,M15)   USDRUBrfd - Попытка №1 Результат получения тиков2000
2026.05.16 15:58:34.505 Tick_Sinhronizator_AF (USDJPYrfd,M15)   USDRUBrfd: received 2000 ticks in 15 ms