Erros, bugs, perguntas - página 2021

 

Tocar o insecto

  1. Ir para Metaquotes-Demo.
  2. Apenas a AUDJPY está na visão geral do mercado e abre o seu gráfico.
  3. Recarregar o terminal e esperar por uma ligação completa - as citações estão a chegar.
  4. Executar o guião no gráfico

void OnStart()
{  
  for (int i = 0; i < 5; i++)
    Print(SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
}


O resultado é o seguinte

2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0


Reiniciar.

2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851


Isto é,SYMBOL_TRADE_TICK_VALUE retorna zeros na primeira corrida se Sleep() não for utilizado;


HI Sobre o tema do símbolo invisível em Market Watch. Se tentar abrir o gráfico USDJPY (prima Enter e introduza "USDJPY") antes do início do guião, este não funcionará. Se, depois de executar o guião, funcionar. O Market Watch não mudou, no entanto.

 
fxsaber:

Tocar o insecto

  1. Ir para Metaquotes-Demo.
  2. Apenas a AUDJPY está na visão geral do mercado e abre o seu gráfico.
  3. Recarregar o terminal e esperar por uma ligação completa - as citações estão a chegar.
  4. Executar o guião no gráfico


O resultado é o seguinte


Reiniciar.


Isto é,SYMBOL_TRADE_TICK_VALUE retorna zeros na primeira corrida se Sleep() não for utilizado;


HI Sobre o tema do símbolo invisível em Market Watch. Se tentar abrir o gráfico USDJPY (prima Enter e introduza "USDJPY") antes do início do guião, este não funcionará. Se, depois de executar o guião, funcionar. Embora a Market Watch não tenha mudado.

Acrescentar este laço ao início do guião

   for(int i = 0; i < SymbolsTotal(true); i++)
     Print(SymbolName(i, true));

E ver quantos símbolos são impressos.

Na primeira chamada, o acesso ao AUDJPY apenas acrescenta AUDUSD e USDJPY à visão geral do mercado e apenas na segunda chamada através destes pares obtém o símbolo de propriedade. É isto que está a causar o problema com a OrderCalcMargin no meu caso.

 
fxsaber:

Tem sido escrito sobre muitas vezes. Não o corrigem por qualquer razão.

Recebi uma resposta do balcão de serviço. Eles irão corrigi-lo.
 

Olá a todos!

Ajuda para um principiante, por favor.

A função de encontrar o preço máximo é executada. Como é possível calcular e voltar ao código o NÚMERO BAR com um determinado preço máximo?

 
Alexey Viktorov:

Acrescentar um laço como este ao início do guião

E ver quantos caracteres são impressos.

Na primeira chamada, o acesso ao AUDJPY apenas acrescenta AUDUSD e USDJPY à visão geral do mercado e apenas na segunda chamada através destes pares obtém o símbolo de propriedade. É isto que está a causar o problema com a OrderCalcMargin no meu caso.

Acho que se vai descobrir como fazer isso.

Anatoli Kazharski:
Recebi a resposta do Service Desk. Vai resolvê-lo.

Obrigado.

 

Em relação ao bug "à volta" da OrderCalcMargin() fez um pedido ao SR

 
Kirill Belousov:

É difícil ter a certeza quando existe umacontradição directa na ajuda MQL4/5:

...Lembre-se que os parâmetros são passados para trás na função, ou seja, o último parâmetro é calculado e passado primeiro, depois o penúltimo, e assim por diante. O parâmetro que vem primeiro após o parêntese de abertura é calculado e passado por sua vez.


..
.Note-se quea ordem das expressões x1,..., xn é garantida.

Qual é a contradição aqui? Está ao contrário e é tudo. Não há declaração inversa.
 
Alexey Navoykov:
Qual é a contradição? Está ao contrário e é tudo. Não há declaração em contrário.

- Estas duas recomendações encontram-se em secções separadas da ajuda.

Quando se lê em

"Chamar uma função com argumentos x1, x2,..., xn"

aordem das expressões x1,....,xn é garantida, em que ordem está a pensar?

Sobre a encomenda x1,...,xn ou sobre a encomenda xn,....,x1 ?

 
Kirill Belousov:

- Estas duas recomendações encontram-se em secções separadas da ajuda.

Quando se lê em

"Chamar uma função com argumentos x1, x2,..., xn"

aordem das expressões x1,....,xn é garantida, em que ordem está a pensar?

A encomenda x1,...,xn ou a encomenda xn,....,x1 ?

Sim, tem razão, é confuso.

No entanto, penso que é má prática estabelecer a lógica do próprio algoritmo numa determinada ordenação de argumentos em qualquer caso. Ainda mais quando estes cálculos da direita para a esquerda confundem a compreensão do código. É por isso que se o quiser aplicar, deve fazê-lo apenas em alguns lugares não críticos como a impressão.

 
Kirill Belousov:

A ordem de cálculo das expressões em Print() é da direita para a esquerda. Tipo de... Adeus... Também foi verificado de antemão :)

Referência MQL5\Fases dalinguagem Operaçõese expressões Outras operações

Função chamada com argumentos x1, x2,..., xn

Note-se que a ordem das expressões x1,..., xn é garantida.

Demonstra mais uma vez a utilidade da palavra-chave C++ em linha (houve aqui uma opinião de que é supostamente obsoleta).
Entre outras coisas, inline significa de facto que o programador se recusa a utilizar a ordem de cálculo dos parâmetros da função e se o compilador decidir fazer uma função inline, o compilador pode utilizar a ordem de cálculo em linha como mais eficiente (a ordem inversa de cálculo é obviamente eficiente apenas para funções chamaveis).
Ao mesmo tempo, se o compilador decidir incorporar uma função não em linha, deve usar a ordem inversa (geral) de avaliação, mesmo que isso leve a uma perda de eficiência (porque o programador assumiu esta ordem sem ter declarado a função em linha)

inline também seria apropriado em MQL, onde a ordem de computação não pode ser controlada explicitamente