Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 985

 

do { ... код заполнения буфера

}

while(эти два значения не совпадают)

короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий код
 
Maxim Dmitrievsky:

do { ... код заполнения буфера

}

while(эти два значения не совпадают)

короче получать значения до тех пор в цикле, пока они не совпадут, только после этого выполнять следующий код

Так дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет. А как только OnCalculate заканчивается, то сразу отдаются данные советнику, а они ошибочны.

Или я не понял Вашу идею.
 
Aleksey Vyazmikin:

Так дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет.

по очереди получаете значения из буферов других индикаторов, если их не одинаковое количество то получаете снова пока не станет одинаковым, забудьте про потоки. но вообще так никто не делает это извращение индикаторы от индикаторов, очень медленно

 
Aleksey Vyazmikin:

Так дело в том, что пока не отработает один индикатор, данные (поток) не передаются другому, т.е. цикл в индикаторе без окончания работы OnCalculate этого индикатора не поможет. А как только OnCalculate заканчивается, то сразу отдаются данные советнику, а они ошибочны.

Или я не понял Вашу идею.

вам надо что бы условие выполнилось, тогда только буферы заполнятся, как я понял (что бы кол-во баров в буферах других индикаторов совпадало)

принудительно выполните условия все перед заполнением буферов текущего индикатора

или криворукому программисту отдайте обратно, че мы должны его проблемы решать не в той теме вообще

 
Maxim Dmitrievsky:

по очереди получаете значения из буферов других индикаторов, если их не одинаковое количество то получаете снова пока не станет одинаковым, забудьте про потоки. но вообще так никто не делает это извращение индикаторы от индикаторов, очень медленно

Maxim Dmitrievsky:

вам надо что бы условие выполнилось, тогда только буферы заполнятся, как я понял (что бы кол-во баров в буферах других индикаторов совпадало)

принудительно выполните условия все перед заполнением буферов текущего индикатора

или криворукому программисту отдайте обратно, че мы должны его проблемы решать не в той теме вообще

Если расчет не готов от других индикаторов, то значения будут нулевыми, поэтому принудительно тут нет смысла заполнять, можно заполнить прошлыми данными, но с таким же эффектом можно запрашивать данные не по текущему бару у индикатора, а по прошлому и тогда код вообще править не надо.

Почему обсуждаем здесь - так-как ситуация в тестере и на реальном счете отличается, имитация Sleep работает очень странно, а перерасчет индикатора за 15 секунд слипа происходит только 1 раз, в то время как он должен происходить на каждом же тике, или по запросу, а он происходит не в 15 секунд, а в 13, судя по логу.

Кроме того, проблема синхронизации актуально, и хорошо бы для таких ситуаций добавить возможность сообщить индикатору о необходимости передать поток данных другим индикаторам, без которых невозможно произвести дальнейший расчет - это было бы решением - команда для передачи потока другому без окончания расчета.

Соответственно, советник должен ждать получение данных от индикатора и пропускать тики до окончания полного расчета, а сейчас при попытке применить оператор while для ожидания корректных результатов расчета происходит зависание/зацикливание (т.е. ничего не происходит просто стоит тестер), а это так же не корректно.

Разработчику я, конечно, сообщил, но от него нет вестей более месяца - издержки фриланса.

 

ситуация в тестере и на реальном счете отличается, имитация Sleep работает очень странно, а перерасчет индикатора за 15 секунд слипа происходит только 1 раз, в то время как он должен происходить на каждом же тике, или по запросу, а он происходит не в 15 секунд, а в 13, судя по логу.

Кроме того, проблема синхронизации актуально, и хорошо бы для таких ситуаций добавить возможность сообщить индикатору о необходимости передать поток данных другим индикаторам, без которых невозможно произвести дальнейший расчет - это было бы решением - команда для передачи потока другому без окончания расчета.

Соответственно, советник должен ждать получение данных от индикатора и пропускать тики до окончания полного расчета, а сейчас при попытке применить оператор while для ожидания корректных результатов расчета происходит зависание/зацикливание (т.е. ничего не происходит просто стоит тестер), а это так же не корректно.

 

Уважаемый Artyom Trishkin !

Очень надеюсь, что раз Вы определили, что выше мной поставленные вопросы для новичков, то уже знаете на них ответ и сможете мне помочь!

Нахожусь в ожидание ответа от профессионала.

 
Aleksey Vyazmikin:

Уважаемый Artyom Trishkin !

Очень надеюсь, что раз Вы определили, что выше мной поставленные вопросы для новичков, то уже знаете на них ответ и сможете мне помочь!

Нахожусь в ожидание ответа от профессионала.

Могу лишь посоветовать: индикатор должен выходить из OnCalculate() если не получил нужное количество баров для расчёта: if(rates_total<нужное_количество_баров) return 0;

