Ошибки, баги, вопросы - страница 1786

 
fxsaber:
Если заменить OnCalculate на OnTick, ошибки не сыпятся. Проблем не в SymbolInfoTick, а в том, что индикаторы кривовато настроены на отсутствие пропусков.
Насколько долго производили замеры? И при чем тут настройка индикаторов? Время прихода текущего тика 10, время прихода предыдущего - 11. Тут на лицо ошибка функции, которая возвращает не текущее значение. Ведь Вы согласны, что текущее значение времени не может быть меньше предыдущего?
 
Alexey Kozitsyn:
Насколько долго производили замеры? И при чем тут настройка индикаторов? Время прихода текущего тика 10, время прихода предыдущего - 11. Тут на лицо ошибка функции, которая возвращает не текущее значение. Ведь Вы согласны, что текущее значение времени не может быть меньше предыдущего?

SymbolInfoTick в индикаторах работает совсем не так, как в советниках.

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

В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.

Замерял десять минут на Si. 

 
fxsaber:

SymbolInfoTick в индикаторах работает совсем не так, как в советниках.

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

В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние. 

Значит очередь тиков косая. В любом случае нужно разбираться с работой в индикаторах. Такое ощущение складывается, что основной упор делается на тестирование функций для работы с советниками. Это первое. Второе - Вы уверены, что SymbolInfoTick() синхронная функция? Третье, даже если с SymbolInfoTick() все в порядке - она все равно работает лучше, чем CopyTicks(), т.к. зачастую возвращает более актуальные значения. Короче, как я и сказал, ошибок с тиками много. А разработчики молчат...
 
fxsaber:

Замерял десять минут на Si. 

Этого очень мало. Замеряйте несколько часов. На нескольких инструментах.
 
Alexey Kozitsyn:
Третье, даже если с SymbolInfoTick() все в порядке - она все равно работает лучше, чем CopyTicks(), т.к. зачастую возвращает более актуальные значения.
Ловил ситуации, когда CopyTicks отдавал более свежие данные, чем SymbolInfoTick, вызванный ПОЗЖЕ. Поэтому делаю запрос сразу двумя функциями и выбираю наиболее свежий из них тик.
 
fxsaber:
Ловил ситуации, когда CopyTicks отдавал более свежие данные, чем SymbolInfoTick, вызванный ПОЗЖЕ. Поэтому делаю запрос сразу двумя функциями и выбираю наиболее свежий из них тик.
Проводил тест сначала вызвав SymbolInfoTick(), лишь затем - CopyTicks(). В любом случае, Вы считаете, что такое поведение корректно и ничего менять не нужно?
 
fxsaber:

SymbolInfoTick в индикаторах работает совсем не так, как в советниках.

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

В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.

Тогда логично было бы дополнить 

OnCalculate( ..., const MqlTick& tick );

тиком который ее вызвал, тем более что это ничего не стоит

А функцию SymbolInfoTick() сделать полноценной и в Индикаторе и в Советнике (возвращать текущие цены, а не цены на момент формирования вызова  OnCalculate)

 

MT4 продолжает поражать непредсказуемостью )) Кто пишет реализацию торговых функций?? МТ4 build 1045

 Начнем с юмористической справки, ее давно пора Задорнову отослать, а то все на тупых американцев наезжает.

SYMBOL_TRADE_TICK_VALUE

Значение SYMBOL_TRADE_TICK_VALUE_PROFIT

double

SYMBOL_TRADE_TICK_VALUE_PROFIT

Не поддерживается

double

SYMBOL_TRADE_TICK_VALUE_LOSS

Не поддерживается

double


 Между тем SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue) выдает значение. НО!!!!! Если кинуть индикатор на график, то при старте все будет ОК. А если перезапустить терминал, то данная функция при первых обращениях вернет true и ноль в результате tickValue!! Так что не расслабляйтесь, г. разработчики экспертов, все надо проверять своими руками.

//переводит котировку в цену/1_лот в валюте депозита, например 0.00015 для EURUSD будет равно $15/лот
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
  {
   int dig=(int)MarketInfo(symbol,MODE_DIGITS);
   if(dig == 0)
      return(false); // symbol is none
   double tickSize = MarketInfo(symbol, MODE_TICKSIZE);   // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
   //double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
   double tickValue;
   if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
      Print(__FUNCTION__, "  SymbolInfoDouble(...) returns false"); // всегда возвращается true!!
   Print("tickSize= ", tickSize, "  tickValue= ", tickValue);
   if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль...
      return false;
   double price=diff/(tickSize/tickValue); // а то завалимся c tickValue == 0
   price4lot=NormalizeDouble(price,2);
   return (true);
  }

Выход:

 2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05  tickValue= 1.0

2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05  tickValue= 1.0

2017.02.07 16:08:24.515 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05  tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05  tickValue= 0.0

2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: initialized

2017.02.07 16:08:23.002 Custom indicator ShowImportantParams EURUSD.e,M15: loaded successfully


 
A100:

Тогда логично было бы дополнить 

OnCalculate( ..., const MqlTick& tick );

тиком который ее вызвал, тем более что это ничего не стоит

А функцию SymbolInfoTick() сделать полноценной и в Индикаторе и в Советнике (возвращать текущие цены, а не цены на момент формирования вызова  OnCalculate)

Логично даже добавить номер тика в текущей очереди.
 
fxsaber:
Логично даже добавить номер тика в текущей очереди.
Зачем нужен номер тика? Нужен просто корректный поток, который корректно отдают и который можно корректно получить.
Причина обращения: