新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1206

 
Maxim Kuznetsov:

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

或Alert(StringFormat("Spread %.5f",delta))。

在一般情况下,要习惯它,它们只是同一个数字的不同表现形式。回想一下你美好的学生时代--这就是它的来源。

谢谢你。但如果我需要将delta值作为一个数字来使用并进行比较呢?比如说。

if(delta>0.00005)
  {
   //------------
  }
这是否正确?
 
prom18:

谢谢你。如果我需要将delta值作为一个数字来使用并进行比较怎么办?比如说。

这是否正确?

你可以这样比较两个实数。

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:

你可以这样比较两个实数。

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

你可以,如果你确定它们的含义不可能非常接近。毕竟,柔软是和温暖相比的。
 
Alexey Viktorov:
你可以,如果你确定它们的价值不可能非常接近。毕竟,柔软是和温暖相比的。

我不明白。比如说。我取的是价格在一个刻度内所经过的点数。如果价格超过20个点,那么我就会收到一个警报

我将价格差异(1.12300-1.12321=0.00021)与必要的最大值(0.00020)进行比较。

0.00021>0.00020.

这与柔软和温暖有什么关系?

 
prom18:

我不明白。比如说。我取的是价格在一个刻度内所经过的点数。如果价格超过20个点,那么我就会收到一个警报。

我将价格差异(1.12300-1.12321=0.00021)与必要的最大值(0.00020)进行比较。

0.00021>0.00020.

这与柔软和温暖有什么关系?

你需要点,所以要比较点。顺便说一下,它们是整数。

和双倍数相比,epsilon(DBL_EPS,如果没记错的话),否则你可能得到3.0-0.2>2.0+0.8(比喻,数字可能不同)。

 
Maxim Kuznetsov:

你需要点,所以要比较点。顺便说一下,它们是整数。

而double与epsilon(DBL_EPS,如果没记错的话)相比,否则你可能会得到3.0-0.2>2.0+0.8(形象地说,数字可能不同)。

最好为此目的使用@fxsaber 的例子。

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

脚本来检查。

//+------------------------------------------------------------------+
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:

我不明白。比如说。我取的是价格在一个刻度内所经过的点数。如果价格超过20个点,那么我就会收到一个警报。

我将价格差异(1.12300-1.12321=0.00021)与必要的最大值(0.00020)进行比较。

0.00021>0.00020.

这与柔软和温暖有什么关系?

好吧,有时你不必阅读所有的文字。

你采取了通常由系统代表的数字。拿着这些...

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

而你得到的是

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

这个想法是a-b==c,但电脑会给你这样的错误。在论坛上写了很多,可以搜索阅读。

但你可以采取归一化的差异和归一化的控制值,并对它们进行比较。

 
Иван:
祝大家时间愉快。问题:在MT4中,当在测试器中使用交叉盘(没有英镑的货币对)时,如果进行测试的账户是美元账户,测试器如何计算平仓 的结果?对于以美元为单位的头寸总额的重新计算,测试者是采用当前时刻还是测试区间时刻的交叉盘基础货币 对美元的汇率?我强烈怀疑,在目前的情况下是这样。如果是这样,是否不可能在间隔时间内使其计算出来?
有谁知道吗?
 
Иван:
有谁知道吗?

计算每个刻度 的MODE_TICKVALUE本身。

 
Alexey Viktorov:
你可以,如果你确定它们的价值不可能非常接近。毕竟,柔软是和温暖相比的。

如果prom18 需要比较两个数字,在Digits标志内,这是唯一可行的方法。

double price1 = 1.23450;
double price2 = 1.23447;

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

但正如你所看到的,它有更多的变化:https://www.mql5.com/ru/forum/160683/page1205#comment_17247843。 因此,在这个例子中,我有意将比较的准确性降低了两位数。当然,这样的价格值差是相当不准确的......但是,在这样的情况下,还能如何比较两个数字呢...?如果偏差超过Digits,那么我们就不能使用EqualDoubles,而是使用NormalizeDouble来切断所有不必要的东西。

虽然,你也可以这样做。

int digits = Digits() - 2;

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

if(price1 == price2) {
  ...
}
原因: