как правильно работыть с iCustom() - страница 3

 
khitenkov:

Прошу принять к сведенью разработчиков терминала.

что данная опперация не совсем корректно работает

так как я уже который час бьюсь и немогу принят те данные которые нужно, самми посудите чем отличается всеголиш 4 строки между собой и почему вторая строка не дает ответа ставильного

   ind_H1_b0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,0);
   ind_H1_b1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,10);
   ind_H1_b2 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,20);
   ind_H1_b3 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,21);
   
   Print(ind_H1_b0, " : ", ind_H1_b1, " : ", ind_H1_b2, " : ", ind_H1_b3);

Первая строка дает мне из 0 буффера плавающий но нудный ответ 0 бара.

вторая должна выдать мне 1 бар я его поменял на 10 может думаю глюк в 1 баре

и добавил еще 2 строки

и результат печатаю в журнал

а там просто хаос

как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже.. а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий.. глюк какойто

"как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже" - эти бары синенькие (Blue), их значения лежат в буфере UpBuffer, индекс этого буфера 0.

" а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий. . глюк какойто" - эти бары не синенькие, их значения лежат в других буферах, индекс этих буферов не равен нулю.

Вам всё правильно уже объяснили. Внимательно изучите свой индикатор. Ненулевое значение индикатора может лежать в любом из четырех буферов. Вы же проверяете только нулевой буфер.

 
Vita:
khitenkov:

Прошу принять к сведенью разработчиков терминала.

что данная опперация не совсем корректно работает

так как я уже который час бьюсь и немогу принят те данные которые нужно, самми посудите чем отличается всеголиш 4 строки между собой и почему вторая строка не дает ответа ставильного

   ind_H1_b0 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,0);
   ind_H1_b1 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,10);
   ind_H1_b2 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,20);
   ind_H1_b3 = iCustom(NULL, PERIOD_H1,"Power Trend",NumberOfBars,SmoothPeriod,SmoothMode,0,21);
   
   Print(ind_H1_b0, " : ", ind_H1_b1, " : ", ind_H1_b2, " : ", ind_H1_b3);

Первая строка дает мне из 0 буффера плавающий но нудный ответ 0 бара.

вторая должна выдать мне 1 бар я его поменял на 10 может думаю глюк в 1 баре

и добавил еще 2 строки

и результат печатаю в журнал

а там просто хаос

как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже.. а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий.. глюк какойто

"как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже" - эти бары синенькие (Blue), их значения лежат в буфере UpBuffer, индекс этого буфера 0.

" а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий. . глюк какойто" - эти бары не синенькие, их значения лежат в других буферах, индекс этих буферов не равен нулю.

Вам всё правильно уже объяснили. Внимательно изучите свой индикатор. Ненулевое значение индикатора может лежать в любом из четырех буферов. Вы же проверяете только нулевой буфер.


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

Потому как Один из буфферов несет значение, а остальные пустые в это время. И проверять каждый раз надо все, и брать тот, который не равен нулю.

 

Да это действительно так и оказалось.. тепер надо брать каждый буфер и его перепроверять.. долгий и кропотливай труд.. дабы получить еддиный..

кто может помочь обьеденить в советнике эти 4 буфера в 1.. для каждого бара или это проблемно и тоже долго ?

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

 

Сложи все буферы. Чтобы не было проблем, установи для каждого нулевой уровень функцией SetIndexEmptyValue() . Но я не уверен, что эта функция тут нужна.

Ой, Simca это уже написал...

 
Simca:
khitenkov:

как видите 0 бар всегда расчитывается.. 20 тоже.. 21 тоже.. а вот 10 почемуто 0.. чтоб я туда не писал..ни первый ни 2 ни третий.. глюк какойто

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

Если индикатор корректно обнуляет значения неиспользуемых цветовых буферов и присваивает значение только нужному буферу, то чтобы сильно не заморачиваться и не искать нужный буфер, можно попробовать просто сложить значения всех четырех (с 0 по 3, вроде на гистограмме используется 4 цвета) буферов для требуемого бара и по идее получится нужное значение индикатора (повторяю, прокатит если неиспользуемые буфера обнуляются).

Еще, часто разработчики (сам так делаю) сохраняют расчитанное значение индикатора (чтобы лишний раз не пересчитывать) во вспомогательном (не отображаемом) буфере, но вызвать то его значения из эксперта можно. :) Попробуйте запросить значения буферов с номером большим чем цветовых буферов на графике. Вполне возможно что где-нибудь в пятом (т.е. с индексом 4, т.к. с 0 считаем) буфере и будет нужное Вам значение индикатора (не придется ничего искать и суммировать). :)


Да прокатло очень даже скажу ничего..

