Duplo versus FLOAT - erro de MathFloor não claro

Vladislav Andruschenko  

Olá a todos, estou ficando cansado da exatidão das citações. A normalização e assim por diante.

      float AUTOPRICE;
      float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      float Averab=((askP+bidP))/2.0;
      AUTOPRICE=MathFloor(Averab)*Point;
      Print("FLOAT  "+"  askP="+askP+" bidP="+bidP+" Averab="+DoubleToString(Averab,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE,10));

      double AUTOPRICE2;
      double askP2=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP2=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      double Averab2=((askP2+bidP2))/2.0;
      AUTOPRICE2=MathFloor(Averab2)*Point;
      Print("DOUBLE  "+"  askP2="+askP2+" bidP2="+bidP2+" Averab2="+DoubleToString(Averab2,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE2,10));

spread:2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - PISO DE TESTE DUPLO EURUSD,M30:DOUBLE askP2=105143 bidP2=105141 Averab2=105142.000000 AUTOPRICE=1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - TESTE DOUBLE MATHFLOOR EURUSD,M30:FLOAT askP=105143 bidP=105141 Averab=105142.0000000000 AUTOPRICE=1.0514199734




spread:3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - PISO DE TESTE DUPLO EURUSD,M30:DOUBLE askP2=105144 bidP2=105141 Averab2=105142.5000000000 AUTOPRICE=1.0514200000

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - TESTE DOUBLE MATHFLOOR EURUSD,M30:FLOAT askP=105144 bidP=105141 Averab=105142.5000000000 AUTOPRICE=1.0514199734


spread:4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - PISO DE TESTE DUPLO EURUSD,M30:DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - PISO DE TESTE DUPLO EURUSD,M30:FLOAT askP=105145 bidP=105141 Averab=105143.0000000000 AUTOPRICE=1.0514299870

spread:5

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - PISO DE TESTE DUPLO EURUSD,M30:DOUBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000

2017.02.26 09:58:39.495 2017.01.02 00:03:00 Exp - PISO DE TESTE DUPLO EURUSD,M30:FLOATaskP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870

Esses sinais extras estão em algum lugar no final do túnel..........

Vladislav Andruschenko  
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

no spread=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

no spread=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

em 4!!!! spread

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

por que ?

fxsaber  
Vladislav Andruschenko:

Olá a todos, estou ficando cansado da exatidão das citações. Normalizações e assim por diante.

De alguma forma, você deve ser capaz de entender o que são o dobro e a int. Como funciona a conversão do tipo.

Eu nunca usei MathMod e MathFloor. Seu código grita muito que você não entende de todo o que está por trás do que você escreveu.

A impressão do número duplo não tem nada a ver com isso. Se você quiser imprimir o valor real do dobro, você precisa olhar para seus bytes.

Vladislav Andruschenko  

priming apenas para evitar ter que escrevê-lo manualmente,

A variável em si não dá o resultado que eu espero dela.

Fundição tipo, normalização int e dublagem são o que tenho feito sem ajuda.

No momento estou desesperado como tentei todas as opções. e colocar um pedaço de código 1 em 1000 que não funciona como deveria.

Mas obrigado pela ajuda.

Tente fazer o que eu quero: não me mostre o código depois, apenas me diga se ele funciona ou não.

Faça o Ask and Bid.

e calcular o preço médio.

Se o spread for ímpar (3,5,7,9, etc.), equacionar o preço médio mais próximo do Bid.

Por exemplo:

Licitação=1.55555 Pergunta=1.55557 Preço médio=1.55556 Spread=2

Bid=1.5555 Ask=1.55558 Preço médio=1.55556 Spread=3

e você vai acertar.

Mas quando o spread for 4,5,6,7 - você terá essa precisão indo para o desconhecido. E os números vão nadar na direção errada.

sibirqk  
Vladislav Andruschenko:
      double askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);

      double Averab=((askP+bidP)*1)/2.0;
      Print("askP="+askP+" bidP="+bidP+" Averab="+Averab+" MathFloor((int)Averab)="+MathFloor((int)Averab));

no spread=2

askP=105143 bidP=105141 Averab=105142 MathFloor((int)Averab)=105142

no spread=3

askP=105144 bidP=105141 Averab=105142.5 MathFloor((int)Averab)=105142

em 4!!!! spread

askP=105545 bidP=105141 Averab=105143 MathFloor((int)Averab)=105142

por que ?

Uma vez tive uma situação semelhante - minha mente estava fervendo de indignação. Substituir o dobro por flutuador ajudou , ainda não sei por quê.

Vladislav Andruschenko  
sibirqk:
Uma vez tive uma situação semelhante - minha mente estava fervendo de indignação na época. A substituição do dobro por um flutuador ajudou , ainda não sei por quê.

Obrigado, vou tentar ......... Também estou ficando louco.

SIM!!! É exatamente assim que funciona! não há problema.

float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
float Averab=((askP+bidP))/2.0;

Obrigado!!! Eu não sei mais o que eu faria........

fxsaber  
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

É assim que funciona o MathFloor

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}
Andrey Dik  
double Averab = NormalizeDouble ((Ask + Bid)/(2.0 * Point), Digits);
Vladislav Andruschenko  
fxsaber:
#define ALPHA 0.1

int askP = (int)(Ask / Point + ALPHA);
int bidP = (int)(Bid / Point + ALPHA);

É assim que funciona o MathFloor

int MyMathFloor( const double Num )
{
  return((int)((Num > 0) ? Num : Num - 1));
}

para diferentes pastas? incluindo 2,3,4,5,6,7 ?

Porque eu tentei seu caminho antes (sem+ ALPHA). 2,3 spread está bem, mas 4,5 já é uma falha

Andrey Dik:
double Averab = NormalizeDouble ((Ask + Bid)/2.0, Digits);

Normalização, esta é a primeira coisa que fiz na função, mas infelizmente em certas propagações, ela começa a apresentar falhas

Andrey Dik  
Vladislav Andruschenko:

normalização é a primeira coisa que fiz na função, mas infelizmente em certas propagações, ela começa a apresentar falhas

Eu consertei, experimente agora.
fxsaber  
Vladislav Andruschenko:

Aceite o Ask and Bid.

e calcular o preço médio.

Se o spread for ímpar (3,5,7,9 etc.), equacionar o preço médio mais próximo da Licitação.

#define ALPHA 0.1

int DoubleToInt( const double Num )
{
  return((int)(Num + ALPHA));
}

void OnStart()
{
  double NewPrice = DoubleToInt((Ask + Bid) / (2 * Point)) * Point;

  Print(NewPrice);
}
Razão: