Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1947

 

Bom dia, por favor, informe como devolver um valor de uma lista de constantes na forma de texto.

Por exemplo, a função HistoryDealGetInteger retorna o valor int da listaENUM_DEAL_TYPE ao solicitar o evento. Como podemos obter informações do número devolvido que é "DEAL_TYPE_CREDIT - credit accrual". Depois de depurado este valor não será, naturalmente, necessário, int será suficiente para processar o evento, mas durante a depuração não está nada claro o que significam os números 3 ou 5 retornados pela função.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Свойства сделок - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Кирилл Якимов #:

Bom dia, você poderia me dizer como devolver um valor como texto de uma lista de constantes?

Por exemplo, a função HistoryDealGetInteger retorna o valor int da listaENUM_DEAL_TYPE ao solicitar o evento. Como podemos obter informações do número devolvido que é "DEAL_TYPE_CREDIT - credit accrual". Depois de depurado este valor não será, naturalmente, necessário, int será suficiente para processar o evento, mas durante a depuração não está nada claro o que significam os números 3 ou 5 retornados pela função.

string s = EnumToString((ENUM_DEAL_TYPE) x)

 
Maxim Kuznetsov #:

string s = EnumToString((ENUM_DEAL_TYPE) x)

Muito obrigado, isso ajudou.
 

Você pode me dizer como resolver:

1) Eu não carreguei o histórico, na janela do gráfico durante o processo on-line eu tive tempo de carregar barras de 70 000 minutos. Estou carregando meu Conselheiro Especialista no Teste de Estratégia e, caso tenha escrito o número mínimo de barras para um determinado padrão, ele respondeu com "não há barras suficientes para análise". Eu imprimo iBars e diz 1200 barras. Carreguei o histórico (8 000 000 de barras). Reiniciado, as configurações mostram barras "999999999999" na janela e na história. Nova escreve "não há história suficiente". Imprimir iBars, novamente 1200. o que é isso e como resolver?

2) Na análise de múltiplas moedas, como posso forçar o indicador a não perder novos tiquetaques de entrada em outros pares de moedas, se as cotações forem subitamente congeladas no gráfico atual e o OnTick não chamar a verificação? Eu tentei o OnTimer mas ele não funciona no testador

 
Neste roteiro, estou experimentando o redimensionamento de matrizes dinâmicas que têm diferentes direções de indexação - para entender de que lado aparecem novas células após o aumento do tamanho da matriz
void OnStart()
  {
   
   int a[], b[], size = 5, new_size = size + 5;
   
   if( ArraySize( a ) != size )
     ArrayResize( a, size, 0 );
   
   if( ArraySize( b ) != size )
     ArrayResize( b, size, 0 );
   
   if( ArrayGetAsSeries( a ) )
     ArraySetAsSeries( a, false );
   
   if( !ArrayGetAsSeries( b ) )
     ArraySetAsSeries( b, true );
   
   for( int i = 0; i < size; i++ )
     {
      a[i] = i;
      b[i] = i;
     };
   
   ArrayResize( a, new_size, 0 );
   ArrayResize( b, new_size, 0 );
   
   for( int i = 0; i < new_size; i++ )
     {
      Alert( "a", i, " ", a[i] );
      Alert( "b", i, " ", b[i] );
      Alert(" ");
     };
   
  }

E aqui está o resultado


. Acontece que a matriz b[] (que tem indexação reversa) de alguma forma duplica seus valores depois de aumentar o tamanho

. Por quê? Estou perdendo algo ou cometi algum erro?
 
Alexandr Sokolov direções de indexação - a fim de entender que lado novas células aparecem após o aumento do tamanho da matriz

E este é o resultado


Acontece que a matriz b[] (que tem indexação reversa) tem de alguma forma valores duplicados após o aumento do tamanho

Por quê? Estou perdendo algo ou cometi algum erro?

Em qualquer caso, não podemos confiar em nenhum valor nas células da nova matriz - estas são variáveis não inicializadas que podem conter qualquer lixo.

 
Alexandr Sokolov direções de indexação - para entender que lado novas células aparecem depois de aumentar o tamanho da matriz

E este é o resultado


Acontece que a matriz b[] (que tem indexação reversa) tem de alguma forma valores duplicados depois de aumentar o tamanho

Por quê? Estou perdendo algo ou cometi algum erro?

É preciso virar o conjunto depois que ele for preenchido.

 
JRandomTrader #:

Em qualquer caso, não podemos confiar em nenhum valor nas células da nova matriz - estas são variáveis não inicializadas que podem conter qualquer lixo.

É verdade, mas há 2 mas
1) O espelhamento é observado em qualquer outro tamanho, não apenas, como no meu exemplo - 5
2) Se um array tem indexação reversa, então novas células devem aparecer no início do array - o que não é o caso

 
Alexey Viktorov #:

Você tem que virar a matriz depois de preenchê-la.

Também pensei nisso - pelo menos não vejo nenhuma outra solução no momento.

 
Alexandr Sokolov #:


2) Se uma matriz for indexada ao contrário, então novas células devem aparecer no início da matriz - o que não é o caso

Por que devem aparecer novas células no início de uma matriz? - Se não estou enganado, deve ser escrito na ajuda, que quando você usar o ArraySetAsSeries(), a matriz não será redistribuída fisicamente na memória, mas a indexação reversa será aplicada ao acessar os elementos da matriz

SZZ: seu exemplo é complicado, eu o esbocei:

#property strict
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[] = {1, 2, 3, 4, 5};
   int arr2[] = {1, 2, 3, 4, 5};
   ArraySetAsSeries(arr2, true);
   Print("Start size : ", ArraySize(arr1), " , ", ArraySize(arr2));
   Print("Resize : ", ArrayResize(arr1, 10), " , ", ArrayResize(arr2, 10));
   string s1 = "", s2 = "";
   for(int i = 0, j = 0; i < ArraySize(arr1) && j < ArraySize(arr2); i++, j++)
   {
      s1 += (string)arr1[i] + " , ";
      s2 += (string)arr2[j] + " , ";
   }
   Print("arr1 = ", s1);
   Print("arr2 = ", s2);
}

2022.04.18 21:31:59.223 tst EURUSD,H1: arr2 = 5 , 4 , 3 , 2 , 1 , 0 , 0 , 0 , 0 , 0 ,

2022.04.18 21:31:59.223 tst EURUSD,H1: arr1 = 1 , 2 , 3 , 4 , 5 , 0 , 0 , 0 , 0 , 0 ,

2022.04.18 21:31:59.223 tst EURUSD,H1: Redimensionar : 10 , 10

2022.04.18 21:31:59.223 tst EURUSD,H1: Tamanho inicial : 5 , 5