Build 574. Как заставить iMAOnArray работать?

 

Всем привет и доброго здоровИя в новом году!

И всё-таки решил обновиться до версии 574. Впечатление от терминала и от нового эдитора крайне положительны. Но похоже, что не всё так шоколадно и придётся заново разбираться.

Теперь конкретно к коду. Набросал для проверки работоспособности iMAOnArray вот такой простенький код:

   int i;
   
   double arr1[];
   ArrayResize(arr1,15);
   ArraySetAsSeries(arr1,true);

   for(i=0;i<15;i++)
   {
      arr1[i]=Close[i];   
   }
   
   Print(arr1[5]," ",arr1[4]," ",arr1[3]," ",arr1[2]," ",arr1[1]," ",arr1[0]);   

   double arr2[];
   ArrayResize(arr2,10);
   ArraySetAsSeries(arr2,true);


   for(i=0;i<10;i++)
   {
      arr2[i]=iMAOnArray(arr1,0,5,0,MODE_SMA,i);
   }

   Print(arr2[5]," ",arr2[4]," ",arr2[3]," ",arr2[2]," ",arr2[1]," ",arr2[0]);  

Из распечатки:

2014.01.14 16:11:15.250 2000.01.03 04:00 TEST_iMAOnArray EURUSD,H1: 1.0077 1.00778 1.00806 1.00792 1.0079 1.00762
2014.01.14 16:11:15.250 2000.01.03 04:00 TEST_iMAOnArray EURUSD,H1: 1.0062 1.0128 1.0137 1.0171 1.0175 1.0173
2014.01.14 16:11:14.218 2000.01.03 03:00 TEST_iMAOnArray EURUSD,H1: 1.0077 1.00778 1.00806 1.00792 1.0079 1.00762
2014.01.14 16:11:14.218 2000.01.03 03:00 TEST_iMAOnArray EURUSD,H1: 1.0062 1.0062 1.0128 1.0137 1.0171 1.017
2014.01.14 16:11:13.046 2000.01.03 02:00 TEST_iMAOnArray EURUSD,H1: 1.0077 1.00778 1.00806 1.00792 1.0079 1.00762
2014.01.14 16:11:13.046 2000.01.03 02:00 TEST_iMAOnArray EURUSD,H1: 1.0088 1.0062 1.0062 1.0128 1.0137 1.014
2014.01.14 16:11:10.281 2000.01.03 01:00 TEST_iMAOnArray EURUSD,H1: 1.0077 1.00778 1.00806 1.00792 1.0079 1.00762
2014.01.14 16:11:10.281 2000.01.03 01:00 TEST_iMAOnArray EURUSD,H1: 1.0096 1.0088 1.0062 1.0062 1.0128 1.0129
2014.01.14 16:10:37.828 2000.01.03 00:00 TEST_iMAOnArray EURUSD,H1: 1.0077 1.00778 1.00806 1.00792 1.0079 1.00762
2014.01.14 16:10:37.828 2000.01.03 00:00 TEST_iMAOnArray EURUSD,H1: 1.0087 1.0096 1.0088 1.0062 1.0062 1.0073

видно, iMAOnArray срабатывает при первом вызове, а затем обновленный массив по какой-то причине не обрабатывается.

Что не так?

 
VBAG:

Теперь конкретно к коду. Набросал для проверки работоспособности iMAOnArray вот такой простенький код:



Будем разбираться.

Приведите, пожалуйста, весь код, а не фрагмент

 
stringo:

Будем разбираться.

Приведите, пожалуйста, весь код, а не фрагмент


Слава, это весь код, который я скомпелил в советник и запустил на часовках по ценам открытия(для наглядности).

С уважением,

Владимир

 
stringo:

Будем разбираться.


Похоже на то, что это проблема не только в iMAOnArray. С iCCIOnArray и iRSIOnArray похожая ситуация. Остальные функции для работы с массивами не проверял.
 
VBAG:

Слава, это весь код, который я скомпелил в советник и запустил на часовках по ценам открытия(для наглядности).

