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

 
Maxim Kuznetsov:

Alert("Разбег "+DoubleToString(delta,_Digits));

ou Alerta(StringFormat("Spread %.5f",delta));

em geral, acostume-se, são apenas representações diferentes de um mesmo número. Pense em seus maravilhosos anos escolares - é de lá que vem.

Obrigado. Mas e se eu precisar usar o valor delta como um número e compará-lo? Por exemplo.

if(delta>0.00005)
  {
   //------------
  }
Isso seria correto?
 
prom18:

Obrigado. E se eu precisar usar o valor delta como um número e comparar? Por exemplo.

Isto é correto?

Você pode comparar dois números reais como este:

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij:

Você pode comparar dois números reais como este:

https://www.mql5.com/ru/docs/basis/types/double

Você pode, se tiver certeza de que eles não podem estar muito próximos no significado. Afinal de contas, suave é comparado ao quente.
 
Alexey Viktorov:
Você pode, se tiver certeza de que eles não podem ser muito próximos em valor. Afinal de contas, suave é comparado ao quente.

Eu não entendo. Por exemplo. Tomo o número de pips que o preço passou em um tique. Se o preço passou mais de 20 pontos, então recebo um Alerta.

Comparo a diferença de preço (1,12300-1,12321=0,00021) com o valor máximo necessário (0,00020).

0.00021>0.00020.

O que isso tem a ver com suavidade e calor?

 
prom18:

Eu não entendo. Por exemplo. Tomo o número de pips que o preço passou em um tique. Se o preço passou mais de 20 pontos, então recebo um Alerta.

Comparo a diferença de preço (1,12300-1,12321=0,00021) com o valor máximo necessário (0,00020).

0.00021>0.00020.

O que isso tem a ver com suavidade e calor?

você precisa de pontos, então compare os pontos.

e o dobro é comparado ao epsilon (DBL_EPS se a memória servir), caso contrário você pode obter 3,0-0,2 > 2,0+0,8 (figurativamente, os números podem ser diferentes)

 
Maxim Kuznetsov:

você precisa de pontos, então compare os pontos. eles são inteiros, a propósito.

enquanto o dobro é comparado ao epsilon (DBL_EPS se a memória servir), caso contrário você pode obter 3,0-0,2 > 2,0+0,8 (figurativamente, os números podem ser diferentes)

melhor usar@fxsaber exemplo para este fim:

int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}

roteiro para verificar:

//+------------------------------------------------------------------+
void OnStart()
{
   int bar1 = PriceToInteger(iClose(NULL, 0, 1), _Point);
   int bar2 = PriceToInteger(iClose(NULL, 0, 2), _Point);
   printf("bar2 - bar1 = %i point", bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
//+------------------------------------------------------------------+
 
prom18:

Eu não entendo. Por exemplo. Tomo o número de pips que o preço passou em um tique. Se o preço passou mais de 20 pontos, então recebo um Alerta.

Comparo a diferença de preço (1,12300-1,12321=0,00021) com o valor máximo necessário (0,00020).

0.00021>0.00020.

O que isso tem a ver com suavidade e calor?

Bem, às vezes você não precisa ler tudo o que está escrito.

Você levou números que normalmente são representados pelo sistema. Pegue estes...

  double a=1.12328,
         b=1.12309,
         c=0.00019,
         d=a-b;

e você recebe

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

A idéia é a-b==c, mas o computador lhe dará tais erros. Foi escrito muito sobre isso no fórum, pesquisar e ler.

Mas você pode pegar a diferença normalizada e o valor de controle normalizado e compará-los.

 
Иван:
Bom tempo para todos vocês. Pergunta: em MT4, ao trabalhar no testador com cruzes (pares sem contrapartidas), como o testador calcula os resultados das posições fechadas, se a conta, na qual o teste é realizado, é uma conta em dólar? Para o recálculo dos totais de posição em dólares, o testador leva a taxa de câmbio da moeda base da cruz para o dólar no momento atual ou no momento do intervalo testado? Suspeito fortemente que seja no momento atual. Em caso afirmativo, é impossível fazê-la calcular no momento do intervalo?
Alguém sabe?
 
Иван:
Alguém sabe?

conte o MODE_TICKVALUE em si para cada tick.

 
Alexey Viktorov:
Você poderia, se tiver certeza de que eles não podem ser muito próximos em valor. Afinal de contas, suave é comparado ao quente.

Seo prom18 precisa comparar dois números, dentro dos sinais de Dígitos, este é o único método que funciona:

double price1 = 1.23450;
double price2 = 1.23447;

if(EqualDoubles(price1, price2, ((_Digits == 4) ? 0.0100 : 0.00100)) {
  ...
}

Mas, como você pode ver, tem ainda mais variações: https://www.mql5.com/ru/forum/160683/page1205#comment_17247843. Portanto, no exemplo, eu reduzi intencionalmente a precisão da comparação em dois dígitos. É claro que tal dispersão nos valores dos preços é bastante imprecisa. Mas de que outra forma comparar dois números em casos como este...? Se o desvio fosse sobre Dígitos, então não poderíamos usar EqualDoubles, mas usar NormalizeDouble para cortar todas as coisas desnecessárias.

Embora, você também poderia fazer isso assim:

int digits = Digits() - 2;

double price1 = NormalizeDouble(1.23450, digits);
double price2 = NormalizeDouble(1.23447, digits);

if(price1 == price2) {
  ...
}
Razão: