Особенности языка mql5, тонкости и приёмы работы - страница 40

 
// Возвращает текущее количество объектов классов
int GetAmountObjects( void )
{
  const class CLASS_TMP {} Tmp;
  
  return((int)::StringFormat("%d", &Tmp) - 1);
}
Пример применения
int OnInit()
{
  if (GetAmountObjects() > 0)
    Print("До " + __FUNCSIG__ + " были вызваны конструкторы!");

  return(INIT_SUCCEEDED);
}
 

пример взят от столба рандомно проверить

void OnStart()
{
  string Str = "1.23qwedfg";
  
  Print((int)Str);;;;;;;
  Print((double)Str);;;
}

точки с запятой не влияют на результат компиляции .... результат без ошибок
 
ruslan:

точки с запятой не влияют на результат компиляции .... результат без ошибок

Их и нет.
 

Инициализация статических переменных при помощи вызова функций является недокументированной возможностью, которая появилась совершенно случайно, но которую теперь убрать очень проблематично.

Вызов функций торгового окружения для инициализации статических переменных категорически не приветствуется

 
float f = 16777217; // 16777216.0
 
Vladimir Karputov:


Не нужно вырывать предложение из контекста. Фраза звучит так:

Чтобы обеспечить наибольшую точность при тестировании, в режиме реальных тиков также используются и минутные бары. По ним проверяются и корректируются тиковые данные. Это также позволяет избежать расхождения графиков в тестере и клиентском терминале.

означает ли это что история минутных баров не соответствует тиковой?

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

 
#define DEFINE_TOSTRING(A) string ToString( const A Var ) { return((string)Var); }
  DEFINE_TOSTRING(char)
  DEFINE_TOSTRING(short)
  DEFINE_TOSTRING(int)
  DEFINE_TOSTRING(long)
  
  DEFINE_TOSTRING(uchar)
  DEFINE_TOSTRING(ushort)
  DEFINE_TOSTRING(uint)
  DEFINE_TOSTRING(ulong)
  
  DEFINE_TOSTRING(bool)
  
  DEFINE_TOSTRING(string)
  
  DEFINE_TOSTRING(double)
  DEFINE_TOSTRING(float)

  DEFINE_TOSTRING(color)  
  
  DEFINE_TOSTRING(datetime)  
#undef DEFINE_TOSTRING

template <typename T>
string ToString( const T Var ) { return(::EnumToString(Var)); }

void OnStart()
{
  Print(ToString(1));
  Print(ToString(clrRed));
  Print(ToString(TimeCurrent()));
  Print(ToString(ACCOUNT_LOGIN));
}
 
template <typename T>
class IS
{
public:
  template <typename T1>
  static bool Object( const T1* Ptr )
  {
    return(dynamic_cast<const T*>(Ptr) != NULL);
  }
};

class CLASS1 {};
class CLASS2 : public CLASS1 {};
class CLASS3 : public CLASS1 {};

void OnStart()
{
  CLASS2 Object;
  CLASS1* Ptr = &Object;
  
  Print(IS<CLASS1>::Object(Ptr)); // true - Ptr указывает на объект класса CLASS1
  Print(IS<CLASS2>::Object(Ptr)); // true - Ptr указывает на объект класса CLASS2
  Print(IS<CLASS3>::Object(Ptr)); // false - Ptr НЕ указывает на объект класса CLASS3
}
 
Рекомендации по замеру скорости выполнения тестера

Запускайте несколько оптимизаций (не одну!) на 10 проходов (50 - многовато будет). Имейте в виду наличие кеша оптимизации, поэтому либо перекомпилируйте эксперта между оптимизациями, либо меняйте значения перебора фейкового параметра (это предпочтительнее). По 2 крайних значения сверху и снизу отбрасывайте. Анализируйте оставшиеся 6 значений от каждой оптимизации.

Для массовоых замеров не используйте микросекундный таймер. Используйте обычный миллисекундный GetTickCount. Используйте настолько большой диапазон дат тестирования, чтобы миллисекунды измерялись сотнями и тысячами. Тогда получите более точный и стабильный результат измерений

 
fxsaber:
Рекомендации по замеру скорости выполнения тестера
Вы забыли указать, что начало замера в начале первого OnTick. Конец замера - в начале OnDeinit
Причина обращения: