Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2495

 
Maxim Kuznetsov #:

если MTF (кстати и не только MTF) ещё и в индикаторные буферы что-то такое пишет, что пользователь должен видеть (то есть индик не только для роботов делается), или требуется скорость и гарантии

то ChartSetSymbolPeriod(0,NULL,0) не панацея..он асинхронный и получается ощутимая задержка между вызовом и отображением на экране. И можно словить глюк вызывая из советника: при обращении к CopyBuffer результата нет, хотя все условия есть. А просто индикатор уже выставил SetSymbolPeriod, но новый рассчёт ещё не запустился. И советник попал в этот мизерный промежуток. А трейдер попал на деньги :-)

выход: своя отдельная рассчётная функция, которую удобно вызывать не только из OnCalculate.. И которая не использует его буферы time/open/high/etc (сама делает CopyXXX или CopyRates при надобности), потому что в других местах их просто нет.

Он быстрее обновляет чарт, нежели приходят цены, так что задержка в получении данных, а не в ChartSetSymbolPeriod

Предположим, попал в этот промежуток, не получив результат обратился снова и получил результат. Проблем с советником нет.

--

А вообще, ждал пока Артём как специалист по индикаторам, даст дельный совет по моему коду, не теоретическое, а практическое. Я вижу только это работоспособное решение.

 
Vitaly Muzichenko #:

Он быстрее обновляет чарт, нежели приходят цены, так что задержка в получении данных, а не в ChartSetSymbolPeriod

Предположим, попал в этот промежуток, не получив результат обратился снова и получил результат. Проблем с советником нет.

--

А вообще, ждал пока Артём как специалист по индикаторам, даст дельный совет по моему коду, не теоретическое, а практическое. Я вижу только это работоспособное решение.

Я не специалист по индикаторам.

Но если нужен тик в их отсутствие, то да - ChartSetSymbolPeriod с теми же символом/периодом, что и рабочие. А уж как отслеживать, что нужен тик - это дело каждого, думается

 
Vitaly Muzichenko #:

Он быстрее обновляет чарт, нежели приходят цены, так что задержка в получении данных, а не в ChartSetSymbolPeriod

Предположим, попал в этот промежуток, не получив результат обратился снова и получил результат. Проблем с советником нет.

--

А вообще, ждал пока Артём как специалист по индикаторам, даст дельный совет по моему коду, не теоретическое, а практическое. Я вижу только это работоспособное решение.

с советником происходит @па..от вызова ChartSetSymbolPeriod до перевычислений проходит безумное время это раз. И перевычисляются все индикаторы чарта это два (всё равно что кнопку Refresh нажать). То есть лёгким движением руки вы втормаживаете ВСЁ. Советник будет пропускать тики, ловить реквоты, а виноваты конечно будут брокер и юзер.

индикатор в аттаче. Хотя могли бы и сами такое написать ради проверки


практичный вы наш :-)

Файлы:
Refresh.mq5  3 kb
 
Maxim Kuznetsov #:

с советником происходит @па..от вызова ChartSetSymbolPeriod до перевычислений проходит безумное время это раз. И перевычисляются все индикаторы чарта это два (всё равно что кнопку Refresh нажать). То есть лёгким движением руки вы втормаживаете ВСЁ. Советник будет пропускать тики, ловить реквоты, а виноваты конечно будут брокер и юзер.

индикатор в аттаче. Хотя могли бы и сами такое написать ради проверки


практичный вы наш :-)

Вопрос был не о советнике, а индикаторе. Одном. Как я понимаю. Зачем в советнике применять принудительное обновление чарта со всеми прилагающимися к этому проблемами? Советник != индикатор.

 
Artyom Trishkin #:

Вопрос был не о советнике, а индикаторе. Одном. Как я понимаю. Зачем в советнике применять принудительное обновление чарта со всеми прилагающимися к этому проблемами? Советник != индикатор.

индикатор вызовет обновление чарта. Как правило индикатор на чарте отнюдь не один. А что прилетит советнику на этом чарте ? ему прилетят тормоза в первую очередь.

Зачем (кроме отладки) из софта вызывать обновление всего чарта ? 

в 4-ке разве что, эмулируя CustomChart и его тики .. других веских причин и нет наверное. 

 
Maxim Kuznetsov #:

индикатор вызовет обновление чарта. Как правило индикатор на чарте отнюдь не один. А что прилетит советнику на этом чарте ? ему прилетят тормоза в первую очередь.

Зачем (кроме отладки) из софта вызывать обновление всего чарта ? 

в 4-ке разве что, эмулируя CustomChart и его тики .. других веских причин и нет наверное. 

Люди хотят в выходные видеть индикаторы на графике. Мульти- индикаторы без тика сделать это редко могут
 
Maxim Kuznetsov #:

с советником происходит @па..от вызова ChartSetSymbolPeriod до перевычислений проходит безумное время это раз. И перевычисляются все индикаторы чарта это два (всё равно что кнопку Refresh нажать). То есть лёгким движением руки вы втормаживаете ВСЁ. Советник будет пропускать тики, ловить реквоты, а виноваты конечно будут брокер и юзер.

индикатор в аттаче. Хотя могли бы и сами такое написать ради проверки


практичный вы наш :-)

А зачем?

Зачем его вызывать постоянно?

Разок вызвать и прибить таймер. Я всегда так делал у индикаторов, которые не рассчитываются на первом тике. Проблем не возникало никогда.

int priv = 0;
//+------------------------------------------------------------------+
int OnInit()
  {
   // код
   priv = 0;
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double& price[])
  {
   priv = prev_calculated;
   // код
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(priv <= 0)//если выходные и нет новых тиков
      ChartSetSymbolPeriod(0, _Symbol, PERIOD_CURRENT);
   else
      EventKillTimer();
  }
//+------------------------------------------------------------------+

С тем же обсуждаемым выше iBarShift(), можно жамкать кнопку переключая таймфреймы и будут пересчитываться все индикаторы, а можно не жамкать и они пересчитаются принудительно заодно подкачав нужную историю.

 
Aleksandr Slavskii #:

А зачем?

Зачем его вызывать постоянно?

Разок вызвать и прибить таймер. Я Всегда так делал, проблем не возникало никогда.

А на следующих выходных таймер уже прибит

 
Artyom Trishkin #:

А на следующих выходных таймер уже прибит

Если таймер уже прибит значит индикатор уже рассчитан и его не надо рассчитывать по новой.

 
Andrei Sokolov #:

Подскажите, пожалста. При первом переключении графика на какой-нибудь из тф, иногда вылетает индикатор на iBarShift, которая возвращает -1. 


При повторном переключении тф, как правило, такого нет.

Как в приличном обществе принято поступать в такой ситуации?

Попробуйте провести принудительную синхронизацию данных при переключении ТФ графика. Например, добавить цикл в функцию OnChartEvent().

Просто вместо задержки использовать несколько итераций. Например, так:

bool synchronized=false; 

      //--- счетчик цикла

int attempts=0; 

      // сделаем 5 попыток дождаться синхронизации 

      while(attempts<5) 

        { 

         if(SeriesInfoInteger(Symbol(),PERIOD_M1,SERIES_SYNCHRONIZED)) 

           { 

            //--- есть синхронизация, выходим 

            synchronized=true; 

            break; 

           } 

         //--- увеличим счетчик 

         attempts++; 

       }