Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2495
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
если MTF (кстати и не только MTF) ещё и в индикаторные буферы что-то такое пишет, что пользователь должен видеть (то есть индик не только для роботов делается), или требуется скорость и гарантии
то ChartSetSymbolPeriod(0,NULL,0) не панацея..он асинхронный и получается ощутимая задержка между вызовом и отображением на экране. И можно словить глюк вызывая из советника: при обращении к CopyBuffer результата нет, хотя все условия есть. А просто индикатор уже выставил SetSymbolPeriod, но новый рассчёт ещё не запустился. И советник попал в этот мизерный промежуток. А трейдер попал на деньги :-)
выход: своя отдельная рассчётная функция, которую удобно вызывать не только из OnCalculate.. И которая не использует его буферы time/open/high/etc (сама делает CopyXXX или CopyRates при надобности), потому что в других местах их просто нет.
Он быстрее обновляет чарт, нежели приходят цены, так что задержка в получении данных, а не в ChartSetSymbolPeriod
Предположим, попал в этот промежуток, не получив результат обратился снова и получил результат. Проблем с советником нет.
--
А вообще, ждал пока Артём как специалист по индикаторам, даст дельный совет по моему коду, не теоретическое, а практическое. Я вижу только это работоспособное решение.
Он быстрее обновляет чарт, нежели приходят цены, так что задержка в получении данных, а не в ChartSetSymbolPeriod
Предположим, попал в этот промежуток, не получив результат обратился снова и получил результат. Проблем с советником нет.
--
А вообще, ждал пока Артём как специалист по индикаторам, даст дельный совет по моему коду, не теоретическое, а практическое. Я вижу только это работоспособное решение.
Я не специалист по индикаторам.
Но если нужен тик в их отсутствие, то да - ChartSetSymbolPeriod с теми же символом/периодом, что и рабочие. А уж как отслеживать, что нужен тик - это дело каждого, думается
Он быстрее обновляет чарт, нежели приходят цены, так что задержка в получении данных, а не в ChartSetSymbolPeriod
Предположим, попал в этот промежуток, не получив результат обратился снова и получил результат. Проблем с советником нет.
--
А вообще, ждал пока Артём как специалист по индикаторам, даст дельный совет по моему коду, не теоретическое, а практическое. Я вижу только это работоспособное решение.
с советником происходит @па..от вызова ChartSetSymbolPeriod до перевычислений проходит безумное время это раз. И перевычисляются все индикаторы чарта это два (всё равно что кнопку Refresh нажать). То есть лёгким движением руки вы втормаживаете ВСЁ. Советник будет пропускать тики, ловить реквоты, а виноваты конечно будут брокер и юзер.
индикатор в аттаче. Хотя могли бы и сами такое написать ради проверки
практичный вы наш :-)
с советником происходит @па..от вызова ChartSetSymbolPeriod до перевычислений проходит безумное время это раз. И перевычисляются все индикаторы чарта это два (всё равно что кнопку Refresh нажать). То есть лёгким движением руки вы втормаживаете ВСЁ. Советник будет пропускать тики, ловить реквоты, а виноваты конечно будут брокер и юзер.
индикатор в аттаче. Хотя могли бы и сами такое написать ради проверки
практичный вы наш :-)
Вопрос был не о советнике, а индикаторе. Одном. Как я понимаю. Зачем в советнике применять принудительное обновление чарта со всеми прилагающимися к этому проблемами? Советник != индикатор.
Вопрос был не о советнике, а индикаторе. Одном. Как я понимаю. Зачем в советнике применять принудительное обновление чарта со всеми прилагающимися к этому проблемами? Советник != индикатор.
индикатор вызовет обновление чарта. Как правило индикатор на чарте отнюдь не один. А что прилетит советнику на этом чарте ? ему прилетят тормоза в первую очередь.
Зачем (кроме отладки) из софта вызывать обновление всего чарта ?
в 4-ке разве что, эмулируя CustomChart и его тики .. других веских причин и нет наверное.
индикатор вызовет обновление чарта. Как правило индикатор на чарте отнюдь не один. А что прилетит советнику на этом чарте ? ему прилетят тормоза в первую очередь.
Зачем (кроме отладки) из софта вызывать обновление всего чарта ?
в 4-ке разве что, эмулируя CustomChart и его тики .. других веских причин и нет наверное.
с советником происходит @па..от вызова ChartSetSymbolPeriod до перевычислений проходит безумное время это раз. И перевычисляются все индикаторы чарта это два (всё равно что кнопку Refresh нажать). То есть лёгким движением руки вы втормаживаете ВСЁ. Советник будет пропускать тики, ловить реквоты, а виноваты конечно будут брокер и юзер.
индикатор в аттаче. Хотя могли бы и сами такое написать ради проверки
практичный вы наш :-)
А зачем?
Зачем его вызывать постоянно?
Разок вызвать и прибить таймер. Я всегда так делал у индикаторов, которые не рассчитываются на первом тике. Проблем не возникало никогда.
С тем же обсуждаемым выше iBarShift(), можно жамкать кнопку переключая таймфреймы и будут пересчитываться все индикаторы, а можно не жамкать и они пересчитаются принудительно заодно подкачав нужную историю.
А зачем?
Зачем его вызывать постоянно?
Разок вызвать и прибить таймер. Я Всегда так делал, проблем не возникало никогда.
А на следующих выходных таймер уже прибит
А на следующих выходных таймер уже прибит
Если таймер уже прибит значит индикатор уже рассчитан и его не надо рассчитывать по новой.
Подскажите, пожалста. При первом переключении графика на какой-нибудь из тф, иногда вылетает индикатор на iBarShift, которая возвращает -1.
При повторном переключении тф, как правило, такого нет.
Как в приличном обществе принято поступать в такой ситуации?
Попробуйте провести принудительную синхронизацию данных при переключении ТФ графика. Например, добавить цикл в функцию OnChartEvent().
Просто вместо задержки использовать несколько итераций. Например, так:
bool synchronized=false;
//--- счетчик цикла
int attempts=0;
// сделаем 5 попыток дождаться синхронизации
while(attempts<5)
{
if(SeriesInfoInteger(Symbol(),PERIOD_M1,SERIES_SYNCHRONIZED))
{
//--- есть синхронизация, выходим
synchronized=true;
break;
}
//--- увеличим счетчик
attempts++;
}