Все норм. Может перезапуск терминала поможет...
Нет :(
Мне бы хоть пример найти, где буфер индикатора заполняется через CopyBuffer(), я бы сам разобрался дальше :(
Мне бы хоть пример найти, где буфер индикатора заполняется через CopyBuffer(), я бы сам разобрался дальше :(
Artem Ipatov:
Нет :(
Мне бы хоть пример найти, где буфер индикатора заполняется через CopyBuffer(), я бы сам разобрался дальше :(
Нет :(
Мне бы хоть пример найти, где буфер индикатора заполняется через CopyBuffer(), я бы сам разобрался дальше :(
Мне кажется ошибка тут
CustomHandle=iCustom(OtherSymbol,_Period,"PercentChangeHistogram","");
Ведь вы получаете хендл индикатора по текущему символу, но рсчитываться индикатор должен по символу который указан во входных параметрах.
Artem Ipatov:
Нет :(
Мне бы хоть пример найти, где буфер индикатора заполняется через CopyBuffer(), я бы сам разобрался дальше :(
Нет :(
Мне бы хоть пример найти, где буфер индикатора заполняется через CopyBuffer(), я бы сам разобрался дальше :(
В статьях должна быть статья, что-то типа "Индикатор от индикатора". Но у меня-то работает этот код нормально (тот который выше).
Я разобрался, там нужно учитывать, что данные не с первой попытки копируются по другому инструменту. Таймеры использовать нельзя в индикаторах. Нужно на каждом тике пытаться копировать данные из буфера другого символа, пока не скопируются. Еще, нужно учесть что в индексация в массиве который мы получаем, будет не как в индикаторном массиве (не тайм-серия).
Ниже не очень оптимальный код основного расчёта в OnCalculate(). Главное, что смысл понятен:
Ниже не очень оптимальный код основного расчёта в OnCalculate(). Главное, что смысл понятен:
if (!Init) //флаг первый вызов { Copy=CopyBuffer(CustomHandle,0,0,OtherSymbolDepth,DataBuffer); int Copy2=CopyBuffer(CustomHandle,1,0,OtherSymbolDepth,ColorsBuffer); if (Copy!=-1 && Copy2!=-1) {Comment ("Init is OK. Loading current bar data...");Init=true;} else Comment ("Loading initial data..."); } else { for (int bar=start;bar<rates_total;bar++) //основной цикл для расчета непосчитанных баров { Copy=CopyBuffer(CustomHandle,0,rates_total-bar,1,SomeBuffer); if (Copy==-1) Comment ("Loading last bars data..."); else { Comment ("OK!"); DataBuffer[rates_total-1-bar]=SomeBuffer[0]; if (DataBuffer[rates_total-1-bar]>0) ColorsBuffer[rates_total-1-bar]=0.0; else ColorsBuffer[rates_total-1-bar]=1.0; } } }
Есть очень простой способ, если что-то в OnCalculate пошло не так, то делаем - return(0), от этого на следующем тике будет полный пересчет. Разумеется если start вычисляется с учетом prev_calculated.
Artem Ipatov:
Я разобрался, там нужно учитывать, что данные не с первой попытки копируются по другому инструменту. Таймеры использовать нельзя в индикаторах. Нужно на каждом тике пытаться копировать данные из буфера другого символа, пока не скопируются. Еще, нужно учесть что в индексация в массиве который мы получаем, будет не как в индикаторном массиве (не тайм-серия).
Ниже не очень оптимальный код основного расчёта в OnCalculate(). Главное, что смысл понятен:
Я разобрался, там нужно учитывать, что данные не с первой попытки копируются по другому инструменту. Таймеры использовать нельзя в индикаторах. Нужно на каждом тике пытаться копировать данные из буфера другого символа, пока не скопируются. Еще, нужно учесть что в индексация в массиве который мы получаем, будет не как в индикаторном массиве (не тайм-серия).
Ниже не очень оптимальный код основного расчёта в OnCalculate(). Главное, что смысл понятен:
это где такое написано?
Taras Slobodyanik:
В справочнике написано так, что предполагается использование их в индикаторах. Получается, что Артём ошибается.
это где такое написано?
Artem Ipatov:
С первого раза данные не копируются.Как-то так:
else //если input переменная содержит НЕ пустую строку, пытаемся заполнить индикаторный массив копированием данных буфера внешнего индикатора { int count=0; if(prev_calculated<1) { count=rates_total; int calculated=BarsCalculated(CustomHandle); if(count>calculated) count=calculated; } else count=rates_total-prev_calculated+1; int Copy=CopyBuffer(CustomHandle,0,int(0),count,DataBuffer); // НА ЭТОМ МЕСТЕ ВСЕГДА ОШИБКА if (Copy==-1) { //Print("CopyBuffer() failed!"); ChartSetSymbolPeriod(0,_Symbol,PERIOD_CURRENT); return(0); } }
Aleksey Lebedev:
С первого раза данные не копируются.
Как-то так:
// НА ЭТОМ МЕСТЕ ВСЕГДА ОШИБКА
может потому что вы всегда, с первого раза, копируете 0 (или -1) баров?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день!
Не получается наполнить индикаторный буфер с помощью функции CopyBuffer: функция всегда возвращает -1 независимо от вводных данных. Не могу понять, что я делаю не так. Видимо, не понимаю чего-то фундаментального в индикаторах. Не смог найти материал на сайте, где бы подобное разъяснялось, поэтому прошу помощи :(
Идея заключается в том, что я хочу построить примитивный (взят для примера) индикатор на основе его же самого, но для другого символа, через функцию iCustom но с другими параметрами (другой символ). Нужно это для того, чтобы иметь возможность вызвать этот индикатор, построенный по другому символу в окне произвольного символа.
Ниже прикрепляю реализацию и файл моего примера: