Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В поиске много мусора... Им я уже пользовался, но ничего на глаза не попалось толкового (но то ли от лени, то ли от невезения). Зато сегодня нашел в справке (Справочник MQL4 - Стандартные константы - Причины деинициализации), хотя легче от этого не стало )))
Так и не разрешился этот вопрос? Кинь в личку, если не суперсекретный индикатор - посмотрю.
Добрый день, коллеги,
Может кто сталкивался с такой проблемой, при обращении к какому либо индикатору через вызов iCustom, вызываемый индикатор полностью перегружается, даже если был загружен до вызова. Это можно как-нибудь обойти?
Пример:
у меня подобное было!
все корректно работало если я вызывал индикатор по одной паре!
когда начинал вызывать по 6 парам шла перезагрузка
я пришел к выводу что это из за нехватки памяти
т е грузилась серия данных по паре потом по второй паре потом по третьей и т д
--
Так и не разрешился этот вопрос? Кинь в личку, если не суперсекретный индикатор - посмотрю.
YuraZ 22.09.2009 07:44
у меня подобное было!
все корректно работало если я вызывал индикатор по одной паре!
Коллеги, спасибо что откликнулись!
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
Такой советник:
Два индикатора загрузилось и больше нет.
Коллеги, спасибо что откликнулись!
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. Это я и хотел продемонстрировать. С советниками другая тема. Они работают в отдельном потоке, а индюки в интерфейсном.
2 Integer: Загрузите ind1, затем ind2... После загрузки ind2 система перегрузит уже загруженный ind1. Это я и хотел продемонстрировать. С советниками другая тема. Они работают в отдельном потоке, а индюки в интерфейсном.
Все правильно, терминал так устроен. Ind1 сам по себе, ind2 пользуется ind1 и загружает его для себя.
Все правильно, терминал так устроен. Ind1 сам по себе, ind2 пользуется ind1 и загружает его для себя.
Rosh говорит что не должен (см. 2-й пост). Мне нет повода не верить человеку, который является членом команды разработчиков... Т.е. если мастер-индикатор уже загружен, то смысла в его перегрузке нет, что логично.
если уйти от этой конструкции
Buffer1[i] = iMA(NULL,0,Period_MA, 0,0,PRICE_LOW,i);
проблема отпадет!
вы в память грузите !!! очень много ! ЗАЧЕМ ?
И кстати, почему все так боятся использовать память? Даже если вы будете держать МА от цен HLOC в массивах (при глубине истории баров в 512 000) это займет всего 28 Мб, что во общем-то копейки, по сравнению с объемом оперативки (сомневаюсь что у кого-то стоит сейчас меньше Гига). А Вы теперь посчитайте, сколько процессорного времени займет побарный расчет МА при многократном обращении?!... Хотя конечно, у каждого разные приоритеты. Для меня важна скорость, поэтому первичные данные я держу в массивах.
Rosh говорит что не должен (см. 2-й пост). Мне нет повода не верить человеку, который является членом команды разработчиков... Т.е. если мастер-индикатор уже загружен, то смысла в его перегрузке нет, что логично.
Во-первых, есть большая разница в "перезагружать" и "загружать еще один". Так вот, еще раз объясняю - первый индикатор работает сам по себе на графике, а второй индикатор загружает первый для себя, но первый (который на графике) при этом не выгружается, он так и остается на графике, о логичности и неллогично можно много рассуждать, но терминал устроен именно так. Rosh писал о другом - и перезагрузке пользовательского индикатора с одинаковыми параметрами при повтороном обращении к нему из одной программы - это частая ошибка при использовании iCustom().