Количество индикаторных буферов - страница 2

 
Elena Baranova:

И что значит "правильная последовательность массивов"?

я так и не определил это)

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

В общем, если что-то у вас не отображается - меняйте местами индикаторные буферы (при назначении).

:)

1

 
Igor Makanu:

512

это для 5-рки?

Насколько я в курсе, для 4-рки 256

 
Taras Slobodyanik:

я так и не определил это)

вот инструкция, мне помогали, очень качественно объяснил https://www.mql5.com/ru/forum/111497/page651#comment_3073303


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда.

Анатолий, 2010.06.27 07:04

Стиль DRAW_HISTOGRAM ничем принципиально не отличается от других стилей рисования линий, по оси Х номера баров, по оси Y значения индикаторного массива, но как говорится, есть нюанс.
Для примера возьмем простой индикатор:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2
double SIMPLE[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, SIMPLE);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){
   for(int shift = Bars-IndicatorCounted()-1; shift >= 0; shift--){
      SIMPLE[shift] = 1;
   }
}
//+------------------------------------------------------------------+

Один индикаторный массив, отдельное окно, всем элементам присваивается значение 1. Бросаем его на график, и что мы видим (Рис. 1 слева):

 

В «Окне данных» отображаются показания индикатора, но в его окне ничего нет. Это и есть тот самый нюанс, МТ4 просто не знает 1 это сколько? Как высоко надо рисовать столбик? Ему не отчего оттолкнуться, то есть проще говоря нет цены деления для столбиков. Как вы заметили отдельного параметра задающего высоту столбиков нет, их высота задается автоматически, относительно других элементов. Поможем МТ4, и зададим цену деления, можно программно:

#property indicator_minimum 0
#property indicator_maximum 2

Можно просто в настройках индикатора закрепить минимумы (допустим 0) и максимумы (например 2).
И все тут же встает на свои места (Рис. 2 справа), теперь терминал знает какой высоты столбец нужно нарисовать, 1 это по середине между 0 и 2 :))) Теперь вспомним MACD, вроде там жестко цену деления не задаем, а столбики рисуются как надо, все потому что они рисуются относительно друг друга, в этом примере весь индикаторный массив имеет одно значение (специально для показа «нюанса»), поэтому нужно самим показывать терминалу, сколько это много или мало. Стоит нам заменить данные массивов с 1, например на Close[shift], то жесткое ограничение можно не ставить терминал сам определится и нарисует нам картинку «аля МАКД».

Немного другая картинка, если рисовать гистограмму не в отдельном окне, а в общем. Оставим для первого индикаторного массива значение Close[shift], просто поменяем параметр:

#property indicator_chart_window

И опят таже картина (Рис. 3 слева). Значения есть, отображения нет.

   

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

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_width2 2
double SIMPLE[];
double SIMPLE2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, SIMPLE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, SIMPLE2);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){
   for(int shift = Bars-IndicatorCounted()-1; shift >= 0; shift--){
      SIMPLE[shift] = Close[shift];
      SIMPLE2[shift] = 0;
   }
}
//+------------------------------------------------------------------+

Индикаторные массивы начинают отображаться относительно друг друга. И все становится как надо (Рис 4 справа). Столбцы рисуются от SIMPLE[shift] до SIMPLE2[shift].

Ну и на последок код индикатора закрашивающего свечи, если вверх то голубая, если вниз то розовая. И опять же по два массива на каждый цвет (зарисовка происходит от home к end (от Open к Close)). 

//+------------------------------------------------------------------+
//|                                                       SIMPLE.mq4 |
//|                        Copyright © 2010,Анатолий Сергеев  |
//|                                            mql.sergeev@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Анатолий Сергеев"
#property link      "mql.sergeev@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_width1 2
#property indicator_color2 Blue
#property indicator_width2 2
#property indicator_color3 Pink
#property indicator_width3 2
#property indicator_color4 Pink
#property indicator_width4 2
double Blue_home[];
double Blue_end[];
double Pink_home[];
double Pink_end[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init(){
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0, Blue_home);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1, Blue_end);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2, Pink_home);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3, Pink_end);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start(){
   for(int shift = Bars-IndicatorCounted()-1; shift >= 0; shift--){
      if(Close[shift] > Open[shift]){
         Blue_home[shift] = Open[shift];
         Blue_end[shift] = Close[shift];
      }else{
         Pink_home[shift] = Open[shift];
         Pink_end[shift] = Close[shift];
      }
   }
}
//+------------------------------------------------------------------+

 


 

в МТ4 очень мало доступной памяти, он же 32-х разрядный, менее 4 Гб

если закончится память, то не будет никаких сообщений, а просто для массивов перестанет выделяться память, т.е. будет так:

double arr[];
if(ArrayResize(arr,100500)!=100500) Alert("Error ArrayResize!!!! ArraySize(arr) = ",ArraySize(arr));


я свой код тестировал с ограничением чарта в 1000 баров, если поставить максимальное количество, то скорее всего не получится 512 буферов отобразить, но код индикатора будет работать

512 буферов * 8 байт double = 4 кб на один бар чарта




Renat Akhtyamov:

это для 5-рки?

Насколько я в курсе, для 4-рки 256


код для тестирования выложил, тестируйте, считайте
 
Igor Makanu:

вот инструкция, мне помогали, очень качественно объяснил https://www.mql5.com/ru/forum/111497/page651#comment_3073303

я знаю как работают гистограммы к этому нет вопросов.

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

 
Taras Slobodyanik:

я знаю как работают гистограммы к этому нет вопросов.

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

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

double arr[];
void OnStart()
{
if(ArrayResize(arr,100500)!=100500) Alert("Error ArrayResize!!!! ArraySize(arr) = ",ArraySize(arr));
}

UPD: запустил свой индикатор

а МТ4 теперь в логе терминала научился писать, что памяти не хватает:

2021.05.31 17:44:13.850 Not enough memory for 1000001 bars for custom indicator tst EURUSD,M1

2021.05.31 17:43:19.052 Not enough memory for 1000000 bars for custom indicator tst EURUSD,M1


года три назад точно не было такого, это удобно

 
Igor Makanu:

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

Рассказываю еще раз)

Буферы всегда добавляю последовательно в конец, всегда перед этим делаю рабочий "простой" индикатор, в котором всё работает.
Отправляю индикатор клиенту, он пишет "пропал боллинджер Д1" (одна из предыдущих доработок).
А я ж ничего не менял.
Полдня копаюсь ищу что с ним... всё принтуется, данные ББ считаются, а на чарте пусто.
Пересчитываю все буферы, все инициализации, прописываю всё что можно по умолчанию и тп.

Переместил этот буфер в конец - ББ появился на чарте...


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

 
Taras Slobodyanik:

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

в общем - работает не трожь! 


думаю проблема ТС решена, там сама разберется

 
Taras Slobodyanik:

я так и не определил это)

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

В общем, если что-то у вас не отображается - меняйте местами индикаторные буферы (при назначении).

:)


Да, интересно ) Но мне до вас далеко,  у индикатора всего 15 буферов. Пока все работает )