Советник же должен проверять полученные данные от индикатора, и если они не равны пустому значению индикатора, то только тогда производить расчёты с полученными данными.

  1. В индикаторе сначала инициализируются буферы пустым значением (какое оно - можно задать в индикаторе)
  2. В индикаторе (буферы уже заполнены пустым значением) проверяем количество доступных баров (описал выше)
  3. Если проверка доступности баров пройдена, выполняется цикл расчёта индикатора с заполнением буферов нужными значениями
    ... ... ...
  4. В советнике проверяем сколько баров рассчитано индикатором (есть стандартная для этого функция BarsCalculated())
  5. Получаем данные от индикатора
  6. В зависимости от того, что получено - тут уже зависит от логики вашей ТС
    1. Если индикатор - линия, то его пустое значение говорит о том, что он ещё не рассчитан - значит не берём его в расчёты
    2. Если индикатор - стрелки, то тут уже иная логика (так как пустое значение тоже является его рабочими данными), например, если это фрактал, то проверяем бар №3, и от полученных значений отталкиваемся.
  7. Ну и включайте собственную логику, а не валите всё на БАГИ терминала.
  8. Баги в первую очередь я проверяю У СЕБЯ.
  9. А вы?
 
Artyom Trishkin:

Могу лишь посоветовать: индикатор должен выходить из OnCalculate() если не получил нужное количество баров для расчёта: if(rates_total<нужное_количество_баров) return 0;

Спасибо за совет, с выходом проблем нет, но это не решает ситуации, я пока сделал как неудачный расчет

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

И каким то образом происходит заполнение буферов и получение данных от других индикаторов, при этом данные не передаются советнику, пока условие не будет выполнятся. Корректность данных пока не проверял, но на глаз все верно. Или я не прав, и что-то точно не верно?

Artyom Trishkin:

Советник же должен проверять полученные данные от индикатора, и если они не равны пустому значению индикатора, то только тогда производить расчёты с полученными данными.

Советник выполняет расчет один при приходе нового бара, и соответственно при попытки ожидать через while получения корректного значения от индикатора приводит к остановке работы тестера.

Artyom Trishkin:
  1. В индикаторе сначала инициализируются буферы пустым значением (какое оно - можно задать в индикаторе)
  2. В индикаторе (буферы уже заполнены пустым значением) проверяем количество доступных баров (описал выше)
  3. Если проверка доступности баров пройдена, выполняется цикл расчёта индикатора в заполнением буферов нужными значениями
    ... ... ...
  4. В советнике проверяем сколько баров рассчитано индикатором (есть стандартная для этого функция BarsCalculated())
  5. Получаем данные от индикатора
  6. В зависимости от того, что получено - тут уже зависит от логики вашей ТС
    1. Если индикатор - линия, то его пустое значение говорит о том, что он ещё не рассчитан - значит не берём его в расчёты
    2. Если индикатор - стрелки, то тут уже иная логика (так как пустое значение тоже является его рабочими данными), например, если это фрактал, то проверяем бар №3, и от полученных значений отталкиваемся.
  7. Ну и включайте собственную логику, а не валите всё на БАГИ терминала.
  8. Баги в первую очередь я проверяю У СЕБЯ.
  9. А вы?

1. Так и есть.

2. Так и происходит. И расчет будет корректен на следующем тике, но мне надо получать корректный расчет на первом тике, так-как советник не ждет в цикле других тиков или там не соизмеримое моему терпению ожидание, т.е. не реалистичное - имеется ошибка.

3. Так и есть.

4. Конечно.

5. Да, получаем, но индикатору нужно получить данные от других индикаторов и в этом проблема!

6. 1-2. не корректно класть заведомо ложные данные в буфер индикатора, это только усложнит выявление ошибки алгоритма советника в коде.

7. Я всё описываю логически, но индикатор я не писал, поэтому мне сложно понять в чем там причина, я описал обоснованно проявления работы индикатора, а именно невозможность произвести расчет без получения значений буферов от других индикаторов, по причине монопольного использования потока данных (индикаторы считаются последовательно).

8. Я уже отметил тут и ранее, что я не автор, на выявление причин потратил очень много времени - почти сутки.

9. А я ищу решения проблемы, к тому же, если кто-то с этим сталкивался то, сможет мне быстро помочь. Повторюсь, в той теме я начал писать из-за Sleep, а дальше вылезли другие особенности работы тестера, которые я так же считаю ошибкой.

Спасибо за ответ.

 
Aleksey Vyazmikin:

Спасибо за совет, с выходом проблем нет, но это не решает ситуации, я пока сделал как неудачный расчет

И каким то образом происходит заполнение буферов и получение данных от других индикаторов, при этом данные не передаются советнику, пока условие не будет выполнятся. Корректность данных пока не проверял, но на глаз все верно. Или я не прав, и что-то точно не верно?

Советник выполняет расчет один при приходе нового бара, и соответственно при попытки ожидать через 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); Без проверки полученных данных - просто "шевельнуть" историю. Тогда все данные по символу будут всегда находиться в актуальном состоянии.

Причина обращения: