Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 985
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
do { ... код заполнения буфера
}
while(эти два значения не совпадают)
короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий кодdo { ... код заполнения буфера
}
while(эти два значения не совпадают)
короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий кодТак дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет. А как только OnCalculate заканчивается, то сразу отдаются данные советнику, а они ошибочны.
Или я не понял Вашу идею.Так дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет.
по очереди получаете значения из буферов других индикаторов, если их не одинаковое количество то получаете снова пока не станет одинаковым, забудьте про потоки. но вообще так никто не делает это извращение индикаторы от индикаторов, очень медленно
Так дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет. А как только OnCalculate заканчивается, то сразу отдаются данные советнику, а они ошибочны.
Или я не понял Вашу идею.вам надо что бы условие выполнилось, тогда только буферы заполнятся, как я понял (что бы кол-во баров в буферах других индикаторов совпадало)
принудительно выполните условия все перед заполнением буферов текущего индикатора
или криворукому программисту отдайте обратно, че мы должны его проблемы решать не в той теме вообще
по очереди получаете значения из буферов других индикаторов, если их не одинаковое количество то получаете снова пока не станет одинаковым, забудьте про потоки. но вообще так никто не делает это извращение индикаторы от индикаторов, очень медленно
вам надо что бы условие выполнилось, тогда только буферы заполнятся, как я понял (что бы кол-во баров в буферах других индикаторов совпадало)
принудительно выполните условия все перед заполнением буферов текущего индикатора
или криворукому программисту отдайте обратно, че мы должны его проблемы решать не в той теме вообще
Если расчет не готов от других индикаторов, то значения будут нулевыми, поэтому принудительно тут нет смысла заполнять, можно заполнить прошлыми данными, но с таким же эффектом можно запрашивать данные не по текущему бару у индикатора, а по прошлому и тогда код вообще править не надо.
Почему обсуждаем здесь - так-как ситуация в тестере и на реальном счете отличается, имитация Sleep работает очень странно, а перерасчет индикатора за 15 секунд слипа происходит только 1 раз, в то время как он должен происходить на каждом же тике, или по запросу, а он происходит не в 15 секунд, а в 13, судя по логу.
Кроме того, проблема синхронизации актуально, и хорошо бы для таких ситуаций добавить возможность сообщить индикатору о необходимости передать поток данных другим индикаторам, без которых невозможно произвести дальнейший расчет - это было бы решением - команда для передачи потока другому без окончания расчета.
Соответственно, советник должен ждать получение данных от индикатора и пропускать тики до окончания полного расчета, а сейчас при попытке применить оператор while для ожидания корректных результатов расчета происходит зависание/зацикливание (т.е. ничего не происходит просто стоит тестер), а это так же не корректно.
Разработчику я, конечно, сообщил, но от него нет вестей более месяца - издержки фриланса.
ситуация в тестере и на реальном счете отличается, имитация Sleep работает очень странно, а перерасчет индикатора за 15 секунд слипа происходит только 1 раз, в то время как он должен происходить на каждом же тике, или по запросу, а он происходит не в 15 секунд, а в 13, судя по логу.
Кроме того, проблема синхронизации актуально, и хорошо бы для таких ситуаций добавить возможность сообщить индикатору о необходимости передать поток данных другим индикаторам, без которых невозможно произвести дальнейший расчет - это было бы решением - команда для передачи потока другому без окончания расчета.
Соответственно, советник должен ждать получение данных от индикатора и пропускать тики до окончания полного расчета, а сейчас при попытке применить оператор while для ожидания корректных результатов расчета происходит зависание/зацикливание (т.е. ничего не происходит просто стоит тестер), а это так же не корректно.
Уважаемый Artyom Trishkin !
Очень надеюсь, что раз Вы определили, что выше мной поставленные вопросы для новичков, то уже знаете на них ответ и сможете мне помочь!
Нахожусь в ожидание ответа от профессионала.
Уважаемый Artyom Trishkin !
Очень надеюсь, что раз Вы определили, что выше мной поставленные вопросы для новичков, то уже знаете на них ответ и сможете мне помочь!
Нахожусь в ожидание ответа от профессионала.
Могу лишь посоветовать: индикатор должен выходить из OnCalculate() если не получил нужное количество баров для расчёта: if(rates_total<нужное_количество_баров) return 0;
Советник же должен проверять полученные данные от индикатора, и если они не равны пустому значению индикатора, то только тогда производить расчёты с полученными данными.
... ... ...
Могу лишь посоветовать: индикатор должен выходить из OnCalculate() если не получил нужное количество баров для расчёта: if(rates_total<нужное_количество_баров) return 0;
Спасибо за совет, с выходом проблем нет, но это не решает ситуации, я пока сделал как неудачный расчет
И каким то образом происходит заполнение буферов и получение данных от других индикаторов, при этом данные не передаются советнику, пока условие не будет выполнятся. Корректность данных пока не проверял, но на глаз все верно. Или я не прав, и что-то точно не верно?
Советник же должен проверять полученные данные от индикатора, и если они не равны пустому значению индикатора, то только тогда производить расчёты с полученными данными.
Советник выполняет расчет один при приходе нового бара, и соответственно при попытки ожидать через while получения корректного значения от индикатора приводит к остановке работы тестера.
... ... ...
1. Так и есть.
2. Так и происходит. И расчет будет корректен на следующем тике, но мне надо получать корректный расчет на первом тике, так-как советник не ждет в цикле других тиков или там не соизмеримое моему терпению ожидание, т.е. не реалистичное - имеется ошибка.
3. Так и есть.
4. Конечно.
5. Да, получаем, но индикатору нужно получить данные от других индикаторов и в этом проблема!
6. 1-2. не корректно класть заведомо ложные данные в буфер индикатора, это только усложнит выявление ошибки алгоритма советника в коде.
7. Я всё описываю логически, но индикатор я не писал, поэтому мне сложно понять в чем там причина, я описал обоснованно проявления работы индикатора, а именно невозможность произвести расчет без получения значений буферов от других индикаторов, по причине монопольного использования потока данных (индикаторы считаются последовательно).
8. Я уже отметил тут и ранее, что я не автор, на выявление причин потратил очень много времени - почти сутки.
9. А я ищу решения проблемы, к тому же, если кто-то с этим сталкивался то, сможет мне быстро помочь. Повторюсь, в той теме я начал писать из-за Sleep, а дальше вылезли другие особенности работы тестера, которые я так же считаю ошибкой.
Спасибо за ответ.
Спасибо за совет, с выходом проблем нет, но это не решает ситуации, я пока сделал как неудачный расчет
И каким то образом происходит заполнение буферов и получение данных от других индикаторов, при этом данные не передаются советнику, пока условие не будет выполнятся. Корректность данных пока не проверял, но на глаз все верно. Или я не прав, и что-то точно не верно?
Советник выполняет расчет один при приходе нового бара, и соответственно при попытки ожидать через while получения корректного значения от индикатора приводит к остановке работы тестера.
1. Так и есть.
2. Так и происходит. И расчет будет корректен на следующем тике, но мне надо получать корректный расчет на первом тике, так-как советник не ждет в цикле других тиков или там не соизмеримое моему терпению ожидание, т.е. не реалистичное - имеется ошибка.
3. Так и есть.
4. Конечно.
5. Да, получаем, но индикатору нужно получить данные от других индикаторов и в этом проблема!
6. 1-2. не корректно класть заведомо ложные данные в буфер индикатора, это только усложнит выявление ошибки алгоритма советника в коде.
7. Я всё описываю логически, но индикатор я не писал, поэтому мне сложно понять в чем там причина, я описал обоснованно проявления работы индикатора, а именно невозможность произвести расчет без получения значений буферов от других индикаторов, по причине монопольного использования потока данных (индикаторы считаются последовательно).
8. Я уже отметил тут и ранее, что я не автор, на выявление причин потратил очень много времени - почти сутки.
9. А я ищу решения проблемы, к тому же, если кто-то с этим сталкивался то, сможет мне быстро помочь. Повторюсь, в той теме я начал писать из-за Sleep, а дальше вылезли другие особенности работы тестера, которые я так же считаю ошибкой.
Спасибо за ответ.
В OnInit() сделайте обращение к таймсерии символа: iTime(Symbol,Timeframe,1);
В OnTick() в самом начале сделайте запрос нужного бара нужной таймсерии через соответствующую iFunc(), хотя бы тем же if( iTime(Symbol,Timeframe,10)==0) return;
Тогда советник не дойдёт до определения нового бара и будет ждать следующего тика.
В OnInit() мы запросили данные таймсерии, тем самым активизировав подкачку данных.
В OnTick()проверяем доступность минимально-требуемой советнику истории и, если она ещё не доступна - уходим в ожидание следующего тика.
И пока не будут получены все требуемые советнику данные, он так и будет ожидать следующий тик.
Как только все необходимые данные будут подкачаны и получены, советник начнёт работу с новым баром и нужной ему историей.
Для поддержания серийных данных в актуальном состоянии, обязательно нужно к ним обращаться не менее одного раза в две минуты. Сделайте секундный таймер примерно на полторы минуты (90 секунд) и в нём просто обращайтесь к любой таймсерии нужного символа, например iTime(Symbol,Timeframe,1); Без проверки полученных данных - просто "шевельнуть" историю. Тогда все данные по символу будут всегда находиться в актуальном состоянии.