Duplo versus FLOAT - erro de MathFloor não claro - página 6

 
fxsaber:
Sim.
Obrigado
 
Vladislav Andruschenko:
Obrigado
Havia uma solução na primeira página... já está na página seis.
 
fxsaber:
Então por que funciona sem a normalização e o MathFloor?
Se a entrada for 0,95?
 
Dmitry Fedoseev:
Se a entrada for 0,95?
Eu não entendo.
 
Vladislav Andruschenko:
Posso não estar bem certo do que obter, mas veja esta opção
void OnStart()
{
double ask2 = 1.55557, ask3 = 1.55558, bid = 1.55555;
  Print("(ask2 + bid)/2 = ", (ask2 + bid)/2);
   Print("(ask3 + bid)/2 = ", (ask3 + bid)/2);
    int avPrice_2 = (int)NormalizeDouble((ask2/_Point + bid/_Point)/2, 0);
   int avPrice_3 = (int)NormalizeDouble((ask3/_Point + bid/_Point)/2, 0);
  Print("avPrice_2 = ", avPrice_2);
Print("avPrice_3 = ", avPrice_3);
}/*******************************************************************/
resultado
2017.02.27 00:03:54.453 00 (EURUSD.m,H1)        (ask2 + bid)/2 = 1.55556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        (ask3 + bid)/2 = 1.555565
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_2 = 155556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_3 = 155557
 

"Take Ask and Bid. e calcular o preço médio". Se o spread for estranho (3,5,7,9, etc.), então iguale o preço médio mais próximo da Proposta".

A tarefa não está definida:

- O que significa uma dispersão estranha. 1,3,...,9 vezes Ponto ou 1,3,...,17,57 vezes Ponto? Os arredondamentos funcionam dentro de segmentos de unidade...

- o que significa "mais próximo da Licitação"? Particularmente se o spread for 43 vezes Point, por exemplo. Estamos falando de equiparar a Licitação a quê?

Primeiro é preciso clareza no problema, só então uma decisão inequívoca pode ser tomada.

Ao mesmo tempo, já que estamos falando de números pares/outros, seria lógico ir para números inteiros, onde este conceito faz sentido.

double Ask,Bid,Middle; // Уже известные курсы Ask и Bid, вычисляемый средний курс
int Mash,Spr; // Множитель перехода к целым числам. Для 4-разрядного EURUSD 10000. И целочисленный спред

Mash=MathRound(1.0/_Point);
Spr=MathRound((Ask-Bid)*Mash); // Целочисленный спред
// Придаем конкретность среднему курсу.  Предполагаем, что "ближе к Бид" значит "ближайший меньший среднего арифметического Ask и Bid, кратный Point"
Spr=Spr >> 1; // Целочисленный спред, деленный на 2 с отбрасыванием остатка
Middle=Bid+Spr*_Point;


// Если предположение неверно, канва последующих разборов такая
if ((Spr &  1)  != 0)) {  // Спред нечетный
  }
else {  // Спред четный
  }

 
Eu tive algo semelhante acontecendo em uma tarefa muito simples - o roteiro leu o preço de abertura do EURUSD da série temporal em um array dobrado e depois escreveu esse array em um arquivo. Desde que o preço fosse maior que um, tudo estava bem. Mas quando no ano zero o preço era inferior a 1, às vezes não muito frequentemente, cerca de 20 vezes por ano, algumas coisas estranhas começaram a ocorrer - em algum lugar na 15ª casa decimal o 1 foi cortado e todos os anteriores, é claro, se transformaram em 9. Não é um grande negócio, mas não é agradável. A normalização o fez em todos os lugares e após a leitura e antes de escrever para o arquivo e durante a gravação, e convertendo de um array para outro com a normalização - nada funcionou. Se eu acrescentar 1 ao ler de séries cronológicas, tudo estava bem. Eventualmente me fartei disso, mudei o dowble para flutuar e me acalmei.
 
Vladimir:

"Take Ask and Bid. e calcular o preço médio". Se o spread for ímpar (3,5,7,9, etc.), então iguale o preço médio mais próximo do Bid".

A tarefa não está definida:

Na verdade, a tarefa parece ser simples? e pode ser feita por um estudante? :-) Eu também pensei assim.

Mas nos preços do servidor, na normalização dos dados e no resto - há cantos escuros que você nem sequer quer dizer.

Tenho programado em mql há 9 anos - e nunca tive problemas com a normalização porque acertei. e a precisão de 1 miliponto sempre funcionou corretamente.

Mas há tarefas que exigem alta precisão.

E há condições.

Nomeadamente:

  1. Tomamos o preço ASC e BID - calcular seu preço médio = fácil? ok.
  2. Portanto, se o spread for estranho (3 pontos por exemplo), então não podemos dividir sem um resto, certo?

Portanto, temos que normalizar o preço de tal forma que, se houver um resíduo (e haverá um mesmo com um spread uniforme! :-)), então, o preço médio se aproxima do ponto baixo, ou seja, da Licitação.

Por exemplo:

  • asc = 1,23455 lance = 1,23457 spread = 2 Preço médio: 1,23456
  • Perguntar = 1,23455 Lance = 1,23458 Spread = 3 Preço médio: 1,23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Preço médio: 1,23457

E tudo parece ser simples? Tudo deveria funcionar e eu mesmo sou um tolo... e fiquei sentado por 2 dias esperando não ser um tolo. Compreensão sobre rabos e tribbles e tribbles e bibbles..................

Mas! com a mesma fórmula, com spreads pares e spreads estranhos - em algumas situações - a Fórmula não funcionou . (ver acima) .

Inclusive, pode trabalhar com moedas e não com petróleo.

Pode funcionar em JPY e não funcionar em USD em algum momento.

Talvez esteja olhando para a influência da lua... O tempo na África .................

Mas, quando você tem certeza de que a fórmula funciona, não percebe que 1 miliponto. e você trabalha em ..... e então "Bang, bang, bang, bang" e aquele miliponto, decide fugir, ou chama o segundo miliponto, Quem se atrapalha.

IMHO.

Você pode pensar em mim como um tolo, um sub-programador, um estudante.... e assim por diante.

Mas o fato permanece.

Ocorre um erro com diferentes combinações de valores duplos. Ao mesmo tempo, tudo fica claro com a bóia.

Eu ainda não descobri. A ajuda é muito boa e eu sempre peço ajuda, isso é normal. E eu posso pedir ajuda à comunidade em 10 anos. Isto é normal. E eu respondo a um pedido de ajuda se conheço as armadilhas - isso é normal.

É claro que, após tais testes, farei uma "investigação extra" para entender por mim mesmo por que é este o caso.

Obrigado a todos por sua capacidade de resposta e ajuda.

 
Vladislav Andruschenko:

Na verdade, a tarefa parece ser simples... E pode ser feita por um estudante... :-) Eu também pensei assim.

Mas há cantos tão escuros nos preços obtidos do servidor, na normalização dos dados e no resto - que você não quer dizer nem mesmo.

Tenho programado em mql há 9 anos - e nunca tive problemas com a normalização porque acertei. e a precisão de 1 miliponto sempre funcionou corretamente.

Mas! com a mesma fórmula, com spreads pares e spreads estranhos - em algumas situações - a Fórmula não funcionou . (ver acima) .

Com diferentes combinações - com valores duplos ocorre um erro. Ao mesmo tempo, com o flutuador, tudo fica claro.

O que a versão de normalização de dados da Metakvotes tem a ver com isso de qualquer maneira? Este termo significa coisas diferentes para os programadores e não arredondamento de forma alguma. Leia a Norma IEEE 754, por exemplo, aqui:http://www.softelectro.ru/ieee754.html. Os números reais não normalizados variam até 1,17549421*10^(-38) no caso de 4 bytes de comprimento e até 4....*10^(-324) no caso de 8 bytes de comprimento, nós os encontramos muito raramente e certamente não nos cálculos do curso. Se você precisar ligar para OrderSend, então arredonde-o de acordo com as exigências desta função. Não há necessidade de usar arredondamento até que a tarefa o exija.

