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

 
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


 

Примечательно, что в платформе предусмотрен учёт разных событий, изменяющих баланс клиента, для этого используется сделка, процитирую справку:

"

Каждая сделка характеризуется типом, возможные значения перечислены в ENUM_DEAL_TYPE. Для получения информации о типе сделки используйте функцию HistoryDealGetInteger() с модификатором DEAL_TYPE.

ENUM_DEAL_TYPE

Идентификатор

Описание

DEAL_TYPE_BUY

Покупка

DEAL_TYPE_SELL

Продажа

DEAL_TYPE_BALANCE

Начисление баланса

DEAL_TYPE_CREDIT

Начисление кредита

DEAL_TYPE_CHARGE

Дополнительные сборы

DEAL_TYPE_CORRECTION

Корректирующая запись

DEAL_TYPE_BONUS

Перечисление бонусов

DEAL_TYPE_COMMISSION

Дополнительные комиссии

DEAL_TYPE_COMMISSION_DAILY

Комиссия, начисляемая в конце торгового дня

DEAL_TYPE_COMMISSION_MONTHLY

Комиссия, начисляемая в конце месяца

DEAL_TYPE_COMMISSION_AGENT_DAILY

Агентская комиссия, начисляемая в конце торгового дня

DEAL_TYPE_COMMISSION_AGENT_MONTHLY

Агентская комиссия, начисляемая в конце месяца

DEAL_TYPE_INTEREST

Начисления процентов на свободные средства

DEAL_TYPE_BUY_CANCELED

Отмененная сделка покупки. Возможная ситуация, когда ранее совершенная сделка на покупку отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_BUY) меняется на DEAL_TYPE_BUY_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией

DEAL_TYPE_SELL_CANCELED

Отмененная сделка продажи. Возможная ситуация, когда ранее совершенная сделка на продажу отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_SELL) меняется на DEAL_TYPE_SELL_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией

DEAL_DIVIDEND

Начисление дивиденда

DEAL_DIVIDEND_FRANKED

Начисление франкированного дивиденда (освобожденного от уплаты налога)

DEAL_TAX

Начисление налога

"

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

Уважаемые разработчики - ситуация скверна, столь значимый показатель затруднительно ретроспективно восстановить и проверить правильность исчисления.

 
Aleksey Vyazmikin #:

Примечательно, что в платформе предусмотрен учёт разных событий, изменяющих баланс клиента, для этого используется сделка, процитирую справку:

"

Каждая сделка характеризуется типом, возможные значения перечислены в ENUM_DEAL_TYPE. Для получения информации о типе сделки используйте функцию HistoryDealGetInteger() с модификатором DEAL_TYPE.

ENUM_DEAL_TYPE

Идентификатор

Описание

DEAL_TYPE_BUY

Покупка

DEAL_TYPE_SELL

Продажа

DEAL_TYPE_BALANCE

Начисление баланса

DEAL_TYPE_CREDIT

Начисление кредита

DEAL_TYPE_CHARGE

Дополнительные сборы

DEAL_TYPE_CORRECTION

Корректирующая запись

DEAL_TYPE_BONUS

Перечисление бонусов

DEAL_TYPE_COMMISSION

Дополнительные комиссии

DEAL_TYPE_COMMISSION_DAILY

Комиссия, начисляемая в конце торгового дня

DEAL_TYPE_COMMISSION_MONTHLY

Комиссия, начисляемая в конце месяца

DEAL_TYPE_COMMISSION_AGENT_DAILY

Агентская комиссия, начисляемая в конце торгового дня

DEAL_TYPE_COMMISSION_AGENT_MONTHLY

Агентская комиссия, начисляемая в конце месяца

DEAL_TYPE_INTEREST

Начисления процентов на свободные средства

DEAL_TYPE_BUY_CANCELED

Отмененная сделка покупки. Возможная ситуация, когда ранее совершенная сделка на покупку отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_BUY) меняется на DEAL_TYPE_BUY_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией

DEAL_TYPE_SELL_CANCELED

Отмененная сделка продажи. Возможная ситуация, когда ранее совершенная сделка на продажу отменяется. В таком случае тип ранее совершенной сделки (DEAL_TYPE_SELL) меняется на DEAL_TYPE_SELL_CANCELED, а ее прибыль/убыток обнуляется. Ранее полученная прибыль/убыток начисляется/списывается со счета отдельной балансовой операцией

DEAL_DIVIDEND

Начисление дивиденда

DEAL_DIVIDEND_FRANKED

Начисление франкированного дивиденда (освобожденного от уплаты налога)

DEAL_TAX

Начисление налога

"

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

Уважаемые разработчики - ситуация скверна, столь значимый показатель затруднительно ретроспективно восстановить и проверить правильность исчисления.

А разве своп это отдельная сделка?
 
Alexey Viktorov #:
А разве своп это отдельная сделка?
В том то и дело, что по своему смыслу - да. Это запись, которая влияет на финансовый результат, производящаяся на основании договорных отношений между сторонами. А значит, такая запись должна подлежать проверке, для чего должна быть возможность ретроспективно узнать время её произведения и восстановить ценообразование. Если она в пунктах, то должна быть возможность получить значение пунктов, по времени рассчитать кросс-курс и перевести значение в валюту депозита. Сейчас же остаётся только верить честности форекс-дилера. Вы верите?