错误、漏洞、问题 - 页 2460

 
请ME开发人员按CTRL+SHIFT+F键,输入 "MQL5Info"。纠正在产生的SB文件中发现的粗制滥造。
 
我花了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;
}


使用上述代码,一切都按预期进行,
,但是如果我们试图扩展功能,不仅支持简单的类型,如A类的(字符串),还支持结构,
,结果发现基类的模板赋值运算符覆盖了子类的默认赋值运算符,扼杀了整个功能。
其他运算符可以作为变通方法,如 "运算符*=",但这是个麻烦事。


致开发者:
请增加为默认赋值运算符(复制构造器)指定强制代码生成的可能性。
class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

你能告诉我,如果我在我的EA中使用标准指标,例如iMA。

如何设置它们的绘图样式,以便在可视化窗口中正确显示它们?

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

你能告诉我,如果我在我的EA中使用标准指标,例如iMA。

我如何设置绘图样式,使其在可视化窗口中正确显示?

像这样:自定义移动平均线输入颜色

 
有知识的人,给个提示!我有一个 基于真实符号的自定义符号。我怎样才能使交易从这个符号的图表中获得?还是MT5中没有这样的功能?
 
Vladimir Karputov:

像这样:自定义移动平均线输入颜色

事实上,你必须编写自己的指标。重写标准指标并不是解决办法。

问题是究竟如何为标准指标设置样式。

还有别的办法吗?

 
在最近的MT版本中,作为字符串处理范式转变的一部分,它被认为是放弃了对以NULL为结尾的字符串的使用。
然而,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,"新 "字符初始化为0x0000。

#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:
在最近的MT版本中,作为字符串处理模式转变的一部分,我们看到有人拒绝使用以NULL为结尾的字符串。

你能详细说明一下这个想法吗?

 
rsrozhkov:
有知识的人,你能给我一个提示吗!?我有一个基于真实符号而创建的自定义符号。我怎样才能使交易从这个符号的图表中获得?还是MT5中没有这样的功能?

答案是不言而喻的。一个自定义的符号 是通过某种转换从真实的符号中得到的。有人(EA、脚本或手动)必须做反向转换,为真实的符号发送订单。