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

 
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-:

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

Своп.
 
Не компилируется
template <typename T1, typename T2>
void Func( T2 ) {}

void OnStart()
{
  Func<int>(0);
}
 
fxsaber:
Своп.

Спасибо!

Я усомнился, что он в тестере учитывается, так как не вижу, где он там отображается.

 
fxsaber:
Не компилируется
Э не, так это не работает. Или полный список, или нет списка.
 
Комбинатор:
Э не, так это не работает. Или полный список, или нет списка.
Ну так зачем заставлять плодить такие конструкции, когда все и так понятно?
template <typename T1>
class T
{
public:  
  template <typename T2>
  static void Func( T2 ) {}
};


void OnStart()
{
  T<int>::Func(0);
}
Причем такой обход ограничения годится не для всех методов, а только для статических.