//+------------------------------------------------------------------+
//| Считываем часовые бары индикатора  и запоминаем                  |
//+------------------------------------------------------------------+
// Верх
  ind_H1_Up_Up_0     = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 0, 0);
  ind_H1_Up_Up_1     = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 0, 1);
// Вниз
  ind_H1_Down_Down_0 = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 1, 0);
  ind_H1_Down_Down_1 = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 1, 1);
// Снизу вверх
  ind_H1_Down_Up_0   = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 2, 0);
  ind_H1_Down_Up_1   = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 2, 1);
// Сверху вниз
  ind_H1_Up_Down_0   = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 3, 0);
  ind_H1_Up_Down_1   = iCustom(NULL, PERIOD_H1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 3, 1);
//+------------------------------------------------------------------+
//| Считываем дневные бары индикатора и запоминаем                   |
//+------------------------------------------------------------------+
// Верх
  ind_D1_Up_Up_0     = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 0, 0);
  ind_D1_Up_Up_1     = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 0, 1);
// Вниз
  ind_D1_Down_Down_0 = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 1, 0);
  ind_D1_Down_Down_1 = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 1, 1);
// Снизу вверх
  ind_D1_Down_Up_0   = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 2, 0);
  ind_D1_Down_Up_1   = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 2, 1);
// Сверху вниз
  ind_D1_Up_Down_0   = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 3, 0);
  ind_D1_Up_Down_1   = iCustom(NULL, PERIOD_D1, "Power Trend", NumberOfBars, SmoothPeriod, SmoothMode, 3, 1);
 
  ind_sum_0 = ind_H1_Up_Up_0 + ind_H1_Down_Down_0 + ind_H1_Down_Up_0 + ind_H1_Up_Down_0;
  ind_sum_1 = ind_H1_Up_Up_1 + ind_H1_Down_Down_1 + ind_H1_Down_Up_1 + ind_H1_Up_Down_1;
 
  Print (ind_sum_0, " / ", ind_sum_1);
тепрь результат обьеденен, осталось малое, сравнить его и дать волю ) Всем спасибо. Действительно стоющий форум со Знатоками. Всех благ Товарищи и процветания. Будут еще вопросы обязательно напишу. а пока как и вы буду просмотривать и брать на вооружение все что есть и учить младших коллег. С найлутьшим пожеланиями Виталий.
 
С возвращением на форекс, Виталий. :)
 

Подымаю ветку т.к. перечитав несколько подобных сообщений на форуме, возможно по неграмотности, не нашел ответа или общего механизма.

Проблема следующая: вызываю индиактор из эксперта получаю 0 или empty_value, вызываю из скрипта получаю верные результаты, совпадающие с визуальной интерпритацией индикатора.

Далее интереснее - включаю тестер, прогоняю советник, не получаю необходимые результаты. Останавливаю тестер. Прикрепляю скрипт, получаю значения индикатора за текущий момент, а не на момент остановки графика.

И собственно вопрос, как получить требуемые результаты от индикатора в советнике?

Почему прикрепленный скрипт выдает результаты за текущий момент, а не на момент остановки советника?

Вызывается индикатор верно, т.к. на графике при работе скрипта, последний дает результаты соответствующие истине. Такой же вызов используется и в эксперте.  Я видел как Rosh советовал делать массивы в отдельном индикаторе и в массивы присваивать значения необходимых индикаторов индикаторов, но упорно не понимаю как это может помочь делу. Поэтому решил не танцевать с бубном, а спросить у тех кто уже решил этот вопрос. Опять же, возможно я не понял ROSH-а. Ветка с объяснением https://forum.mql4.com/ru/7081

 
khitenkov >>:


у вас переменные инициализируются на глобальном уровне

double ind_H0=0;
double ind_H1=0;
double ind_D0=0;
double ind_D1=0;
double ind_W0=0;
double ind_W1=0;

да и все другие. при таком раскладе возможны неопределенного рода эффекты при распределении памяти под них. Попробуйте перенести инициализацию в функцию init()

double ind_H0;
double ind_H1;
double ind_D0;
double ind_D1;
double ind_W0;
double ind_W1;

int init()
{
ind_H0=0;
ind_H1=0;
ind_D0=0;
ind_D1=0;
ind_W0=0;
ind_W1=0;
...
 
alsu >>:

у вас переменные инициализируются на глобальном уровне

да и все другие. при таком раскладе возможны неопределенного рода эффекты при распределении памяти под них. Попробуйте перенести инициализацию в функцию init()



Спасибо конечно, но если вы посмотрите на даты, то я думаю тот вопрос на который вы ответили, уже решили. Меня больше волнует своя проблема, а ветки плодить не хочется одинаковые!
 
KING >>:


но если вы посмотрите на даты

черт...:))))

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