Откуда такие сведения? У меня написан класс один, который протестирован уже ни один раз. Так с 1 слэшем. Вот так там написано:
То что я создал 2 раза тот же хэндл, это лишь случайность. Тестировал, проверял. Переписал всё в одной функции без проверок под идеальные условия для тестера. В реале, конечно, допишу проверки. Вот что вышло:
Параметры функции getCandlePatternsValue() видны на прикреплённом скрине.
Я бы мог показать целый код, но это усложнит анализ кода. Я вижу, что ошибка в этом момент. Поэтому я его и показываю.
Там более, видно, что функция CopyBuffer() возвращает res == -1. А это значит, что не получается считать данные с буфера индикатора CandlePatterns.
Виктор, ну вы же продолжаете создавать индикатор непосредственно перед обращением к нему.
Надо заранее в ОнИнит все что нужно создать, а потом обращаться. Скорее всего не успевает.
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
Такое бывает, если неправильно указан индекс буфера. Проверьте значение bufferIndex, передаваемое в getCandlePatternsValue и посмотрите, есть ли в индикаторе буфер с таким индексом. Его явно нет.
Нет. В индикаторе же лишь 2 буфера сейчас. Индексы буферные 0 и 1. Конечно, они в индикаторе присутствуют. Это можно увидеть невооружённым глазом в прикрепленном файле (индикаторе)
Ihor Herasko:
P. S. А почему тема в разделе для MQL4? Думаю, стоит перенести в раздел для MQL5.
Я тоже об этом сегодня подумал. Но не хотел дёргать модераторов ради этого.
Виктор, ну вы же продолжаете создавать индикатор непосредственно перед обращением к нему.
Надо заранее в ОнИнит все что нужно создать, а потом обращаться. Скорее всего не успевает.
@Aleksey Mavrin вы правы в этом. Учту. Но, в целом, на сложившуюся ситуацию перенос инициализацию в OnInit() ничего не дало. Я написал тестовый бот, чтобы протестироватькак читаются данные с моего индюка. Вот он:
#property copyright"hoz"#property link""#property version"1.00"int candlePatternsHandle;
int copied;
double havingPattern[1];
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit() {
//---
candlePatternsHandle = iCustom(_Symbol, _Period, "CandlePatterns");
if (candlePatternsHandle == INVALID_HANDLE) {
Sleep(5000);
returnINIT_FAILED;
}
//---returnINIT_SUCCEEDED;
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason) {
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick() {
//---// int res = CopyBuffer(candlePatternsHandle, 0, 1, 1, havingPattern);// Print(__FUNCTION__ + ":: _LastError = ", _LastError);// Print(__FUNCTION__ + ":: res = " + res);// Print(__FUNCTION__ + ":: havingPattern[0] = " + havingPattern[0]);for (int i = 0; i < 119; i++) {
copied = CopyBuffer(candlePatternsHandle, 1, i, 1, havingPattern);
Print(__FUNCTION__ + ":: copied = " + copied);
if (havingPattern[0] != EMPTY_VALUE) {
Print(__FUNCTION__ + ":: havingPattern[0] != EMPTY_VALUE");
Print(__FUNCTION__ + ":: havingPattern[", + i + "] = " + DoubleToString(havingPattern[0]));
}
}
Так вот. Ничего не копиуется с буфера индикатора. Ни с 0-го, ни с 1-го индекса. Вот для первого я выше код и привёл. В журнале вижу следующее:
Добавил опрос Вернуть старую подсветку текущих скобок? Добавил тему Bid не совпадает с Close[0] Подскажите почему цены на графике и на тиковом графике могут перманентно отличаться? и Бид и Аск не совпадает, Бид не совпадает с Close[0]. У большинства брокеров и счетов совпадает, но почему возможно такое не совпадение в принципе? Разве на...
@Aleksey Mavrin вы правы в этом. Учту. Но, в целом, на сложившуюся ситуацию перенос инициализацию в OnInit() ничего не дало. Я написал тестовый бот, чтобы протестироватькак читаются данные с моего индюка. Вот он:
Так вот. Ничего не копиуется с буфера индикатора. Ни с -го, ни с 1-го индекса. Вот для первого я выше код и привёл. В журнале вижу следующее:
Неужели что-то с индикатором? Что может на это влиять? Индикатор же элементарный..
Уже интересно) вы бы сделали задержку, чтобы расчеты все точно он провёл, и ошибку на каждой итерации выводили. Позже протестю.
Ещё смущает что в массиве точный 0.0, хотя он же им не инициализирован, а это не 4-ка, там вроде как обычно мусор.
@Aleksey Mavrin вы правы в этом. Учту. Но, в целом, на сложившуюся ситуацию перенос инициализацию в OnInit() ничего не дало. Я написал тестовый бот, чтобы протестироватькак читаются данные с моего индюка. Вот он:
Так вот. Ничего не копиуется с буфера индикатора. Ни с -го, ни с 1-го индекса. Вот для первого я выше код и привёл. В журнале вижу следующее:
Неужели что-то с индикатором? Что может на это влиять? Индикатор же элементарный..
А как вы хотите поменять в этом цикле
for (int i = 0; i < 119; i++) {
copied = CopyBuffer(candlePatternsHandle, 1, i, 1, havingPattern);
Print(__FUNCTION__ + ":: copied = " + copied);
if (havingPattern[0] != EMPTY_VALUE) {
Print(__FUNCTION__ + ":: havingPattern[0] != EMPTY_VALUE");
Print(__FUNCTION__ + ":: havingPattern[", + i + "] = " + DoubleToString(havingPattern[0]));
}
значение массива в нулевом индексе???
ps; извините, не поменять, а прочесть иное значение, чем оно есть там.
Так а разница какая? Я для теста создал массив размерностью 1 элемент, чтобы на каждой итерации писать в этот первый элемент массива т.е. на 0-ой индекс то, что считаю.
Но суть в том, что ничего не считывается. Вот это самый интересный момент..
Переменные должны быть объявлены перед их использованием. Для идентификации переменных используются уникальные имена. Описания переменных используются для их определения и объявления типов. Описание не является оператором. Индексом массива может быть только целое число. Допускаются не более чем четырехмерные массивы. Нумерация элементов массива...
Кстати, когда я получаю данные с 0-го буфера, то всё чётко. Находится нужный бар, с паттерном, который отображает индикатор. Принтуется цена открытия этого бара (если расскоментирую в скрипте строку для этого). По сути, все мысли сошлись на том, что что-то не то лишь с функцией CopyBuffer(), либо с индикатором. С функцией CopyBuffer(), навряд ли, что-то не то т.к. ей пользуются все и не первый год. Значит что-то с индюком.
Но интересно то, что оба буфера, по сути, написаны чуть-ли не копипастом один от другого с изменением одного лишь условия. Вот что интересно. Как проверить этот момент очень инетресно..
Скрипт и индикатор, у которого отключил отрисовку и закинул все включения в него прикрепляю. Если удобнее, могу приложить в библиотеками. Они компактные. Но код читается тогда удобнее т.к. нет лишнего в контексте логики.
По сути, я выложил индикатор и скрипт, которым можно считать данные из бферов этого индикатора. Но данные читаютя только из 1 буфера (0-го индекса). Другой буфер не считыватся. Вот это, на самом деле, интересно. Создаётся впечатление, что терминал гонит. У меня он портабельно запускается. Код уже лопатил ни один раз.
Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара). При копировании заранее неизвестного количества данных в качестве массива-приемника buffer[] желательно...
Откуда такие сведения? У меня написан класс один, который протестирован уже ни один раз. Так с 1 слэшем. Вот так там написано:
То что я создал 2 раза тот же хэндл, это лишь случайность. Тестировал, проверял. Переписал всё в одной функции без проверок под идеальные условия для тестера. В реале, конечно, допишу проверки. Вот что вышло:
Параметры функции getCandlePatternsValue() видны на прикреплённом скрине.
Я бы мог показать целый код, но это усложнит анализ кода. Я вижу, что ошибка в этом момент. Поэтому я его и показываю.
Там более, видно, что функция CopyBuffer() возвращает res == -1. А это значит, что не получается считать данные с буфера индикатора CandlePatterns.
Виктор, ну вы же продолжаете создавать индикатор непосредственно перед обращением к нему.
Надо заранее в ОнИнит все что нужно создать, а потом обращаться. Скорее всего не успевает.Такое бывает, если неправильно указан индекс буфера. Проверьте значение bufferIndex, передаваемое в getCandlePatternsValue и посмотрите, есть ли в индикаторе буфер с таким индексом. Его явно нет.
Нет. В индикаторе же лишь 2 буфера сейчас. Индексы буферные 0 и 1. Конечно, они в индикаторе присутствуют. Это можно увидеть невооружённым глазом в прикрепленном файле (индикаторе)
P. S. А почему тема в разделе для MQL4? Думаю, стоит перенести в раздел для MQL5.
Я тоже об этом сегодня подумал. Но не хотел дёргать модераторов ради этого.
Виктор, ну вы же продолжаете создавать индикатор непосредственно перед обращением к нему.
Надо заранее в ОнИнит все что нужно создать, а потом обращаться. Скорее всего не успевает.@Aleksey Mavrin вы правы в этом. Учту. Но, в целом, на сложившуюся ситуацию перенос инициализацию в OnInit() ничего не дало. Я написал тестовый бот, чтобы протестироватькак читаются данные с моего индюка. Вот он:
Так вот. Ничего не копиуется с буфера индикатора. Ни с 0-го, ни с 1-го индекса. Вот для первого я выше код и привёл. В журнале вижу следующее:
Неужели что-то с индикатором? Что может на это влиять? Индикатор же элементарный..
@Aleksey Mavrin вы правы в этом. Учту. Но, в целом, на сложившуюся ситуацию перенос инициализацию в OnInit() ничего не дало. Я написал тестовый бот, чтобы протестироватькак читаются данные с моего индюка. Вот он:
Так вот. Ничего не копиуется с буфера индикатора. Ни с -го, ни с 1-го индекса. Вот для первого я выше код и привёл. В журнале вижу следующее:
Неужели что-то с индикатором? Что может на это влиять? Индикатор же элементарный..
Уже интересно) вы бы сделали задержку, чтобы расчеты все точно он провёл, и ошибку на каждой итерации выводили. Позже протестю.
Ещё смущает что в массиве точный 0.0, хотя он же им не инициализирован, а это не 4-ка, там вроде как обычно мусор.
@Aleksey Mavrin вы правы в этом. Учту. Но, в целом, на сложившуюся ситуацию перенос инициализацию в OnInit() ничего не дало. Я написал тестовый бот, чтобы протестироватькак читаются данные с моего индюка. Вот он:
Так вот. Ничего не копиуется с буфера индикатора. Ни с -го, ни с 1-го индекса. Вот для первого я выше код и привёл. В журнале вижу следующее:
Неужели что-то с индикатором? Что может на это влиять? Индикатор же элементарный..
А как вы хотите поменять в этом цикле
значение массива в нулевом индексе???
ps; извините, не поменять, а прочесть иное значение, чем оно есть там.
А как вы хотите поменять в этом цикле
значение массива в нулевом индексе???
Так а разница какая? Я для теста создал массив размерностью 1 элемент, чтобы на каждой итерации писать в этот первый элемент массива т.е. на 0-ой индекс то, что считаю.
Но суть в том, что ничего не считывается. Вот это самый интересный момент..
Уже интересно) вы бы сделали задержку, чтобы расчеты все точно он провёл, и ошибку на каждой итерации выводили. Позже протестю.
Ещё смущает что в массиве точный 0.0, хотя он же им не инициализирован, а это не 4-ка, там вроде как обычно мусор.
В общем-то, я придумал чутка другую проверку. Чтобы было проще проверить только что я накидал скрипт следующего содержания:
В данном случае, я хочу получить значение 1-го буфера индикатора при помощи функции CopyBuffer(). Ничего не выходит. В журнале вижу:
Если замению 1, на 0 т.е. хочу получить значение 0-го буфера то всё получается:
Кстати, когда я получаю данные с 0-го буфера, то всё чётко. Находится нужный бар, с паттерном, который отображает индикатор. Принтуется цена открытия этого бара (если расскоментирую в скрипте строку для этого). По сути, все мысли сошлись на том, что что-то не то лишь с функцией CopyBuffer(), либо с индикатором. С функцией CopyBuffer(), навряд ли, что-то не то т.к. ей пользуются все и не первый год. Значит что-то с индюком.
Но интересно то, что оба буфера, по сути, написаны чуть-ли не копипастом один от другого с изменением одного лишь условия. Вот что интересно. Как проверить этот момент очень инетресно..
Скрипт и индикатор, у которого отключил отрисовку и закинул все включения в него прикрепляю. Если удобнее, могу приложить в библиотеками. Они компактные. Но код читается тогда удобнее т.к. нет лишнего в контексте логики.
По сути, я выложил индикатор и скрипт, которым можно считать данные из бферов этого индикатора. Но данные читаютя только из 1 буфера (0-го индекса). Другой буфер не считыватся. Вот это, на самом деле, интересно. Создаётся впечатление, что терминал гонит. У меня он портабельно запускается. Код уже лопатил ни один раз.