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

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

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

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

Scriptong: Sergey пишет: Значения есть. Мне видится дело не в этом, а в настойках стартового лота. Проблему решил так: Установил в стартовых настройках вместо расчетного постоянный лот. Таким образом строка в авто проверку не попала. Теперь жду замечания от модератора Ну это пока Вы решили радикально. Но ведь такая возможность может потребоваться в будущем. Значит, следует разобраться, почему на золоте получены нулевые значения. Кроме того, в том коде, который Вы привели, нет проверки деления на 0. Может просто ввести ее и ждать, пока будет получен не 0? Такое часто бывает при необходимости подкачки данных.

Sergey: Scriptong пишет: Кроме того, в том коде, который Вы привели, нет проверки деления на 0. Может просто ввести ее и ждать, пока будет получен не 0? Такое часто бывает при необходимости подкачки данных. Идея верная... Тем более я допустил еще ряд ошибок..... TickValue = MarketInfo(Symbol(), MODE_TICKVALUE); Я закачиваю при инициации в функции OnInit() вместе с другими параметрами, что в принципе не верно, так как для обратных и кросс курсов эта величина не постоянная. Можно дополнить примерно так: в начале OnTick() TickValue = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE); if (TickValue = 0) return; Верно? Или делать запрос при каждом тике не рационально, а лучше внутри функции расчета лота примерно так: while (true) { TickValue = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE); if (TickValue !=0) break; }

Scriptong: Sergey пишет: Верно? Или делать запрос при каждом тике не рационально, а лучше внутри функции расчета лота примерно так: Да, на каждом тике. Ведь рыночное окружение изменяется при изменении цены. Поэтому нужно все данные получать заново. Если какой-то из критически важных параметров (величина пункта, стоимость тика, размер тика и т. п.) равен нулю, то продолжать обработку тика нельзя. Сразу выходить и ждать следующего тика. Посмотрите, как у меня это реализовано на примере любого советника. Допустим, Quantum. В папке Include\Common есть файл Common_GetSymbolInfo.mqh. В нем - реализация класса GetSymbolInfo. Так вот, метод RefreshInfo этого класса вызывается в начале каждого тика. Внутри этого метода собираются все данные рыночного окружения. При этом неважно, что многие из них (величина пункта, к примеру) практически константы. Всякое может случиться, а потому необходимо быть готовым к изменению любого из этих параметров.


Sergey: Scriptong пишет: Посмотрите, как у меня это реализовано на примере любого советника. Огромное спасибо! Я пока сделал так if (!SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE,TickValue)) { Comment((isRussianLang)? "Ошибка получения данных SYMBOL_TRADE_TICK_VALUE " : "Error retrieving data SYMBOL_TRADE_TICK_VALUE ",GetLastError()); return; } Но обязательно посмотрю пример. Ваш опыт очень для меня важен. Я именно на ваших примерах научился mql4.

Sergey: Всем Привет! Игорь, подскажи, как определить дыры в истории котировок? Вот пример: индикатор установлен на график Н1, но обсчитывает данные с М1. Последовательность баров без дары 5,4,3,2,1,0 Та же последовательность с дыркой 4,3,_,2,1,0 Проверка типа: //+---------------------------------------------------------------------------+ //| Проверка доступности баров указанного таймфрейма | //+---------------------------------------------------------------------------+ bool IsAllBarsAvailable(int lastBar,int tf) { if(lastBar <= 0) return (false); // Проверка доступности баров for(int i=lastBar; i>=0; i--) if(iTime(Symb,tf,i)==0) return (false); // Все бары доступны return (true); } Эту дырку на М1 не замечает. Почему не пойму.... В результате проверка пройдена, а индикатор на участке с дыркой не рассчитывается. Просьба, если есть готовое решение обнаружения дыр в истории скинь пожалуйста.

Scriptong: Sergey пишет: Игорь, подскажи, как определить дыры в истории котировок? К сожалению, не существует универсального способа автоматической проверки наличия дыр в истории. Сам МТ4 довольно часто не замечает их и, соответственно, не заполняет дыры информацией с сервера. В таких случаях рецепт только один: вручную удалять всю историю и закачивать ее заново. Чаще всего помогает. Почему невозможно создать универсальный алгоритм отслеживания дыр в истории? Да потому что для его создания нужно обладать информацией о том, когда котировки между двумя барами действительно были. То есть нужен эталон, с которым возможно провести сравнение. Но у программы только один источник данных - текущий чарт. Простой пример. Открываем график и видим, что между 27.04.2018 и 30.04.2018 имеется визуальный разрыв в значениях котировок. Логично предположить, что тут дыра. Но потом смотрим календарь и видим, что это пятница и понедельник соответственно. То есть на самом деле не дыра. Этот случай еще поддается автоматизации. Углубимся. Допустим, последняя свеча минутного графика 27.04.2018 - 22:30, хотя официальное закрытие недели значится как 22:55. Что это: недостаток данных длиной в 25 минут (дыра?) или действительно не было котировок до закрытия, потому что рынок под конец недели вялый? Вот такие случаи невозможно решить без наличия эталона. Только вот если эталон у нас имеется, то и сама проблема автоматически исчезает.

Sergey: Scriptong пишет: То есть нужен эталон, с которым возможно провести сравнение. Спасибо. Благодаря твоему разъяснению, возникла идея. Попробую ее изложить и проверить. Суть проблемы: Скажем, Вы не открывали терминал 3 рабочих дня. После открытия терминала на 4 день, данные по всем ТФ обновляются на истории 2048 баров. Для М1 это 1,4 дня, для М5-7,1 дней. Таким образом мы имеем пробел истории котировок только на М1. Теперь, если устроить проверку согласованности графиков для М1 по времени открытия баров старшего тайм-фрейма, мы получим ошибку. Следовательно нужно закачать историю.... Конечно, полностью дыры на М1 таким образом не проверить, но будет понимание в необходимости обновления истории. По крайней мере этого будет достаточно для подбора минимального ТФ с полной закаченной историей. Еще раз спасибо. Бегу реализовывать.....

Scriptong: Sergey пишет: Бегу реализовывать..... Это уже реализовано на основе тиковой истории. Вот скрипт.



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