Форум » Синтаксис языка » не подходит тип данных INT для тикетов ? посмотрим FileReadArray... » Ответить

не подходит тип данных INT для тикетов ? посмотрим FileReadArray...

Kamchatka: Добрый день Сергей и остальные гуру языка ! столкнулся и не смог понять странное поведение программы или отдельных функций при применении типа данных int для сохранения тикетов в файл, и последующего извлечения в массив. на данный момент задуманная и реализованная идея заработала..НО!!! ..при применении типа данных double (8 байтового) !!! Хотелось бы с Вашей помощью разобраться и понять на каком этапе в моем коде происходит ошибка, если я использую тип данных INT точностью 4 байта. В представленных мной кодах обширно размещены отладочные Alert , позволяющие на каждом этапе видеть ошибки или рабочие данные, в реальной программе они удалятся. .....предыстория и структура: задумано -при удачной установке ордера сохранять(дописывать) его тикет в файл BIN с помощью функции File_WR (тип ордера, тикет ордера);.."взбираемся на волну противоп. тренда". Эта же функция подчищает при необходимости файл таким вызовом- File_WR(0,0); Затем в любой момент времени мы можем обратиться к функции Profit (тип ордера, тип профита);для расчета профита грядки ордеров.(закрытых или рыночных), тикеты берем из того файла BIN. В общем, у меня в коде при использовании конструкций и функций работающих с типом INT происходило "слепливание в кучу" на каком то этапе. возможно это FileReadArray... !!! Применяемые мной конструкции int ,вместо double (стоящих теперь), оставлены за комментариями после символов >!!!!!< попробуйте их, возможно Вам ошибка будет более очевидна. Вот в ссылке включаемый файл File_.mqh с функциями File_WR и Profit : https://dl.dropbox.com/u/40468150/File_.mqh Вот микроэксперт 10.mq4 для тестирования(получение результатов происходит при смене ТФ, перекомпиляции..): https://dl.dropbox.com/u/40468150/10.mq4 надеюсь на Ваши подсказки и соображения, так как хочется более подробно понять язык. skype: eliks100

Ответов - 6

Kamchatka: Вот визуализация всего накоденного- блок схема функции File_WR (int tip , int tikt) https://dl.dropbox.com/u/40468150/PIC/File_WR.JPG блок схема функции Profit (int tip, int var=-1 ) https://dl.dropbox.com/u/40468150/PIC/Profit.JPG https://dl.dropbox.com/u/40468150/PIC/Profit2.JPG https://dl.dropbox.com/u/40468150/PIC/Profit3.JPG

Scriptong: Доброго времени суток. Пока не удалось воспроизвести описываемую Вами ошибку (в тестере, т.к. нет под рукой терминала, в котором открыто два и более ордеров; установить реальные ордера тоже невозможно - суббота). Подставил вместо типа double тип int везде, где это требуется. Алгоритм работы программы не изменился. Все данные пишутся и читаются верно. Возможно, для воспроизведения ошибки требуется какая-то специфическая ситуация, не описанная Вами.

Kamchatka: спасибо! немного странно...но теперь и у меня с INT заработало. наверно была синтаксическая ошибка которую не заметно.. вот такая рабочая версия https://dl.dropbox.com/u/40468150/File__.mqh вот еще существенный вопрос: в связи с идеей применения функций File_WR (1 , 0), File_WR (0 , 0) в теле init() , возникает такая задача: КАК избежать создания и ОБНУЛЕНИЯ файлов типа SYMBOL_B_tickets.bin при ПЕРЕИНИЦИАЛИЗАЦИИ эксперта по причине: 1. смена таймфрейма, 2. перекомпиляция кода., 3. переинициализация после обрыва связи с сервером, 4. и др. причины инициализации... кроме ПРИЧИНЫ -ПРИСОЕДИНЕНИЕ К ГРАФИКУ В ПЕРВЫЙ РАЗ(когда нужно создать файлы). Буду рад услышать советы мастеров ! :)


Scriptong: В этом случае достаточно воспользоваться функцией UninitializeReason, которую необходимо вызвать при деинициализации советника (событие deinit). Результат вызова функции можно записать в глобальную переменную, которую потом проверять в событии init: int g_unInitReason = 0; int init() { ... switch (g_unInitReason) { case REASON_CHARTCLOSE: <действие 1>; break; case REASON_REMOVE: <действие 2>; break; case REASON_RECOMPILE: <действие 3>; break; case REASON_CHARTCHANGE:<действие 4>; break; case REASON_PARAMETERS:<действие 5>; break; case REASON_ACCOUNT: <действие 6>; break; case 0: <действие при первом присоединении к графику>; break; } ... } int deinit() { ... g_unInitReason = UnitializeReason(); ... }

Kamchatka: UnitializeReason() - показывает код ТЕКУЩЕЙ деинициализации( мы вызвали UnitializeReason в deinit( ) ) , или ПРЕДЫДУЩЕЙ деинициализации советника? ..я как то ранее думал, что код деинициализации становится известен Этой функции после завершения deinit()...или это предположение не верно?

Scriptong: Функция сообщает причину, по которой было вызвано последнее событие deinit. Т.е. на момент вызова deinit возвращается причина, относящаяся к вызову текущего события. Аналогично с вызовом UninitializeReason в событии init - будет возвращен код причины, относящегося к последнему deinit. Поэтому, кстати, приведенный мною код можно упростить: не опрашивать причину в deinit, запрашивая данные прямо в init. В итоге глобальная переменная станет ненужной.



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