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

 
Interesting:

1. С чего это? От вредных симптомов нужно изваляться, причем решительно.

2. Не следует называть переменные, массивы и прочие вещи созвучно или также ключевым словам языка (но уж очень в глаза бросается массив "Symbol", фиг потом в коде разберешь массив это или что иное).

1. Ну, сначала необходимо подлино установить принадлежность симптоматики к положительным или отрицательным проявлениям. На моем опыте бывали случае, когда пытался изменить значение глобальной переменной в функции, которая этого не должна была делать (проклятый копипаст). Несколько дней искал эту ошибку. С тех пор глобальные переменные использую в случаях, когда без них не обойтись в принципе.

2. Согласен. Но если они используются в пределах одной функции, меня это не парит. Глобальные же переменные с подобными именами, действительно, залог будущих путаниц. 

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 

Все же повторю свой вопрос.

Можно ли каким образом внутри OnTick определять срабатывание OnInit?
Например, внутри OnTick объявлять статик переменную, которая хранит количество инициализаций советника (если на такое или аналогичное свойство присутствует в MQL5)?

 
voix_kas:

Наверное, я параноик. Не люблю публичные (глобальные) переменные. Считаю это муветоном.

Глобальные переменные хотя бы видны издалека. А вот прятать внутрь функций серьезные накопительные переменные в статику - это есть путь заботливого рассыпания граблей для самого себя. Я лично впервые вижу, чтобы накопительный статический массив так запрятали внутрь функции. Это грабли фиерического размера. 

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

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
voix_kas:

Все же повторю свой вопрос.

Можно ли каким образом внутри OnTick определять срабатывание OnInit?
Например, внутри OnTick объявлять статик переменную, которая хранит количество инициализаций советника (если на такое или аналогичное свойство присутствует в MQL5)?

Количество срабатываний OnInit можно не только считать, но определять почему именно инициализация произошла (вопрос реализации это другой момент).

С _UninitReason к примеру знакомы?

 
Считать то можно и в OnInit, другой вопрос, что мне эти данные нужны в другом событии (без применения глобальных переменных). Как ни крути, вопрос реализации. С OnDenit та же песня.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Классы никогда не писал. Если может кто помочь, буду признателен.
Нужно написать класс WorkSymbols.
Методы:
string GetSymbol[];
bool UpdateSymbols(inWorkSymbols);
bool UpdateSymbolsStatus();
int GetSymbolCount();

Извинясь, если просьба нахальная... Сам тоже буду пытаться разобраться.
 
Renat:

Да, похоже, что зря объединили условие смены символа и таймфрейма.

Я тоже за то, чтобы их разделить на 2 условия. Тикет в сервисдеск уже поставил.

Спасибо!
 

Вроде как сварганил. Критика приветствуется.

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

class CSymbolList {
  private:
    string Symbols[];

  public:
    void   CSymbolList() { SetSymbols(""); }
    void  ~CSymbolList() { ArrayFree(Symbols); }
    int    GetSymbolCount() { return ArraySize(Symbols); }
    void   SetSymbols(string);
    string GetSymbolName(int);
};

void CSymbolList::SetSymbols(string Source) {
  ArrayFree(Symbols);
  for (int count = 1, i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) {
      if (ArrayResize(Symbols, count) != count) {
        ArrayFree(Symbols);
        return;
      }
      Symbols[count-1] = SymbolName(i, false);
      count++;
    }
}

string CSymbolList::GetSymbolName(int Item) {
  if (Item < 0 || !ArraySize(Symbols) || Item >= ArraySize(Symbols)) return "";
  return Symbols[Item];
}

void OnStart() {
  CSymbolList slMain;
  slMain.SetSymbols(inWorkSymbols);
  for (int i = 0; i < slMain.GetSymbolCount(); i++)
    Print(slMain.GetSymbolName(i));
}
 

Единственное, что мне здесь не нравится - изменение "на живую" размеров массива, содержащего рабочие данные.
Вопрос к разработчикам, гарантировано ли сохранение ранее внесенных данных пользователя в изменяемом динамическом массиве при следующем условии?:

if (ArrayResize(Symbols, count) == count)
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
voix_kas:

Единственное, что мне здесь не нравится - изменение "на живую" размеров массива, содержащего рабочие данные.
Вопрос к разработчикам, гарантировано ли сохранение ранее внесенных данных пользователя в изменяемом динамическом массиве при следующем условии?:

Ставлю на то, что гарантируется. По крайней мере я постоянно на это расчитываю, и проблемы ни разу не возникло.
Причина обращения: