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

 
Slava:

Когда Вы получаете сообщение об утечке памяти, это означает, что не было явной команды освобождения этой памяти.

Когда программа завершает работу (а именно на завершении работы Вы получаете такие сообщения), то она в любом случае освобождает всю память, в том числе утёкшую.

Возможно, я слишком вольно импользовал термин "утечка". Смысл в том, что в памяти остается висеть ресурс, имя которого даже не узнать, если объект удален. А если все же знаем его имя, то его не удалить нигде, кроме как из программы, создавшей этот ресурс.


Сейчас очень легко написать скрипт для Маркета, который подвесит (не обязательно предумышленно) Терминал на VPS, забив всю память не удаляемыми после выполнения скрипта ресурсами.

 

На некоторых торговых серверах могут находиться сразу несколько типов счетов. Например, ECN и стандартный. При этом символы могут не иметь префиксов, т.е. названия совпадают.

В этом случае баровая история (включая текущие значение bid/ask/last на чарте) и тиковая история соответствуют всегда только одному типу счета.

А данные из Обзора рынка - тому, к кому подключен.


Из-за этого легко наблюдать, что Обзор рынка полностью не соответствует чартам и тиковой истории.

 

Несколько раз нарывался на случайное (руками) изменение символа чарта, где стоит боевой советник.

Защита от смены символа.

int OnInit()
{
  static const string Symb = _Symbol;  
  const bool Res = (_Symbol != Symb);
  
  if (Res)
    Alert("Symbol is change!");
  
  return(Res); // Защита от смены символа.
}
 
При запуске советника часто нужно определиться со временем, с которого забирать историю цен. Чтобы каждый раз не вводить вручную, сделал так.
#define WEEK (7 * 24 * 3600)
input datetime temp = __DATE__ - WEEK;

Соответственно, беру историю за неделю до момента компиляции. Удобно.

 
fxsaber:
При запуске советника часто нужно определиться со временем, с которого забирать историю цен. Чтобы каждый раз не вводить вручную, сделал так.

Соответственно, беру историю за неделю до момента компиляции. Удобно.

Зачем лишний раз полагаться на оптимизатор? Лучше:

#define WEEK 604800

 

Функция аварийного прерывания программы, вроде путно получилось

#define EXIT (STD_CExit(__LINE__,__FUNCTION__)).Exit

class STD_CExit{
   string function;
   int line;
public:
   STD_CExit(int _line,string _func):line(_line),function(_func){}
   void Exit(string reason=NULL);
};
//--------------------------------------------------------------------------
void STD_CExit::Exit(string reason=NULL){
   Alert(StringFormat("Abort in line %i, function %s.\nReason: %s.",line,function,reason==NULL||reason==""?"Unknow":reason));
   int a=0;
   int b=1/a;}

void OnStart()
{
   Test();
}

void Test(){
   EXIT("Some reason");
}
 
Vladimir Simakov:

Функция аварийного прерывания программы, вроде путно получилось

штука то нужная - я уже и обрадовался, что свершилось.., вот решали эту задачу с @Vict   https://www.mql5.com/ru/forum/318246/page10#comment_12651569

но это:

- не Exit http://www.delphibasics.ru/Exit.php

- не Abort http://www.delphibasics.ru/Abort.php

это Halt http://www.delphibasics.ru/Halt.php

UPD:  такой сценарий очень нужен

void OnTick()
{
   if(!getData()) EXIT("No data");
}
bool getData()
{
   return(false);
}
 
Igor Makanu:

штука то нужная - я уже и обрадовался, что свершилось.., вот решали эту задачу с @Vict   https://www.mql5.com/ru/forum/318246/page10#comment_12651569

но это:

- не Exit http://www.delphibasics.ru/Exit.php

- не Abort http://www.delphibasics.ru/Abort.php

это Halt http://www.delphibasics.ru/Halt.php

UPD:  такой сценарий очень нужен

Такой никак пока не получается(((
 
Vladimir Simakov:
Такой никак пока не получается(((

дык он то и нужОн очень!

если бы разработчики дали exit / abort штатный, тогда бы можно было корректно прерывать обработку данные если, к примеру, не готов ТФ - данные OHLC , для обработки отправки ордера на сервер тоже пригодилось бы... удобно в общем прервать код в любом месте и выйти до следующего тика не распутывая бесконечные return() к выходу из OnTick()

 
Igor Makanu:

дык он то и нужОн очень!

если бы разработчики дали exit / abort штатный, тогда бы можно было корректно прерывать обработку данные если, к примеру, не готов ТФ - данные OHLC , для обработки отправки ордера на сервер тоже пригодилось бы... удобно в общем прервать код в любом месте и выйти до следующего тика не распутывая бесконечные return() к выходу из OnTick()

Ну не смог, пока...

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