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

[Удален]  
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:
Логично даже добавить номер тика в текущей очереди.
Зачем нужен номер тика? Нужен просто корректный поток, который корректно отдают и который можно корректно получить.
 
fxsaber:
Логично даже добавить номер тика в текущей очереди.

Тогда я прямо так и пишу в ServiceDesk#1666680

Просим рассмотреть возможность изменения принципов работы функции

bool SymbolInfoTick( string symbol, MqlTick& tick );

с тем, чтобы в Индикаторах (включая тело OnCalculate) она возвращала текущие цены, согласно своему описанию

одновременно дополнив язык функцией

bool SymbolInfoTick_OnCalculate( string& symbol, MqlTick& tick ); //(*)

которая возвращала бы в функции OnCalculate символ и конкретный tick послужившие причиной вызова OnCalculate

или как альтернатива (*) : дополнить этими параметрами вызов OnCalculate

OnCalculate( ..., const string& symbol, const MqlTick& tick );
[Удален]  

Возник вопрос: можно ли как-то средствами mql5 определить все запущенные программы на графиках и их имена? В частности, интересует как можно получить имена всех индикаторов на текущем графике? 

 
Alexey Kozitsyn:

Возник вопрос: можно ли как-то средствами mql5 определить все запущенные программы на графиках и их имена? В частности, интересует как можно получить имена всех индикаторов на текущем графике? 

https://www.mql5.com/ru/docs/chart_operations/chartindicatorstotal

https://www.mql5.com/ru/docs/chart_operations/chartindicatorname

https://www.mql5.com/ru/docs/chart_operations/chartgetstring

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property#enum_chart_property_string
Документация по MQL5: Операции с графиками / ChartIndicatorName
Документация по MQL5: Операции с графиками / ChartIndicatorName
  • www.mql5.com
Операции с графиками / ChartIndicatorName - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5