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

 
Alexey Navoykov:

Был бы ещё удобен вариант с protected-наследованием, когда в базовом классе прописаны все методы, а в наследуемом ты показываешь лишь Get. И когда понадобится, приводишь к базовому.

protected-наследование использовал, но стормозил с выделенным. Спасибо!

Но в Metaeditor так до сих по и не исправили баг, что все эти методы вываливаются в списке, даже если они недоступны.

Сейчас не проверял, но когда экспериментировал, осталось в памяти, что не вываливаются.

 

Перед модификацией или удалением ордера нужно делать проверку

OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED 

В СБ этого нет, поэтому прописывать самостоятельно.


ЗЫ В Тестере эту проверку делать бессмысленно - все текущие ордера всегда имеют этот статус.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Market closed

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 

POSITION_TIME_UPDATE имеет отношение только в изменению лота позиции. Например, частичное закрытие позиции на любом типе счета или доливка на неттинге.

Изменения же SL/TP-уровней на POSITION_TIME_UPDATE не влияют.

Перефразировав, на POSITION_TIME_UPDATE влияют только модификации, имеющие отражение в Истории торгов - сделки. SL/TP-уровни к таким модификациям не относятся, поэтому не влияют.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Реиницизация советника

fxsaber, 2017.09.26 11:35

// Перезапуск себя
bool ExpertReopen()
{
  return(ChartSaveTemplate(0, __FILE__) && ChartApplyTemplate(0, __FILE__));
}
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.09.08 11:11

struct A
{
  int i;
};

struct B : public A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = (B)a; // cannot cast 'A' to 'B'
  
  b = a;    // так без проблем
}
Из СД

Тут всё правильно

В первом случае это приведение, во втором - присваивание.

Приведение от родителя к наследнику недопустимо

Присваивание для объекта - это вызов соответствующего оператора копирования, в данном случае неявного A::operator=(const A &)

Спасибо, значит оператор копирования родителя остается доступным вне только в случае public-наследования. Проверил, так и есть

struct A
{
  int i;
};

struct B : protected A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a;    // 'A::operator=' - cannot access protected member function
}

Разве это хорошо?

При такой конструкции нужно объявить дополнительный конструктор копирования B::operator=(const A&) и в нём "пробросить" вызов в A::operator=

 

Варианты реализаций расчета стандартных индикаторов на кастомных данных (без создания доп. индикаторов).

Базовые индикаторы, применяемые к кастомному инструменту
Базовые индикаторы, применяемые к кастомному инструменту
  • 2017.09.27
  • www.mql5.com
Здравствуйте. Задавал этот вопрос на английском форуме...
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Market closed

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

Надо выкидывать из цикла кастомные символы, потому как в Обзоре рынка им можно задавать любое время, хоть 3000 год.

 
На MQL5 вполне допустимо писать так
void OnTick()
{  
  double Buffer[];
  
  CopyBuffer(iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE), 0, 0, 1, Buffer);
}

Т.е. на каждом тике "создавать" хэндл. Новые индикаторные сущности создаваться не будут, время будет теряться только на сопоставление входные паратметров iMA с теми индикаторами, что были запущены на предыдущих тиках. Т.е. ровно то же, что делается в MT4.

 
fxsaber:
На MQL5 вполне допустимо писать так

Т.е. на каждом тике "создавать" хэндл. Новые индикаторные сущности создаваться не будут, время будет теряться только на сопоставление входные паратметров iMA с теми индикаторами, что были запущены на предыдущих тиках. Т.е. ровно то же, что делается в MT4.

Производительность замеряли? Любопытно, насколько это замедлит работу. Особенно — в случае с кастомными индикаторами.

Причина обращения: