Como é que passo por uma enumeração de forma consistente? - página 5

 
Sergei Vladimirov:
Porque faria eu isso?
O tamanho do TickSize no MIX é 25, os dígitos são 0. A normalização de um preço inteiro que não seja um múltiplo de 25 causará um erro de OrderSend.
 
fxsaber:
O tamanho do TickSize no MIX é 25 e os dígitos são 0. A normalização de um preço inteiro que não seja um múltiplo de 25 causará um erro de OrderSend.
Ainda agora, num fio vizinho aconselhado a afogar o computador na banheira, então tudo será ainda mais desacreditado.
 
Dmitry Fedoseev:
Ainda agora num fio vizinho que aconselha a afogar o computador na banheira, então tudo será ainda mais desacreditado.
És um tagarela, infelizmente. Eu não crio nada, mas tenho o direito de criticar - sobre si.
 
fxsaber:
O tamanho do TickSize no MIX é 25 e os dígitos são 0. A normalização de um preço inteiro que não seja um múltiplo de 25 causará um erro de OrderSend.
Bem, com essa lógica, mesmo numa normalização de 0,25 passos, produziria um erro. O objectivo da normalização não é o de ajustar o preço a algum passo de preço exótico, mas o de arredondar o número do ponto flutuante a uma determinada precisão. Não causa quaisquer erros.
 
Sergei Vladimirov:
Bem, com essa lógica, mesmo no caso de uma etapa de 0,25, a normalização produziria um erro. O objectivo da normalização não é o de ajustar o preço a algum passo de preço exótico, mas o de arredondar o número do ponto flutuante a uma determinada precisão. Não conduz a quaisquer erros.
A normalização foi originalmente introduzida apenas por uma coisa (e é mencionada na ajuda) - funções comerciais.
 
Vladimir Batrudinov:

Há provavelmente duas funções que precisam de ser introduzidas: 1 - devolve o número de elementos do enumeral, 2 - devolve o elemento pelo número...


Em enumeração, pode atribuir quaisquer valores aos elementos, por exemplo, como abaixo indicado. Uma enumeração não é uma matriz.

enum crazy
{
    e1 = 100500,
    e2 = -200,
    e3 = -100500,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
    int z10 = e2;
    int z1 = e4;
  
}

Línguas como C# requerem a especificação do nome do enumero, enquanto C++ e, portanto, MQL4/5 manuseiam o enumero de forma bastante livre. Só para o caso de este disparate se compilar em MQL5 bem como em C++

 
Alexey Volchanskiy:

Em enumeração, pode atribuir qualquer valor aos elementos, tais como os seguintes. enum não é uma matriz.

E então? tratava-se de analisar os elementos em ordem de declaração.
 
Alexey Navoykov:
E então? tratava-se de passar por esses elementos por ordem de declaração.
Oh, certo, li mal a pergunta, pensei eu, por valores.
 

Uma nota aos programadores:

#define  ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3)   \
  ENUM_QQ_HELPER(el_2, 9)   \
  ENUM_QQ_HELPER(el_3, 38)  \
  ENUM_QQ_HELPER(el_4, 1)   

enum Enum_qq
{
#define  ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
};

void get_enumqq_array(int &ar[])
{
  int temp[] = {
#define  ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
  };
  ArrayResize(ar, ArraySize(temp));
  for(int i = 0;  i < ArraySize(temp);  ++i)
    ar[i] = temp[i];
}

void OnStart()
{
  int q[];
  get_enumqq_array(q);
  for(int i = 0;  i < ArraySize(q);  ++i)
    Alert(q[i]);
}


Agora, se precisarmos de editar uma enumeração, temos de a editar uma vez e num só lugar. Precisamos de adicionar um novo elemento, por exemplo elemento_novo = 56, adicionamos

ENUM_QQ_HELPER(element_new , 56)

E não se dê ao trabalho de editar get_enumqq_array(). A técnica chama-se X Macro https://en.wikipedia.org/wiki/X_Macro. Se os criadores desejarem, podem modificar facilmente a enumeração padrão desta forma.

Talvez não seja imediatamente óbvio, a enumeração acabou por ser feita desta forma:

enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1   
};
 
Vasiliy Sokolov:

Digamos que temos uma enumeração. Como podemos obter todos os valores possíveis desta enumeração um a um, por exemplo, em loop?

Isto é, tf1++ deve retornar sequencialmente PERÍODO_M1, PERÍODO_M2, PERÍODO_M5... Penso que isto não pode ser feito com as ferramentas linguísticas.

Mas se houver um ENUM_MYENUM, (ENUM_MYENUM)INT_MAX deve dar o valor máximo do enumero. Caso contrário, trata-se de um bug de conversão de tipo. É apenas porque o operador de conversão de tipo deve devolver o valor deste mesmo tipo. Não necessariamente válido no contexto, mas válido para o tipo.
Razão: