Ошибки, баги, вопросы - страница 1786
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Если заменить OnCalculate на OnTick, ошибки не сыпятся. Проблем не в SymbolInfoTick, а в том, что индикаторы кривовато настроены на отсутствие пропусков.
Насколько долго производили замеры? И при чем тут настройка индикаторов? Время прихода текущего тика 10, время прихода предыдущего - 11. Тут на лицо ошибка функции, которая возвращает не текущее значение. Ведь Вы согласны, что текущее значение времени не может быть меньше предыдущего?
SymbolInfoTick в индикаторах работает совсем не так, как в советниках.
В индикаторе она возвращает всегда тот тик, который был инициатором вызова OnCalculate. И эти инициаторные тики в индикаторе не должны пропускаться - идеология разработчиков. Проблема в формировании очереди этих тиков.
В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.
Замерял десять минут на Si.
SymbolInfoTick в индикаторах работает совсем не так, как в советниках.
В индикаторе она возвращает всегда тот тик, который был инициатором вызова OnCalculate. И эти инициаторные тики в индикаторе не должны пропускаться - идеология разработчиков. Проблема в формировании очереди этих тиков.
В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.
Замерял десять минут на Si.
Третье, даже если с SymbolInfoTick() все в порядке - она все равно работает лучше, чем CopyTicks(), т.к. зачастую возвращает более актуальные значения.
Ловил ситуации, когда CopyTicks отдавал более свежие данные, чем SymbolInfoTick, вызванный ПОЗЖЕ. Поэтому делаю запрос сразу двумя функциями и выбираю наиболее свежий из них тик.
SymbolInfoTick в индикаторах работает совсем не так, как в советниках.
В индикаторе она возвращает всегда тот тик, который был инициатором вызова OnCalculate. И эти инициаторные тики в индикаторе не должны пропускаться - идеология разработчиков. Проблема в формировании очереди этих тиков.
В советнике же SymbolInfoTick в OnTick вовсе не возвращает тик, который инициировал запуск OnTick, а делает полноценный запрос на текущее состояние.
Тогда логично было бы дополнить
тиком который ее вызвал, тем более что это ничего не стоит
А функцию 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!! Так что не расслабляйтесь, г. разработчики экспертов, все надо проверять своими руками.
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
Тогда логично было бы дополнить
тиком который ее вызвал, тем более что это ничего не стоит
А функцию SymbolInfoTick() сделать полноценной и в Индикаторе и в Советнике (возвращать текущие цены, а не цены на момент формирования вызова OnCalculate)
Логично даже добавить номер тика в текущей очереди.