Бета-версия платформы MetaTrader 4 build 1145 - страница 10

 
Alain Verleyen:

Вы имеете в виду, когда объект выбран?

Если да, это ошибка, и именно поэтому я сообщил об этом.

По-моему Слава говорил, что именно такое поведение и сделано уже давно - если мы таскаем объект по графику, то его удаление заблокировано.

Нужно проверять факт его освобождения, и затем уже удалять.

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

По мне - верно всё.

 
Artyom Trishkin :

По-моему Слава говорил, что именно такое поведение и сделано уже давно - если мы таскаем объект по графику, то его удаление заблокировано.

Нужно проверять факт его освобождения, и затем уже удалять.

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

По мне - верно всё.

Дело в том, что объект НЕ перетаскивается, он просто выбран. Когда вы нажимаете кнопку (20 пикселей), вы получаете ошибку, если кнопка 40 пикселей, вы не получите ошибку.

В любом случае, спасибо за ваш ответ.

 

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

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

fxsaber, 2018.12.01 15:31

Долго не мог въехать в причину тормозов. В итоге накопал тяжелый баг
#property strict

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

int Func( const string &Str )
{
  string Array[];
  
  const int Res = StringSplit(Str, '\n', Array);
  Print(Res);
  
  return(Res);
}

void OnStart()
{
  string Str = "1\n";
  
  for (int i = 0; i < 20; i++)
    Str += Str;
    
  BENCH(Func(Str)) // Time[Func(Str)] = 207809
  BENCH(Func(Str)) // Time[Func(Str)] = 7097136
}

Второе выполнения Func длится в 35-40 раз медленнее первого. Результат один и тот же на обеих платформах.

 
Просьба исправить для совместимости двух платформ
void OnStart()
{
  MqlTick Tick;
  
  Tick.volume_real = 0; // 'volume_real' - struct member undefined
}
 

В OnInit() неправильно определяется причина деинициализации эксперта в случае REASON_RECOMPILE (2). OnInit() определяет это как REASON_PROGRAM (0).

void OnInit()
   {
   Print("OnInit: UninitializeReason()=",UninitializeReason());
   }
void OnDeinit(const int reason)
   {
   Print("OnDeinit: reason=",reason);
   }
void OnTick()
   {
   }

2018.12.07 11:15:28.657 ~eaNull EURUSD,M1: initialized

2018.12.07 11:15:28.657 ~eaNull EURUSD,M1: OnInit: UninitializeReason()=0

2018.12.07 11:15:28.594 Expert ~eaNull EURUSD,M1: loaded successfully

2018.12.07 11:15:28.563 Expert ~eaNull EURUSD,M1: removed

2018.12.07 11:15:28.548 ~eaNull EURUSD,M1: OnDeinit: reason=2

2018.12.07 11:15:28.548 ~eaNull EURUSD,M1: uninit reason 2


 
Статические массивы могут менять размер даже в strict-режиме
#property strict

void OnStart()
{
  int Array[1];
  
  Print(ArrayResize(Array, 2)); // 2
}
 
fxsaber:
Статические массивы могут менять размер даже в strict-режиме

Да, это особенность MQL4, в ней все массивы динамические.

Массивы фиксированного размера - это динамические массивы, с предраспределённым буфером на стеке.

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

 
Ilyas:

Да, это особенность MQL4, в ней все массивы динамические.

Массивы фиксированного размера - это динамические массивы, с предраспределённым буфером на стеке.

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

Тогда есть еще один вариант написания функции bool IsMT4()...

 
fxsaber:

Тогда есть еще один вариант написания функции bool IsMT4()...

Нет, не закладывайтесь на эту разницу в поведении массивов фиксированного размера.

Вполне возможно, что мы изменим это в MQL5, пока этот вопрос отложен


Просто добавьте глобальную функцию

bool IsMT4(void)
  {
#ifdef __MQL4__
   return(true);
#else
   return(false);
#endif
  }

 
fxsaber:

Тогда есть еще один вариант написания функции bool IsMT4()...

А зачем?