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

 
Просьба разработчикам в ME нажать CTRL+SHIFT+F и набрать "MQL5Info". В полученных файлах СБ поправить найденные рудименты.
 
2 часа убил на то, что бы выделить проблему с кода проекта.
#define PRINT(x) Print(#x, ":", string(x))

template<typename DATA_TYPE>
struct Wrapper{
   uchar type;
   DATA_TYPE data;
   
   template<typename T>
   void operator=(T value){                  // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).
      this.data = value;   
   };
   
   void operator=(DATA_TYPE &_data){
      this.data = _data;   
   };
};

struct A{
   string data;
   
   void operator=(string value){
      data = value;
   };
};

struct B : Wrapper<A>{};


void OnStart(){  
  B b;
  
  string str_value;
  b = str_value;
  
  A a;
  b = a;
  
  B b1;
  b = b1;
}


Используя приведенный код все работает как и ожидалось,
однако если попытаться расширить функционал и добавить поддержку не только простых типов как (string) из класса A, но и структур,
то окажется, что шаблонный оператор присвоения из базового класса начинает перекрывает дефолтные операторы присвоения классов наследников, наглухо убивая весь функционал.
В качестве workaround-а можно использовать другие операторы, например "operator*=", но это не дело.


Разработчикам:
Прошу добавить возможность указания принудительной генерации кода для оператора присвоения (конструктор копирования) по умолчанию:
class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

Подскажите, если я в советнике использую стандартные индикаторы, например iMA, 

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

 
Игорь Евдокимов:

Подскажите, если я в советнике использую стандартные индикаторы, например iMA, 

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

Вот так: Custom Moving Average Input Color

 
Знающие люди, подскажите! У меня есть кастомный символ, созданный на основе реального. Как сделать, чтобы торговля была доступна с графика этого символа? Или такого функционала нет в МТ5?
 
Vladimir Karputov:

Вот так: Custom Moving Average Input Color

То есть фактически надо написать свой индикатор. Переписывать стандартные индикаторы - не выход.

Вопрос был именно в том, как задать стиль стандартному индикатору.

Существует ли другой способ?

 
В последних версиях МТ, в рамках изменения парадигмы по работе со строками видится отказ от использования NULL-terminated strings.
Однако работа функции StringSetLength вызывает ряд вопросов.

С помощью StringSetLength можно только обрезать длину строки, но ни как не увеличить, что, как-то бессмысленно.
Это запланированное поведение?

#define PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123456789";
  PRINT(str);
  PRINT(StringLen(str));
  
  
  PRINT(StringSetLength(str, StringLen(str)-1));
  PRINT(str);
  PRINT(StringLen(str));
  
  PRINT(StringSetLength(str, StringLen(str)+2));
  PRINT(str);
  PRINT(StringLen(str));
}

Результат:
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)-1):true
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)+2):false
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
 
Пользователю прще застрелиться, чем реализовать "полноценный" StringSetLength, с инициализацией "новых" characters как 0х0000.

#define PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123\x0000\x0000\x0000\x0000456789";
  PRINT(str);
  PRINT(StringLen(str));                                                  // StringLen(str):13      StringLen поддерживает работу с 0х0000 short value
  
  PRINT(StringSetLength_using_StringInit(str, 100));                      // false                  StringInit           не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_ShortArrayToString(str, 100));              // false                  ShortArrayToString   не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_StringInit_with_StringFill(str, 100));      // false                  StringFill           не поддерживает работу с 0х0000 short value
}


bool StringSetLength_using_StringInit(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{
      string string_tail;
      StringInit(string_tail, new_length - prev_length, 0x0000);
      data += string_tail;
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}

bool StringSetLength_using_ShortArrayToString(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{    
      short data_array[];
      StringToShortArray(data, data_array);
      ArrayResize(data_array, new_length);
      ArrayFill(data_array, prev_length, new_length - prev_length, 0x0000);
      data = ShortArrayToString(data_array, 0, new_length);
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}

bool StringSetLength_using_StringInit_with_StringFill(string &string_var, int new_length){
   bool result = false;

   int prev_length = StringLen(string_var);
   if(new_length == prev_length){
      result = true;
      return result;
   }
   
   string data = string_var;   
   if(new_length < prev_length){
      StringSetLength(data, new_length);
   }else{    
      string string_tail;
      StringInit(string_tail, new_length - prev_length, 0x1111);
      StringFill(string_tail, 0x0000);
      data += string_tail;
   }
   
   if(StringLen(data) == new_length){
      string_var = data;
      result = true;
   }
   return result;
}
 
Sergey Dzyublik:
В последних версиях МТ, в рамках изменения парадигмы по работе со строками видится отказ от использования NULL-terminated strings.

Вот эту мысль могли бы озвучить подробнее?

 
rsrozhkov:
Знающие люди, подскажите! У меня есть кастомный символ, созданный на основе реального. Как сделать, чтобы торговля была доступна с графика этого символа? Или такого функционала нет в МТ5?

Ответ самоочевиден. Кастомный символ получается путем неких преобразований из реальных символов. Кто-то (советник, скрипт или вручную) должен сделать обратное преобразование и отправить ордера для реальных символов.

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