С уважением,

Владимир



Это не весь код. Это всего лишь часть некой функции.

Приведите, пожалуйста, весь исходник. Мы можем додумать, но лучше не надо.

У нас есть подозрение на один очень тонкий момент. Момент настолько тонок, что лучше использовать именно Ваш исходник целиком.

 
stringo:

Это не весь код. Это всего лишь часть некой функции.

Приведите, пожалуйста, весь исходник. Мы можем додумать, но лучше не надо.

У нас есть подозрение на один очень тонкий момент. Момент настолько тонок, что лучше использовать именно Ваш исходник целиком.

Пожалуйста...
Файлы:
 

Спасибо.

Мы нашли проблему. И пока мы её не решили, есть обходные способы.

1. Перенесите объявление массива double arr1[] на глобальный уровень

2. Объявите массив arr1 статическим и уберите ArrayResize

   static double arr1[15];
   ///ArrayResize(arr1,15);
   ArraySetAsSeries(arr1,true);
 

Исправили. В следующем билде будет исправление.

Однако, далее используйте один из предложенных обходных способов. Иначе на каждом OnTick у Вас будет создаваться новая копия iMAOnArray, что неэффективно. (Новая копия, потому что на каждом новом OnTick - каждый раз новый массив)

 
stringo:

Спасибо.

Мы нашли проблему. И пока мы её не решили, есть обходные способы.

1. Перенесите объявление массива double arr1[] на глобальный уровень

2. Объявите массив arr1 статическим и уберите ArrayResize


Вот такую конструкцию часто использую и работает она как часы на версии 509 и на всех предыдущих:

#property copyright "Vladimir"
#property link      "*"
#property version   "2.00"
#property strict

double MA[];
////////////
int OnInit()
{
   ArraySetAsSeries(MA,true);
   ArrayResize(MA,10);

   return(INIT_SUCCEEDED);
}
/////////////
void OnTick()
{
   SetMA(MA);
   
   Comment(MA[5],"  ",MA[4],"  ",MA[3],"  ",MA[2],"  ",MA[1],"  ",MA[0]);   
}
//////////////////////
void SetMA(double& mov[])
{
   int i=0;
   double tmp[];
   ArraySetAsSeries(tmp,true);
   ArrayResize(tmp,15);
   
   for(i=0;i<15;i++)
   {
      tmp[i]=Close[i];   
   }

   for(i=0;i<10;i++)
   {
      mov[i]=iMAOnArray(tmp,0,5,0,MODE_SMA,i);
   }
}
///

На 574 обход №2:

void SetMA(double& mov[])
{
   int i=0;
   static double tmp[15];
   ArraySetAsSeries(tmp,true);
   
   for(i=0;i<15;i++)
   {
      tmp[i]=Close[i];   
   }

   for(i=0;i<10;i++)
   {
      mov[i]=iMAOnArray(tmp,0,5,0,MODE_SMA,i);
   }
}

всё равно не работает.

Да и как то незачем, с точки зрения программирования, временный массив объявлять статическим.

Обход №1 не пробовал, но то же как-то не по душе передавать по ссылке временный массив.

Буду ждать нового релиза, прежде чем брошусь переписывать сотни строк кода.

 

Посмотрите список отличий компиляторов в шапке темы.

Вот это отличие: "Локальные массивы освобождаются при выходе из блока {}" ответственно за указанное поведение. В старой четвёрке массивы не освобождались, поэтому один и тот же буфер безболезненно использовался при расчётах индикатора OnArray

Странно, что не работает "обход №2". Я его посоветовал только после того, как несколько раз перепроверил.

 
stringo:

Посмотрите список отличий компиляторов в шапке темы.

Спасибо. Новый компилятор еще предстоит подробно изучать.

Пока меня волнует только один шкурный вопрос:

- можно ли будет в новом компиляторе функции iMAOnArray, iCCIOnArray, iBandsOnArray, iEnvelopesOnArray ...... применять к локальным динамическим массивам?

Если можно, то как?

Причина обращения: