Erros, bugs, perguntas - página 2460

 
Por favor peça aos programadores ME que carreguem em CTRL+SHIFT+F e escrevam "MQL5Info". Corrigir os rudimentos encontrados nos ficheiros SB resultantes.
 
Demorei 2 horas a isolar o problema do código do projecto.
#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;
}


Usando o código acima tudo funciona como esperado,
no entanto, se tentarmos alargar a funcionalidade e adicionar suporte não só para tipos simples como (string) da classe A, mas também para estruturas,
acontece que o operador de atribuição de modelos da classe base substitui os operadores de atribuição padrão das classes descendentes, matando toda a funcionalidade.
Outros operadores podem ser utilizados como soluções de trabalho, tais como "operador*=", mas é uma confusão.


Aos programadores:
Acrescentar por favor a possibilidade de especificar a geração forçada de código para o operador de atribuição por defeito (copy constructor):
class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

Pode dizer-me se utilizo indicadores padrão na minha EA, por exemplo, iMA,

como definir os seus estilos de desenho para os exibir correctamente na janela de visualização?

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

Pode dizer-me se utilizo indicadores padrão na minha EA, por exemplo, iMA,

como posso definir estilos de desenho para que sejam exibidos correctamente na janela de visualização?

Como este:Cor de entrada média móvel personalizada

 
Pessoas conhecedoras, uma dica! Tenho um símbolo personalizado baseado num símbolo real. Como posso fazer com que uma troca esteja disponível a partir do gráfico deste símbolo? Ou será que não existe tal funcionalidade no MT5?
 
Vladimir Karputov:

Como este:Cor de entrada média móvel personalizada

De facto, tem de escrever o seu próprio indicador. Reescrever os indicadores padrão não é a solução.

A questão era exactamente como definir o estilo para o indicador padrão.

Existe outra forma?

 
Nas versões recentes da MT, como parte da mudança de paradigma na manipulação de cordas, é visto como o abandono da utilização de cordas com terminação NULL.
No entanto, o funcionamento da função StringSetLength levanta uma série de questões.

Com StringSetLength só se pode truncar o comprimento de uma corda mas nunca aumentá-lo, o que de alguma forma não faz sentido.
É este o comportamento pretendido?

#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));
}

Resultado:
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
 
O utilizador preferiria disparar ele próprio do que implementar umStringSetLength"completo", com "novos" caracteres inicializados como 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:
Em versões recentes de MT, como parte da mudança de paradigma no manuseamento de cordas, vemos uma recusa em utilizar cordas com terminação NULL.

Poderia desenvolver esta ideia?

 
rsrozhkov:
Pessoas conhecedoras, podem dar-me uma dica! Tenho um símbolo personalizado criado com base num símbolo real. Como posso fazer com que uma troca esteja disponível a partir do gráfico deste símbolo? Ou será que não existe tal funcionalidade no MT5?

A resposta é auto-explicativa. Um símbolo personalizado é obtido por algum tipo de transformação a partir de símbolos reais. Alguém (EA, script ou manualmente) tem de fazer a transformação inversa e enviar ordens para os símbolos reais.

Razão: