Erros, bugs, perguntas - página 1932

 
Комбинатор:

Em geral, o tipo decimal seria útil, é uma coisa útil.

Sim, a sua ausência em software que funciona com preços tem sido, no mínimo, confusa desde o início da existência da MT.

PS. Agora, com a existência da linguagem OOP, MQ provavelmente pensa que aqueles que desejam podem escrever uma aula para si próprios. Só que depois não se pode colocá-lo numa estrutura simples - seria necessário serializá-lo/deserializá-lo em algo simples como o ulong.
 
Slava:

Estou-lhe de facto muito grato por responder com tanto detalhe. A normalização é utilizada para gerar pedidos comerciais.

// Point = 0.001, Digits = 3
OrderSend(8274 * Point);
OrderSend(NormalizeDouble(8274 * Point, Digits));

Neste exemplo, parece que são enviados preços diferentes nestes dois OrderSend.

Sempre se assumiu que a multiplicação de um número inteiro por um Ponto não requer uma normalização adicional (foi assim que SL e TP foram definidos, por exemplo).

Então qual das duas linhas irá causar um erro?

 
Stanislav Korotky:

Sim, a sua ausência em software que funciona com preços tem sido embaraçosa desde o início da existência da MT, para dizer o mínimo.

Não pode ser que ninguém tenha escrito no SD
 
fxsaber:

Estou-lhe de facto muito grato por responder com tanto detalhe. A normalização é utilizada para gerar pedidos comerciais.

Neste exemplo, parece que são enviados preços diferentes nestes dois OrderSend.

Sempre se assumiu que a multiplicação de um número inteiro por um Ponto não requer uma normalização adicional (foi assim que SL e TP foram definidos, por exemplo).

Então qual das duas linhas irá causar o erro?

Fixe

#include <MT4Orders.mqh>

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);  
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
  
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Num, 0, 0, 0);
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Norm, 0, 0, 0);
}

Resultado

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

Ambas as consultas com preços diferentes, mas executadas sem problemas pelo mesmo preço. Como assim?

 
fxsaber:

Fixe

Resultado

Ambas as consultas com preços diferentes, mas executadas sem problemas ao mesmo preço. Como é que isto poderia ser?

Muito simplesmente, do ponto de vista de um duplo, estes números são idênticos porque o duplo armazena 52 bits da mantissa ou 15 casas decimais. As diferenças de mais ou menos em bits subsequentes não contam. Aqui está um artigo sobre hubra.

 
Stanislav Korotky:

Muito simplesmente, do ponto de vista do dobro, estes números são os mesmos porque o dobro armazena 52 bits da mantissa ou 15 casas decimais. As diferenças de mais ou menos nos dígitos subsequentes não contam. Aqui está um artigo sobre hubra.

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber, 2017.07.19 13:00

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}

И?

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

fxsaber, 2017.07.17 21:49

Se clicar em "Parar" durante uma única execução, OnDeinit e destruidores não são chamados.

Isto é uma falha ou um insecto?

Neste momento, premir o botão "Stop" causa uma forte desconexão com o Agente. Tão difícil que é impossível ver o relatório sem esperar pela conclusão de uma única corrida.

No MT4 pode sempre ver o histórico de uma única transacção incompleta. Mas em MT5 não há maneira de o fazer.

É possível não terminar a ligação com força, mas enviar uma bandeira ao agente que pode ser apanhado e executar o OnDeinit nele?

 
Stanislav Korotky:

И?

Stanislav Korotky:

Muito simplesmente, do ponto de vista do dobro, estes números são os mesmos porque o dobro armazena 52 bits de mantissa ou 15 casas decimais. As diferenças de mais ou menos em bits subsequentes não contam. Aqui está um artigo sobre hubra.

A diferença é superior a 1e-15. Além disso, Num != Norma. São números diferentes, não são os mesmos.
 
Stanislav Korotky:

И?

Na verdade, concordo que se estabelecermos um literal, seria lógico que a sua dupla representação fosse normalizada pelo número de dígitos no literal