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

 
TheXpert:
Так сделай фабрику. Проблема решится.

Да там щас всё и так просто работает. Объект достаточно жёстко структурирован. Он вызывает виртуальный метод Load каждого своего члена, они в свою очередь поступают так же. В начале каждого блока данных (объекта) в файле пишется идентификатор типа (для контроля при загрузке). Собсно и всё. Типа сам-себе фабрика.

Фабрику имеет смысл делать, если неизвестный заранее тип может быть в файле.  Тогда и фабрика и регистрационная таблица типов потребуется. Пока задача так не вставала, обошёлся скрепками и скотчем. :)

 

Веер Ганна.

Если вторая точка привязки находится в будущем, меняется угол.

 

Еще, у этого объекта какие-то проблемы с копированием (через зажатый Ctrl). Очень часто не копирует, а перетаскивает оригинал, скопировать удаётся с третьей-пятой попыток. 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Способы привязки объектов - Документация по MQL5
 
MetaDriver:

ОК, отлично.

Слава, а можно поинтересоваться (для общего развития) почему нельзя таблицу виртуальных методов инициализировать в начале конструктора (после инициализации предков) ?

Я уже рассказывал. Конструкторы отрабатывают по иерархии. Пока конструируется предок, нет никакой информации о потомках.
 
stringo:
Я уже рассказывал. Конструкторы отрабатывают по иерархии. Пока конструируется предок, нет никакой информации о потомках.

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

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

Я всё понимаю, так сложнее сделать, есть всякие тонкости. Куда проще и универсальнее (для вас) прописывать всю неявную инициализацию  в конец. И я даже верю заранее, что "так никто не делает", и что "в С++, например, так не принято" и т.п.  

Однако для нас ( юзеров ), куда проще, универсальнее, разумнее и логичнее считать конструктор MySecond() территорией класса MySecond, а никак не MyFirst. Подумайте, что проще : сделать виртуальные функции работоспособными в конструкторах, или отражать в документации в нескольких местах важные и серьёзные ограничения на код конструктора, да ещё не смотря на это, регулярно получать в сервисдеск и на форум важные и серьёзные  сообщения новичков "о виртуальных заморочках в конструкторах".  Это тоже серьёзный фактор - новичков скоро ожидается много..

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

Тенарный оператор со структурами приводит к Code Generation Error (хотя, если его заменить на if, то всё работает)

 

У меня регулярно появляется ошибка  4401  

ERR_HISTORY_NOT_FOUND

Следующий код индикатора

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

выдаст ошибку сразу при старте (если кинуть не на D1). Вернее, один раз после запуска терминала и открытия графика - нацепить индикатор, получим ошибку. Если терминал не закрывать, то больше ошибки такой на старте не происходит.

Но через некоторое время (пару часов - мне хватило 2 часа)  увидим, что и на уже давно открытом графике получаем ошибку. (запускал на m30)

 

Здравствуйте господа разработчики!

А можно ли внести изменения в компилятор MQL5, чтоб хотя бы предупреждение выдавал,

на такого рода косяки в коде.

if(Flag_Exitl=true) {break;}


Тут не верно написано условие сравнения (должно быть == ) и поэтому всегда будет выполнятся break.

Как то эту ситуацию в компиляторе обозначить (если это возможно вообще), чтоб меньше шишек набивать при написании кода?

(подумал не получится, похоже разделить присваивание и сравнение в if, тогда вопрос снят).

 
Fia:

Здравствуйте господа разработчики!

А можно ли внести изменения в компилятор MQL5, чтоб хотя бы предупреждение выдавал,

на такого рода косяки в коде.

if(Flag_Exitl=true) {break;}


Тут не верно написано условие сравнения (должно быть == ) и поэтому всегда будет выполнятся break.

Как то эту ситуацию в компиляторе обозначить (если это возможно вообще), чтоб меньше шишек набивать при написании кода?

(подумал не получится, похоже разделить присваивание и сравнение в if, тогда вопрос снят).

Условие может написано и неверно, но позволительно в конструкциях MQL5.

Перевожу то что вы закодировали, присвоить переменной Flag_Exitl значение true, после этого проверить если Flag_Exitl истинно то брейк.

Последовательность действий именно такая.

 

Не совсем понимаю как работать с буферами, которые не нужно показывать на экране.

По коду ниже почему-то

1) ничего не рисует

2) оба буфера называются Label1

хотя данные в них "лежат" нужные

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

Здравствуйте. Я может немного не туда пишу, но надеюсь вы меня направите тогда в правильном направлении. А куда обратиться с вопросом по Web API для мт5? )

На всякий случай попробую объяснить ситуацию. Имеется МТ менеджер и WEB API с php... Счет на русском языке создается, данные уходят и даже отображаются в МТ менеджере, однако отмечена проблема - данные в МТ менеджере отображаются в виде юникода ("04440430043c0438043b0438044f" - вот так выглядит имя пользователя). При отправке данных ничего не кодируется или декодируется, из МТ клиента все создается нормально... Хотя бы в какую сторону смотреть? (