Форум » Консультации по программированию » Я в шоке! Подскажите. » Ответить

Я в шоке! Подскажите.

Sergey: Всем привет! Я в шоке! Выпал из рынка на 3,5 месяца, а тут такие перемены. Игорь подскажи, где можно ознакомиться с изменениями в MQL4? Хотел перенести все данные на новый комп, но некоторые индикаторы после компиляции перестают работать. Вот один из них. http://gfile.ru/a8cCP Хотя не перекомпилированные файлы работают. Компиляция ошибок в коде не выявляет. Но при отладке выдается ошибка формирования массива стр.67. Но в чем ошибка не пойму. Буду благодарен, если найдешь время исправить.

Ответов - 204, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All

Sergey: Как прогнать индикатор в тестере на истории? Теоретически нужно запустить советник в режиме визуализации не выставляющий ордера и к графику прикрепить тестируемый индикатор. Есть ли еще варианты? Просто не все индикаторы ставятся таким образом на график.

Scriptong: Sergey пишет: Как прогнать индикатор в тестере на истории? Теоретически нужно запустить советник в режиме визуализации не выставляющий ордера и к графику прикрепить тестируемый индикатор. Есть ли еще варианты? Просто не все индикаторы ставятся таким образом на график. В МТ5 давно существует возможность полноценного тестирования индикаторов. А вот в МТ4 только-только появилось подобное. 810-й билд. Но пока это только бета-версия. Думаю, через пару-тройку недель состоится релиз и можно будет использовать новшество полноценно.

Sergey: Для экономии ресурсов компьютера расчеты некоторых индикаторов делаю на открытии бара. if (LastBar == Time[0]) return(0); int limit; int counted_bars=IndicatorCounted(); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if (limit>ShowBars) limit=ShowBars; if (LastBarDay!=iTime(NULL,PERIOD_D1,0)) { ObDeleteObjectsByPrefix(PREFIX); limit=ShowBars; } int i; for (i = limit-1; i >= 0; i--) Однако столкнулся с такой проблемой: После включения компа на следующий день, индикатор отрисовывается не верно. Как запрограммировать, чтобы при включении компа индикатор пересчитывал всю глубину истории, как при первом запуске. Прием типа if (LastBarDay!=iTime(NULL,PERIOD_D1,0)) { ObDeleteObjectsByPrefix(PREFIX); limit=ShowBars; } Не помогает...


Genry: Sergey пишет: Однако столкнулся с такой проблемой: После включения компа на следующий день, индикатор отрисовывается не верно. Как запрограммировать, чтобы при включении компа индикатор пересчитывал всю глубину истории, как при первом запуске. В этой ветке народ обсуждал вопросы подкачки истории при перезагрузке терминала: http://forum.mql4.com/ru/40689 и ее влияние на работу индикаторов.

Sergey: Genry пишет: В этой ветке народ обсуждал вопросы подкачки истории при перезагрузке терминала Просмотрел. Дело не в подкачке истории, а в новой инициации индикатора при перезагрузке терминала.

Genry: Sergey пишет: Дело не в подкачке истории, а в новой инициации индикатора при перезагрузке терминала. Обсуждение такой проблемы видел для мт5 здесь: https://www.mql5.com/ru/forum/694 Позже попалось еще здесь по мт4: https://www.mql5.com/ru/forum/34432

Sergey: Genry пишет: Обсуждение такой проблемы видел для мт5 здесь: https://www.mql5.com/ru/forum/694 Позже попалось еще здесь по мт4: https://www.mql5.com/ru/forum/34432 Спасибо Генри, все оказалось гораздо проще... int Start() { if (LastBar != Time[0]) { Тело индикатора LastBar = Time[0]; } return(0); } Но я в замешательстве, так как не могу понять, чем это отличается от int Start() { if (LastBar == Time[0]) return(0); Тело индикатора LastBar = Time[0]; return(0); } при перезапуске терминала.

Genry: Sergey пишет: LastBar == Time[0]; Просто у тебя уже усталость от редактирования и "глаз замылился". надо присвоить LastBar = Time[0] , а здесь вместо присвоения - сравнение.

Sergey: Genry пишет: надо присвоить LastBar = Time[0] , а здесь вместо присвоения - сравнение. Это я просто копировал верхнюю строку и ошибся. Сейчас исправил.. Вопрос остался..

Genry: Sergey пишет: .. Вопрос остался.. Тогда причина может быть в части "Тело индикатора"

Scriptong: Sergey пишет: Для экономии ресурсов компьютера расчеты некоторых индикаторов делаю на открытии бара. В индикаторах нет такой необходимости - делать проверку на открытие нового бара. Для этого у него есть IndicatorCounted() или prev_total и rates_total в новой версии MQL4. На основании этих данных необходимо определить, с какого бара следует обновить значения индикатора. В моих индикаторах обычно присутствует специальная функция: int GetRecalcIndex(int &total, const int ratesTotal, const int prevCalculated) { total = ratesTotal - /*здесь период индикатора или то, что его заменяет*/ - 2; if (i_indBarsCount > 0 && i_indBarsCount < total) total = MathMin(i_indBarsCount, total); if (prevCalculated < ratesTotal - 1) { BuffersInitializeAll(); return total; } return (MathMin(ratesTotal - prevCalculated, total)); } А после расчета индекса бара просто производится новый расчет значений индикатора на измененных барах: for (int i = limit; i >= 0; i--) { // Расчет }

Sergey: Scriptong пишет: В индикаторах нет такой необходимости - делать проверку на открытие нового бара. Но мне нужно, чтобы расчет на нулевом баре был произведен только на его открытии. А в случае return (MathMin(ratesTotal - prevCalculated, total)); как я понял, делается постоянный (по тиковый) расчет значений нулевого бара, но сам код возьму на вооружение. Спасибо.

Scriptong: Sergey пишет: Но мне нужно, чтобы расчет на нулевом баре был произведен только на его открытии. А в случае return (MathMin(ratesTotal - prevCalculated, total)); как я понял, делается постоянный (по тиковый) расчет значений нулевого бара, но сам код возьму на вооружение. Спасибо. Нет проблем: for (int i = limit; i > 0; i--) buffer[i - 1] = расчет

Sergey: Кажется наконец нашел в чем проблема. Индикатор установлен на 12 валютных парах. Имя объекта string name = PREFIX + IntegerToString(leftTime); Однако бывает совпадение по времени разных графиков. Предполагаю, что при загрузке терминала обновление данных различных пар идет не синхронно по барам. В результате объекты с одинаковыми именами перерисовываются. Решение - ввел PREFIX, как настраиваемый параметр. Но это не совсем удобно. Можно привязать к символу, но трейдер может открыть несколько одинаковых графиков. Есть ли варианты?

Genry: Sergey пишет: Можно привязать к символу, но трейдер может открыть несколько одинаковых графиков. Есть ли варианты? У каждого графика, даже если они одинаковые, есть его уникальный идентификатор, его возвращает функция ChartID. //--- get handle of the current chart long handle=ChartID();



полная версия страницы