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

 
Slava:
И не должно быть возможно


1. когда планируется ввод union?

2. с вводом union будут введены так же typedef?

3. планируется ли ввод указателей на фундаментальные типы?
 
Konstantin:


1. когда планируется ввод union?

2. с вводом union будут введены так же typedef?

3. планируется ли ввод указателей на фундаментальные типы?

1. Скоро. В компиляторе уже всё готово, тестируем. После тестов выпустим.

2. Пока неизвестно, когда

3. Не планируется.

 

Почему-то ф-я CopyTime (или любая подобная) ресайзит приемный массив, даже если размер приемного массива больше, чем нужно скопировать.

Господа, это нормально? Так было всегда? Или баг?

Для примера:

static datetime TimeBuf[]; 

if (ArraySize(TimeBuf) == 0) ArrayResize(TimeBuf, 10);

CopyTime(_Symbol, _Period, 0, 1, TimeBuf);

Функция CopyTime изменяет размер массива TimeBuf в 1.

Это неправильно в принципе.

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

 
Marat Sultanov:

Почему-то ф-я CopyTime (или любая подобная) ресайзит приемный массив, даже если размер приемного массива больше, чем нужно скопировать.

Господа, это нормально? Так было всегда? Или баг?

Для примера:

Функция CopyTime изменяет размер массива TimeBuf в 1.

Это неправильно в принципе.

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

Ваш массив - динамический! То есть, с изменяемым размером. Так как Вы не указали его размерность в квадратных скобках.

Слово static означает, что объект этого массива конструируется при загрузке эксперта и уничтожается при выгрузке

 
Slava:

Ваш массив - динамический! То есть, с изменяемым размером. Так как Вы не указали его размерность в квадратных скобках.

Слово static означает, что объект этого массива конструируется при загрузке эксперта и уничтожается при выгрузке

Простите, но вы не поняли суть.

Пусть массив будет объявлен в глобальной области

datetime _TimeBuf[]; 

void OnTick()
{}

Тогда:

1) Первый раз мы скопируем (CopyTime) в массив сколько есть баров.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      if (_BarsCountReserveSize <= BarsCount) _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
}

2) По оптимальному замыслу при появлении нового бара нам нет смысла копировать все бары, верно? Поэтому мы решаем копировать только 2 последних измененных бара.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
   else
   {
      int RequiredCount = BarsCount - ArraySize(_TimeBuf) + 1;
      
      ArrayResize(_TimeBuf, RequiredCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, RequiredCount, _TimeBuf);
   }
}

3) В итоге наш оптимизация не срабатывает, т.к. CopyTime ресайзит массив и ставит размер = RequiredCount, плюс мы теряем резервный размер (CopyTime не в курсе о ней).

 

Этой ситуации не было бы, если CopyTime копировал сразу с конца массива в место начала:

в место:

_TimeBuf[0] = D'2017.01.01';
_TimeBuf[1] = D'2017.01.02';
_TimeBuf[2] = D'2017.01.03';

это:

const int ArrSize = ArraySize(_TimeBuf);

_TimeBuf[ArrSize-3] = D'2017.01.01';
_TimeBuf[ArrSize-2] = D'2017.01.02';
_TimeBuf[ArrSize-1] = D'2017.01.03';
 

Copy-функции всегда изменяли размер динамического массива. В большую или меньшую сторону. Но всегда было чёткое соответствие с количеством записей, отданных в результате запроса.

В Вашем случае первоначальный запрос в массив с динамически изменяемым размеров. Все остальные запросы, которые запрашивают по одному элементу осуществляйте в массив с заранее известным размером (datetime _TimeBuf1[1]), чтобы не было никакого перераспределения. Самостоятельно перекладывайте полученный элемент в большой динамический массив

 

Значит всегда так было и это нормально. Понял. Благодарю за ответ!

Об расширении я был в курсе, а вот об уменьшении под размер запрашиваемых данных, нет. Теперь буду знать, спасибо!

 

MT4 билд 1065

Тест на USDJPY TF M15

из журнала результатов:

406 2014.11.28 20:30 sell 18 5.50 118.641 0.000 117.015 0.00 
521 2014.12.09 17:15 t/p 18 5.50 118.386 0.000 118.386 -148.95 

Каким образом убыток получается?
 
-Aleks-:

Каким образом убыток получается?

Своп.
Причина обращения: