iCustom - как избежать перегрузки уже загруженного индикатора? - страница 2

 
Henry_White писал(а) >>

В поиске много мусора... Им я уже пользовался, но ничего на глаза не попалось толкового (но то ли от лени, то ли от невезения). Зато сегодня нашел в справке (Справочник MQL4 - Стандартные константы - Причины деинициализации), хотя легче от этого не стало )))

Так и не разрешился этот вопрос? Кинь в личку, если не суперсекретный индикатор - посмотрю.

 
Henry_White >>:

Добрый день, коллеги,

Может кто сталкивался с такой проблемой, при обращении к какому либо индикатору через вызов iCustom, вызываемый индикатор полностью перегружается, даже если был загружен до вызова. Это можно как-нибудь обойти?

Пример:

  1. загружен и работает индикатор MyOwn
  2. загружаем другой индикатор и из него запрашиваем значения первого: iCustom(NULL, 0, "MyOwn",0,idx);
  3. индикатор MyOwn полностью перегружается (deinit, init и т.д.)

у меня подобное было!


все корректно работало если я вызывал индикатор по одной паре!

когда начинал вызывать по 6 парам шла перезагрузка

я пришел к выводу что это из за нехватки памяти

т е грузилась серия данных по паре потом по второй паре потом по третьей и т д

--

 
Integer >>:

Так и не разрешился этот вопрос? Кинь в личку, если не суперсекретный индикатор - посмотрю.


YuraZ 22.09.2009 07:44

у меня подобное было!
все корректно работало если я вызывал индикатор по одной паре!

Коллеги, спасибо что откликнулись!

2 YuraZ: К сожалению, я подобное имею на одной и той же паре с одинаковым ТФ.

Integer: ИМНО, это было бы с моей стороны очень невежливо, если бы я кинул вам все 170 Кб исходников. Я сам уже в них теряюсь после недельного перерыва )) 

Чтобы Вы не тратили свое время попусту, я быстренько соорудил парочку связанных индикаторов, которые ведут себя аналогичным образом (полностью индюки в аттача, а тут только часть кода).

Сдается мне, что я борюсь с ветреными мельницами )))... Наверно нужно смириться ))

Это Слейв:

int init()
{
IndicatorShortName("Ind2");
SetIndexBuffer(0,Buffer1);
SetIndexStyle(0,DRAW_LINE);
SetIndexDrawBegin(0,Period_MA);
return(0);
}

int start()
{
int counted=IndicatorCounted();
if (Bars-1<100)return(0);
if (counted < 0) return (-1);
if (counted > 0) counted--;

int MaxBar=Bars-1;
int limit=MaxBar-counted;

for(int i=limit; i>=0; i--) {
   Buffer1[i] = iCustom(NULL, 0, "Ind1",1,i);
}
return(0);
}


Это Мастер соотв-но:

int init()
{
IndicatorShortName("Ind1");
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_NONE);
SetIndexDrawBegin(0,Period_MA);
SetIndexDrawBegin(1,Period_MA);
return(0);
}

int start()
{
int counted=IndicatorCounted();
if (Bars-1<100)return(0);
if (counted < 0) return (-1);
if (counted > 0) counted--;

int MaxBar=Bars-1;
int limit=MaxBar-counted;

for(int i=limit; i>=0; i--) {
   Buffer1[i] = iMA(NULL,0,Period_MA, 0,0,PRICE_LOW,i);
   Buffer2[i] = iMA(NULL,0,Period_MA/2, 0,0,PRICE_HIGH,i);
}
return(0);
}

И как результат имеем перегрузку Мастера (ind1) при перекомпиляции Слэйва (ind2):

2009.09.23 00:38:34 Ind1 EURJPY,M1: initialized
2009.09.23 00:38:34 Ind1 EURJPY,M1: loaded successfully
2009.09.23 00:38:34 ind2 EURJPY,M1: initialized
2009.09.23 00:38:34 ind2 EURJPY,M1: loaded successfully
2009.09.23 00:38:34 Ind1 EURJPY,M1: removed
2009.09.23 00:38:34 Ind1 EURJPY,M1: uninit reason 1
2009.09.23 00:38:34 ind2 EURJPY,M1: uninit reason 2

Файлы:
 

Такой советник:

int start()
  {
//----
   double z=iCustom(NULL,0,"ind2",0,0);   
   double x=iCustom(NULL,0,"ind2",1,0);   
//----
   return(0);
  }

Два индикатора загрузилось и больше нет.

Файлы:
e2.mq4  2 kb
 
Henry_White >>:


Коллеги, спасибо что откликнулись!

2 YuraZ: К сожалению, я подобное имею на одной и той же паре с одинаковым ТФ.

2 Integer: ИМНО, это было бы с моей стороны очень невежливо, если бы я кинул вам все 170 Кб исходников. Я сам уже в них теряюсь после недельного перерыва ))

Чтобы Вы не тратили свое время попусту, я быстренько соорудил парочку связанных индикаторов, которые ведут себя аналогичным образом (полностью индюки в аттача, а тут только часть кода).

Сдается мне, что я борюсь с ветреными мельницами )))... Наверно нужно смириться ))

Это Слейв:

int init()
{
IndicatorShortName("Ind2");
SetIndexBuffer(0,Buffer1);
SetIndexStyle(0,DRAW_LINE);
SetIndexDrawBegin(0,Period_MA);
return(0);
}

int start()
{
int counted=IndicatorCounted();
if (Bars-1<100)return(0);
if (counted < 0) return (-1);
if (counted > 0) counted--;

int MaxBar=Bars-1;
int limit=MaxBar-counted;

for(int i=limit; i>=0; i--) {
Buffer1[i] = iCustom(NULL, 0, "Ind1",1,i);
}
return(0);
}


Это Мастер соотв-но:

int init()
{
IndicatorShortName("Ind1");
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_NONE);
SetIndexDrawBegin(0,Period_MA);
SetIndexDrawBegin(1,Period_MA);
return(0);
}

int start()
{
int counted=IndicatorCounted();
if (Bars-1<100)return(0);
if (counted < 0) return (-1);
if (counted > 0) counted--;

int MaxBar=Bars-1;
int limit=MaxBar-counted;

for(int i=limit; i>=0; i--) {
Buffer1[i] = iMA(NULL,0,Period_MA, 0,0,PRICE_LOW,i);
Buffer2[i] = iMA(NULL,0,Period_MA/2, 0,0,PRICE_HIGH,i);
}
return(0);
}

И как результат имеем перегрузку Мастера (ind1) при перекомпиляции Слэйва (ind2):

2009.09.23 00:38:34 Ind1 EURJPY,M1: initialized
2009.09.23 00:38:34 Ind1 EURJPY,M1: loaded successfully
2009.09.23 00:38:34 ind2 EURJPY,M1: initialized
2009.09.23 00:38:34 ind2 EURJPY,M1: loaded successfully
2009.09.23 00:38:34 Ind1 EURJPY,M1: removed
2009.09.23 00:38:34 Ind1 EURJPY,M1: uninit reason 1
2009.09.23 00:38:34 ind2 EURJPY,M1: uninit reason 2

если уйти от этой конструкции


Buffer1[i] = iMA(NULL,0,Period_MA, 0,0,PRICE_LOW,i);


проблема отпадет!

вы в память грузите !!! очень много ! ЗАЧЕМ ?

 

2 YuraZ: Это гипотетический пример. И Вы наверно имели ввиду Buffer2[i] = iMA(NULL,0,Period_MA/2, 0,0,PRICE_HIGH,i)... Buffer1 - индиктаторный буфер.

Я сделал этот пример для демонстрации перегрузки мастер-индикатора. Безусловно, на практике я никогда не буду перегонять данные таким образом.


2 Integer: Загрузите ind1, затем ind2... После загрузки ind2 система перегрузит уже загруженный ind1. Это я и хотел продемонстрировать. С советниками другая тема. Они работают в отдельном потоке, а индюки в интерфейсном.

 
Henry_White писал(а) >>

2 Integer: Загрузите ind1, затем ind2... После загрузки ind2 система перегрузит уже загруженный ind1. Это я и хотел продемонстрировать. С советниками другая тема. Они работают в отдельном потоке, а индюки в интерфейсном.

Все правильно, терминал так устроен. Ind1 сам по себе, ind2 пользуется ind1 и загружает его для себя.

 
Integer >>:

Все правильно, терминал так устроен. Ind1 сам по себе, ind2 пользуется ind1 и загружает его для себя.

Rosh говорит что не должен (см. 2-й пост). Мне нет повода не верить человеку, который является членом команды разработчиков... Т.е. если мастер-индикатор уже загружен, то смысла в его перегрузке нет, что логично.

 
YuraZ >>:

если уйти от этой конструкции

Buffer1[i] = iMA(NULL,0,Period_MA, 0,0,PRICE_LOW,i);

проблема отпадет!

вы в память грузите !!! очень много ! ЗАЧЕМ ?

И кстати, почему все так боятся использовать память? Даже если вы будете держать МА от цен HLOC в массивах (при глубине истории баров в 512 000) это займет всего 28 Мб, что во общем-то копейки, по сравнению с объемом оперативки (сомневаюсь что у кого-то стоит сейчас меньше Гига). А Вы теперь посчитайте, сколько процессорного времени займет побарный расчет МА при многократном обращении?!...  Хотя конечно, у каждого разные приоритеты. Для меня важна скорость, поэтому первичные данные я держу в массивах.

 
Henry_White писал(а) >>

Rosh говорит что не должен (см. 2-й пост). Мне нет повода не верить человеку, который является членом команды разработчиков... Т.е. если мастер-индикатор уже загружен, то смысла в его перегрузке нет, что логично.

Во-первых, есть большая разница в "перезагружать" и "загружать еще один". Так вот, еще раз объясняю - первый индикатор работает сам по себе на графике, а второй индикатор загружает первый для себя, но первый (который на графике) при этом не выгружается, он так и остается на графике, о логичности и неллогично можно много рассуждать, но терминал устроен именно так. Rosh писал о другом - и перезагрузке пользовательского индикатора с одинаковыми параметрами при повтороном обращении к нему из одной программы - это частая ошибка при использовании iCustom().

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