Os erros não ocorrem em formato duplo ou flutuante, mas nas operações utilizadas. O fato de a fórmula não ter resolvido a tarefa diz-lhe que ela não é apropriada para a tarefa. Não mais do que isso. Diga-me que erros ocorrem em um cálculo normal sem normalização (esta é a peça do meu posto acima):

Spr=MathRound((Ask-Bid)/_Point); Spr=Spr >> 1; Middle=Bid+Spr*_Point;

IEEE 754 - стандарт двоичной арифметики с плавающей точкой
  • Yashkardin Vladimir
  • www.softelectro.ru
double-precision длина числа, бит 32 64 смещенная экспонента (E), бит 8 11 остаток от мантиссы (M), бит 23 52 смещение 127 1023 двоичное денормализованое число (-1)S∙0,M∙exp2-127 ,где M-бинарное (-1)S∙0,M∙exp2-1023 ,где M-бинарное двоичное нормализованое число (-1)S∙1,M∙exp2(E-127) ,где M-бинарное (-1)S∙1,M∙exp2(E-1023) ,где M-бинарное...
 
Vladislav Andruschenko:

Na verdade, a tarefa parece simples... E pode ser feita por um estudante... :-) Eu também pensei assim.

Mas há cantos tão escuros nos preços obtidos do servidor, na normalização dos dados e no resto - que você não quer dizer nem mesmo.

Tenho programado em mql há 9 anos - e nunca tive problemas com a normalização porque acertei. e a precisão de 1 miliponto sempre funcionou corretamente.

Mas há tarefas que exigem alta precisão.

E há condições.

Nomeadamente:

  1. Tomamos o preço ASC e BID - calculamos seu preço médio = fácil? ok.
  2. Portanto, se o spread for estranho (3 pontos por exemplo), então não podemos dividir sem um resto, certo?

Portanto, temos que normalizar o preço de tal forma que, se houver um resíduo (e haverá um mesmo com um spread uniforme! :-)), então, o preço médio se aproxima do ponto baixo, ou seja, da Licitação.

Por exemplo:

  • asc = 1,23455 lance = 1,23457 spread = 2 Preço médio: 1,23456
  • Perguntar = 1,23455 Lance = 1,23458 Spread = 3 Preço médio: 1,23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Preço médio: 1,23457

E tudo parece ser simples? Tudo deveria funcionar e eu mesmo sou um tolo... e fiquei sentado por 2 dias esperando não ser um tolo. Compreensão sobre rabos e tribbles e tribbles e bibbles..................

Mas! com a mesma fórmula, com spreads pares e spreads estranhos - em algumas situações - a Fórmula não funcionou . (ver acima) .

Inclusive, pode trabalhar com moedas e não com petróleo.

Pode funcionar em JPY e não funcionar em USD em algum momento.

Talvez esteja olhando para a influência da lua... O tempo na África .................

Mas, quando você tem certeza de que a fórmula funciona, não percebe que 1 miliponto. e você trabalha em ..... e então "Bang, bang, bang, bang" e aquele miliponto, decide fugir, ou chama o segundo miliponto, Quem se atrapalha.

IMHO.

Você pode pensar em mim como um tolo, um sub-programador, um estudante.... e assim por diante.

Mas o fato permanece.

Ocorre um erro com diferentes combinações de valores duplos. Ao mesmo tempo, tudo fica claro com a bóia.

Eu ainda não descobri. A ajuda é muito boa e eu sempre peço por ela, é normal. E posso pedir ajuda à comunidade em 10 anos. Isto é normal. E eu respondo a um pedido de ajuda se conheço as armadilhas - isso é normal.

É claro que, após tais testes, farei uma "investigação extra" para entender por mim mesmo por que é este o caso.

Obrigado a todos por sua capacidade de resposta e ajuda.

Dependendo de seus objetivos, às vezes vale a pena ir a números inteiros ao todo. Isso economiza muitos nervos :-) Uma vez tive uma tarefa na qual tive que marcar com precisão muitos, muitos níveis, no início lutei com o dobro, mas depois converti tudo em pontos inteiros de 0 e tudo se tornou fácil, simples e sem erros.