Вопросы (проблемы, пожелания) по программированию в MQL4

 
1. В параметрах индикаторов есть 2 первых (iMA(NULL,0,...)), через которые можно указать явно инструмент и таймфрейм. А как, например, "взять" High, Low и иже с ними аналогичным (простым) образом из других "мест"?
2. В пользовательских индикаторах на пополам используюся линии и гистограммы. Не согласен был ещё в тройке с принципом построения гистограмм. Но там деваться некуда было. В четвёрке надеялся, что будет "получше". Получается, что изначально мы задаём цвета (color1,color2,...), задаем массивы (arr1[],arr2[],...) а потом надо сильно думать в какой именно массив нужно затолкать начальное значение, а в какой конечное, чтобы эта гистограмма нарисовалась тем цветом, каким надо. Практически, очень часто получается, что определяешь цвета "по логике", обзываешь массивы "по логике", а рисуется потом "не тем" цветом. Меняешь массивы местами, и тогда всё ок. Для мозгов всё-таки меньше было бы напряга, если бы цвет бара гистограммы можно было бы задавать явно, не заботясь о том, как этот гистограммный бар будет рисоваться - сверху вниз, или снизу вверх.
 
1. В параметрах индикаторов есть 2 первых (iMA(NULL,0,...)), через которые можно указать явно инструмент и таймфрейм. А как, например, "взять" High, Low и иже с ними аналогичным (простым) образом из других "мест"?


Через копирование чужого таймфрейма в отдельный буфер через:
int ArrayCopySeries(double array[], int series_identifier, string symbol_name, int period)

Copies some series array to another array and returns copied item count.

Sample:
    double array1[10];
    ArrayCopySeries(array1, MODE_OPEN);



Ну а потом со своим массивом можно делать что угодно (и максимально быстро).
Функций вида "получить Close из таймфрейма такого-то" нет и не планируется.

2. а потом надо сильно думать в какой именно массив нужно затолкать начальное значение


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

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

К сожалению, не похоже. Почему к сожалению? Потому что как раз с "подумать и поработать" постоянный и пожизненный перебор. И думать и работать приходится тем больше, чем меньше продуман интерфейс, чем меньше встроенных функций, свойств, возможностей и т.д. и т.п. И написание собственных функций, это единственный путь в такой ситуации, чтоб хоть как-то облегчить себе жизнь и уменьшить объемы работ. А фирма Microsoft отрабатывает эти моменты на 100%. А то, что у них ошибочки встречаются, так у них и разработочки пофундаментальней будут. В С++ мне приходилось писать свои функции только в тех случаях, когда приходилось часто использовать какой-либо один и тотже алгоритмик. В ассемблере только приходилось создавать целые библиотеки своих собственных функций. Кроме этого в западных фирмах работают люди, профессия которых называется компьютерный психолог. И дружественность интерфейсов "их" программ во многом зависит от них. По нашим меркам работники такого профиля - дармоеды, которые ничего не делают. Мы и сами с усами. Всё знаем, всё могём. Так что не надо про желание думать и работать.
 
double hClose[];
datetime hTime[];

nCloseBars=ArrayCopySeries(hClose,MODE_CLOSE,Symbol(),PERIOD_H1);
nTimeBars=ArrayCopySeries(hTime, MODE_TIME, Symbol(),PERIOD_H1);


Уважаемые разработчики, объясните, пожалуйста, почему на разных ТФ nCloseBars везде возвращает значение -1, а nTimeBars возвращает разные значения (М30-1033, М15-1551, М5-2052, М1-2040). Кол-во баров на Н1 - 2062. В хелпе по ArrayCopySeries написано, что возвращается количество скопированных элементов. Т.е., как я понимаю, nCloseBars и nTimeBars должны возвращать число 2062.

 
а Вы не могли бы код ошибки привести, которую можно получить по GetLastError?
а если скопировать сначала Time, а потом Close, что будет?
 
Код ошибки = 0, перемена местами Close и Time ничего не меняет. Изменилась картина после переноса объявления массивов в "хидер" и инициализации их в init.
double hClose[];
datetime hTime[];

int init()
{
  SetIndexBuffer(0,hClose);
  SetIndexBuffer(1,hTime);
}
int start()
{
  int nCloseBars,nTimeBars;

  nCloseBars=ArrayCopySeries(hClose,MODE_CLOSE,Symbol(),PERIOD_H1);
  nTimeBars=ArrayCopySeries(hTime, MODE_TIME, Symbol(),PERIOD_H1);
...
}


Теперь при 2210 барах на Н1 возвращается 2208 на М30 и М15, 2160 на М5, 0 на М1

 
Забыл уточнить, что эти числа возвращаются и nCloseBars и nTimeBars
 
И, кстати, у меня сейчас 145 билд. А какого числа Вы его выложили? Я не помню, когда я обновился. Возможно, то что я описывал, было в 144. Если это имеет какое-то значение...
 
будем разбираться
 
Разработчикам
В программе эксперта или индикатора можно проанализировать кол-во баров и если таковых недостаточно для производства расчётов, то можно только "уйти". А нельзя ли добавить какой-нибудь опертор, который бы вызывал закачку необходимого количества баров? Чтобы не лезть на интересующий ТФ и не скроллировать вручную до получения требуемого кол-ва этих баров.

P.S. Уже столкнулся с такой бедой и сейчас буду заниматься скроллингом :( А ситуация простая - индикатор, работающий с разными ТФ одновременно. Кстати, непонятно опять же в каком объёме осуществляет подкачку ArrayCopySeries, если вообще осуществляет.
 
Разработчикам
В експерте/индикаторе можно задать в параметрах
extern bool bbb=false;
тогда в свойствах мы "обнаружим" комбобокс. Оно и понятно. Где есть false, должен быть и true. Но! Замечательно, что в свойствах предоставляется автоматом возможность выбора, а не нужно вписывать вручную. Очень удобно. И очень хотелось бы иметь возможность формировать самому такую возможность, например, таким образом:
extern int aaa[]={1,2,3,4,5,6,7,8,9};
Можете добавить в MQL такую фичу?
Причина обращения: