Теперь конкретно к коду. Набросал для проверки работоспособности iMAOnArray вот такой простенький код:
Будем разбираться.
Приведите, пожалуйста, весь код, а не фрагмент
Будем разбираться.
Приведите, пожалуйста, весь код, а не фрагмент
Слава, это весь код, который я скомпелил в советник и запустил на часовках по ценам открытия(для наглядности).
С уважением,
Владимир
Будем разбираться.
Слава, это весь код, который я скомпелил в советник и запустил на часовках по ценам открытия(для наглядности).
С уважением,
Владимир
Это не весь код. Это всего лишь часть некой функции.
Приведите, пожалуйста, весь исходник. Мы можем додумать, но лучше не надо.
У нас есть подозрение на один очень тонкий момент. Момент настолько тонок, что лучше использовать именно Ваш исходник целиком.
Это не весь код. Это всего лишь часть некой функции.
Приведите, пожалуйста, весь исходник. Мы можем додумать, но лучше не надо.
У нас есть подозрение на один очень тонкий момент. Момент настолько тонок, что лучше использовать именно Ваш исходник целиком.
Спасибо.
Мы нашли проблему. И пока мы её не решили, есть обходные способы.
1. Перенесите объявление массива double arr1[] на глобальный уровень
2. Объявите массив arr1 статическим и уберите ArrayResize
static double arr1[15]; ///ArrayResize(arr1,15); ArraySetAsSeries(arr1,true);
Исправили. В следующем билде будет исправление.
Однако, далее используйте один из предложенных обходных способов. Иначе на каждом OnTick у Вас будет создаваться новая копия iMAOnArray, что неэффективно. (Новая копия, потому что на каждом новом OnTick - каждый раз новый массив)
Спасибо.
Мы нашли проблему. И пока мы её не решили, есть обходные способы.
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". Я его посоветовал только после того, как несколько раз перепроверил.
Спасибо. Новый компилятор еще предстоит подробно изучать.
Пока меня волнует только один шкурный вопрос:
- можно ли будет в новом компиляторе функции iMAOnArray, iCCIOnArray, iBandsOnArray, iEnvelopesOnArray ...... применять к локальным динамическим массивам?
Если можно, то как?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет и доброго здоровИя в новом году!
И всё-таки решил обновиться до версии 574. Впечатление от терминала и от нового эдитора крайне положительны. Но похоже, что не всё так шоколадно и придётся заново разбираться.
Теперь конкретно к коду. Набросал для проверки работоспособности iMAOnArray вот такой простенький код:
Из распечатки:
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 срабатывает при первом вызове, а затем обновленный массив по какой-то причине не обрабатывается.
Что не так?