Parâmetros de Entrada com lista de Valores (Números Inteiros)

 

Amigos, boa noite !

Estou tentando criar um parâmetro de entrada onde o usuário irá escolher um número de 1 a 100. Essa informação vai para uma variável do tipo int no meu EA.

Porém todos os artigos que estou olhando direcionam para usar a enum (Enumerador). Percebi que os dados nela são do tipo string e com isso eu teria que fazer vários ifs dentro do meu código para ler o enum e preencher minha variável com o dado númerico. O que do meu ponto de vista deixaria o código bem ruim.


Alguém teria um exemplo de como criar um parâmetro de entrada com uma lista de valores 1,2,3,4,5... ?? 


Obrigado !

 
Carlos Martins,

escolher um nº de 1 a 100?  Para isso basta digitar uma input de tipo integer !

input int  iNum=1;  // entre com um nº de 1 a 100 


Agora, caso queira escolher uma opção entre 100 possibilidades, use o enumerador mesmo.

enum ENUM_TIPO_ESTRATEGIA
  {
   estrategia1,      // B.Borlinger, Adx e stochastic
   estrategia2,      // Retorno sobrevalor stochastic
   estrategia3,      // Hilo
   estrategia4,      // Posiçoes Adx DI+ e DI-
   estrategia5,      // TR greater delta ATR
   estrategia6,      // Cruzamento médias
   estrategia7,      // Retorno B.Bands
   estrategia8,      // The Single Bar
   estrategia9,      // The Open Bar
   estrategia10,     // Rompimento primeira barra
   estrategia11,     // Super Trend Simple
   estrategia12,     // Range weighted color
   estrategia13,     // PTL indicator
   estrategia14,     // AscTrend indicator
   estrategia15,     // Chandes DMI
   estrategia16,     // Delta Article
   estrategia17,     // Momentum
   estrategia18,     // Stoch signal
   estrategia19,     // Double top
   estrategia20,     // AfStar
   estrategia21,     // SilverTrend
   estrategia22,     // Bulls Bears Power
   estrategia23,     // Reverse MA
   estrategia24,     // Tabajara
..
..
   estrategia99      // PIN Bar
}

input ENUM_TIPO_ESTRATEGIA    inpEstrategia = estrategia1;     // Escolha a estratégia



 
Carlos Martins:

Porém todos os artigos que estou olhando direcionam para usar a enum (Enumerador). Percebi que os dados nela são do tipo string 

Enums são do tipo inteiro e não string. Rode esse exemplo.

enum ETypeTest
  {
   ZERO
   ,UM
   ,DOIS
  };


ETypeTest x = ZERO;
ETypeTest y = UM;
ETypeTest z = DOIS;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print("X: ",x);
   Print("Y: ",y);
   Print("Z: ",z);

  }

Resultado: 

Trecho da documentação:

Após a enumeração ser declarada, um novo tipo de dados de inteiro de 4 bytes aparece. A declaração do novo tipo de dados permite ao compilador controlar rigidamente os tipos de parâmetros passados, porque a enumeração introduz novas constantes nomeadas. No exemplo acima, a constante nomeada January tem valor igual a 0, February - 1, December - 11.

Rule: Se um certo valor não estiver atribuído a uma constante nomeada que é membro da enumeração, seu novo valor será formado automaticamente. Se ele é o primeiro membro da enumeração, o valor 0 será atribuído a ele. Para todos os subseqüentes membros, os valores serão calculados baseados no valor dos membros anteriores adicionando um.

 
Jonathan Pereira:

Enums são do tipo inteiro sim. Rode esse exemplo.

Resultado: 


Fala Jonathan blz ?


O problema é que o enum é um varchar... eu preciso de um valor em inteiro. O grande problema é que vou ter que colocar um if dentro da OnTick, transformando o varchar em um texto.


exemplo declarando enum no cabeçalho global :

enum(

1

2

3

..

100

)

depois na minha onTick eu teria que converter :

If enum = 1 then variavel inteira = 1

if enum = 2 then variavel inteira = 2

....

if enum = 2 then variavel inteira = 100


Isso irá atrapalhar a performace e deixar meu código grande.


Tem alguma forma de criar uma lista de valores no parâmetro de entrada de forma mais simples ? Assim eu pego o resultado dessa imput e carrego na minha variável.


Obrigado !

 
Rogerio Giannetti Torres:

escolher um nº de 1 a 100?  Para isso basta digitar uma input de tipo integer !


Agora, caso queira escolher uma opção entre 100 possibilidades, use o enumerador mesmo.


Fala Rogério blz ?


O problema é que o enum é um varchar... eu preciso de um valor em inteiro. O grande problema é que vou ter que colocar um if dentro da OnTick, transformando o varchar em um texto.


exemplo declarando enum no cabeçalho global :

enum(

1

2

3

..

100

)

depois na minha onTick eu teria que converter :

If enum = 1 then variavel inteira = 1

if enum = 2 then variavel inteira = 2

....

if enum = 2 then variavel inteira = 100


Isso irá atrapalhar a performace e deixar meu código grande.


Tem alguma forma de criar uma lista de valores no parâmetro de entrada de forma mais simples ? Assim eu pego o resultado dessa imput e carrego na minha variável.

 
Carlos Martins:

Fala Jonathan blz ?


O problema é que o enum é um varchar... eu preciso de um valor em inteiro. O grande problema é que vou ter que colocar um if dentro da OnTick, transformando o varchar em um texto.


depois na minha onTick eu teria que converter :

If enum = 1 then variavel inteira = 1


Carlos,

Acho que vc está confundindo um pouco as coisas, enum não é texto, conforme a própria documentação explica " Após a enumeração ser declarada, um novo tipo de dados de inteiro de 4 bytes aparece", e varchar e texto é mesma coisa.

Agora uma coisa que não ficou claro é, vc quer que o seu user escolha um numero que esteja ente 0 e 100, ou uma variável que tenha um valor que representa um intervalo entre 0 a 100?

se for a primeira opção pq não usar um enumerador? e pq ter que atribuir o valor do enumerador a uma variável e não simplesmente fazer um if no enumerador?

Algo como:


enum ETypeTest
  {
   ZERO
   ,UM
   ,DOIS
  };

ETypeTest x = ZERO;

void OnStart()
  {
//---
   if(x == ZERO)
      Print("condição para 0");

   if(x == UM)
      Print("condição para 1");

   if(x == DOIS)
      Print("condição para 2");

  }
 
Você pode trabalhar sem enum, deixa o usuário digitar o número, em Init vc verifica:

If(num<0 || num>100)

{

Return(Init_failed)

}

Pronto, manda um alerta para o usuário
 

Olá Carlos Martins:

Não entendi bem sua pergunta porque para mim o tipo ENUM  é uma inteira.

OnInit()
{
input ENUM_TIPO_ESTRATEGIA    inpEstrategia = estrategia1;     // Escolha a estratégia
}

onTick ();
{
variavel inteira = (int) inpEstrategia;     //O casting é desnecessário pois o enum é um inteiro.
}
 

ENUMs não são VarChars... Revisite a documentação...

Exemplo...

    enum ML_TYPES {
         ML_TYPE_NONE=-1,                    // not used
         ML_TYPE_INT=1,                      // Numeric Integer
         ML_TYPE_DOUBLE=2,                   // Numeric w/Decimals
         ML_TYPE_STRING=3                    // String (Text)
         ML_TYPE_WHATEVERYOUWANT=999         // ÓréVis!
    };

Inclusive esse enum, quando usado em INPUTs, o comentário é usado como descrição do próprio parâmetro...

;)

 
Flavio Jarabeck:

ENUMs não são VarChars... Revisite a documentação...

Exemplo...

Inclusive esse enum, quando usado em INPUTs, o comentário é usado como descrição do próprio parâmetro...

;)

Existe alguma alternativa, para no caso dos valores desejados não serem inteiros?

Ex:

enum LevelsFibbo {
         Level_1= 0.236,                    // First Level
	 Level_2= 0.618,                    // Second Level
	 ...
    };
 

 Olá Amigos tudo bem?

Estou com a seguinte dificuldade preciso testar uma condição diferente do PERIOD_CURRENT e quero informar este Period por uma imput, como declaro esta input?

Para fazer este tipo de teste:

 if ((iHigh(_Symbol, periodo)>iHigh(_Symbol, PERIOD_M5)


onde periodo é a imput declarada.


Gratidão pelas respostas! Abs!