错误、漏洞、问题 - 页 442

 
voix_kas:

有没有人有现成的代码来计算一个体积的 有效数字的数量?
类似于SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)的东西,但只针对体积。
例如,对于SymbolInfoDouble( _Symbol,SYMBOL_VOLUME_STEP) = "1.0" 的情况 - 答案是 "0",代表 "0.1" - "1",代表 "0.01"- "2 "等。

让我澄清一个细微的差别。对于像 "0.1"、"0.01"、"0.001 "这样的体积步骤,我有。

该代码应该对以下情况起作用,如 "0.2"、"0.11"、0.023 "等。

没有专门针对体积 的代码。有什么都可以。

int CountSignedDigits(double x)
{  
  for(int i=0; i<1000; i++,x*=10) if(x-MathFloor(x)<DBL_MIN*2) return i;
  return -1;
}
剧本是为了在预告片中检查。
附加的文件:
_UniTest.mq5  2 kb
 
MetaDriver:
在拖车中检查的脚本。
你是说......,我想我应该在下订单之前检查可接受的批次。
 
sergeev:
你是说......,我想我应该在下订单之前检查一下允许的批次。

;)

我真的不知道他想要什么。我们看看他怎么说,我只是在练习我的心灵感应。;)

 
voix_kas:

有没有人有现成的代码来计算一个体积的有效位数?
类似于SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)的东西,但只针对体积。
例如,对于SymbolInfoDouble( _Symbol,SYMBOL_VOLUME_STEP) = "1.0" 的情况 - 答案是 "0",代表 "0.1" - "1",代表 "0.01"- "2 "等。

让我澄清一个细微的差别。对于像 "0.1"、"0.01"、"0.001 "这样的体积步骤,我有。
该代码应该对以下情况起作用,如 "0.2"、"0.11"、0.023 "等。

具体到体积,可以很简单。

      int N=0;
      double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
      if(step-1.0<0)  N++;
      if(step-0.1<0)  N++;
      if(step-0.01<0) N++;
 

sergeev
MetaDriver
Valmars

精心设计的问题是答案的一半。:)对不起,我已经去睡觉了,我没能准确描述任务。我将再次尝试。

我说的是将一个正常化的交易量 传递给一个交易订单
这是我们对价格所做的事情。

MqlTradeRequest TradeRequest;
...
TradeRequest.volume = NormalizeDouble(Volume, GetVolumeDigits(_Symbol));
TradeRequest.price  = NormalizeDouble(Price, SymbolInfoInteger(_Symbol, SYMBOL_DIGITS));
...

价格正常化--我想大家都很清楚。

在我的时代(从MT4开始),我在MT文章中看到,最好也能将成交量正常化。
实际上,我写了GetVolumeDigits(string Symbol)这个函数,以根据经纪人的条件找到可能的最小成交量值。至少有两种实现方式(结果是一样的)。
实施#1

int GetVolumeDigits(string Symbol) {
  int VolumeDigits = 0;
  double VolumeStep = SymbolInfoDouble(Symbol, SYMBOL_VOLUME_STEP);
  while (VolumeStep < 1) {
    VolumeStep *= 10;
    VolumeDigits++;
  }
  return VolumeDigits;
}
实施№2

int GetVolumeDigits(string Symbol) {
  return (int)MathLog10(1.0 / SymbolInfoDouble(Symbol, SYMBOL_VOLUME_STEP));
}

它们都能完美地适用于最小步长=1.0、0.1、0.01、0.001等的变体。也就是说,如果最小步长是1.0,该函数将返回0;如果步长是0.1,该函数将返回1,等等。
例如,如果最小台阶是1.1,或0.11,或0.011,怎么办?这种算法会错误地显示最小有效数字。
当然,你可以断言,在实践中没有这样的情况。我只想在我的专家顾问中考虑这样一种假设的可能性。我想,也许有人会分享他们在这个问题上的经验......。

 
voix_kas:
是的,我明白了,你希望结果是VolumeStep的倍数。嗯,这与Digits无关,首先用Digits计算体积,然后将其减少到VolumeStep的最近的倍数。
 
voix_kas:

这是关于将正常化的交易量 发送到交易单上
我只是想在我们的专家顾问中考虑这种假设的可能性。

我们谈论的是哪种 "假设的 "工具?

1.MetaDriver 的变体适合你。CountSignedDigits 将显示任何批次中的字符数。

2.知道了数位 的数量,你就可以像这样进行归一化。

double MinLot; // минимальный лот по символу
double MaxLot; // максимальный лот по символу
double LotStep; // шаг лота по символу
int dig; // знаковость лота узнали из функции CountSignedDigits

double NL(double lot)
{
  if (lot<=MinLot) return(MinLot); // проверка на минимальный
  double d=MathFloor((lot-MinLot)/StepLot); // сколько ЦЕЛЫХ шагов умещается в проверяемом лоте
  lot=MinLot+StepLot*d; // рассчитали по этому целому числу
  lot=MathMin(lot, MaxLot);  lot=NormalizeDouble(lot, dig);// не забыли проверить на максимальный // нормализовали
  return(lot); // вернули
}
 

sergeev
谢谢你的地段验证功能。我正在使用类似的结构/分支支票。
我的问题集中在寻找地段中最年轻的地方,使其正常化。
特别是,MetaDriver 给出了他对 "一切 "的构建。:)然而,它并非没有缺陷(或者我的编译器有缺陷)。下面是代码和执行结果。

void OnStart() {
  Print(CountSignedDigits(110.0));
  Print(CountSignedDigits(11.0));
  Print(CountSignedDigits(1.1));
  Print(CountSignedDigits(0.11));
  Print(CountSignedDigits(0.011));
  Print(CountSignedDigits(0.0011));
  Print(CountSignedDigits(0.00011));
}

int CountSignedDigits(double x) {  
  for (int i = 0; i < 1000; i++, x *= 10)
    if (x - MathFloor(x) < DBL_MIN * 2)
      return i;
  return -1;
}

结果。

2011.07.03 13:15:21     test (EURUSD,M5)        5
2011.07.03 13:15:21     test (EURUSD,M5)        4
2011.07.03 13:15:21     test (EURUSD,M5)        18      -    Здесь только у меня бяка вылазиет?
2011.07.03 13:15:21     test (EURUSD,M5)        2
2011.07.03 13:15:21     test (EURUSD,M5)        1
2011.07.03 13:15:21     test (EURUSD,M5)        0
2011.07.03 13:15:21     test (EURUSD,M5)        0

下一个选项(CountSignedDigits函数是一样的)。

void OnStart() {
  double value = 110.0;
  int count = 9;
  while (count) {
    Print(DoubleToString(value), " - ", CountSignedDigits(value));
    value /= 10;
    count--;
  }
}

结果。

2011.07.03 13:23:32     test (EURUSD,M5)        0.00000110 - 22       -   Почему-то здесь бяка...
2011.07.03 13:23:32     test (EURUSD,M5)        0.00001100 - 21       -
2011.07.03 13:23:32     test (EURUSD,M5)        0.00011000 - 5
2011.07.03 13:23:32     test (EURUSD,M5)        0.00110000 - 4
2011.07.03 13:23:32     test (EURUSD,M5)        0.01100000 - 3        - Здесь уже все нормально. Почему результаты разные?!
2011.07.03 13:23:32     test (EURUSD,M5)        0.11000000 - 2
2011.07.03 13:23:32     test (EURUSD,M5)        1.10000000 - 1
2011.07.03 13:23:32     test (EURUSD,M5)        11.00000000 - 0
2011.07.03 13:23:32     test (EURUSD,M5)        110.00000000 - 0
 

在OnStart中修改了以下一行。

double value = 210.0;

结果。

2011.07.03 13:28:01     test (EURUSD,M5)        0.00000021 - 23
2011.07.03 13:28:01     test (EURUSD,M5)        0.00000210 - 22
2011.07.03 13:28:01     test (EURUSD,M5)        0.00002100 - 21
2011.07.03 13:28:01     test (EURUSD,M5)        0.00021000 - 20
2011.07.03 13:28:01     test (EURUSD,M5)        0.00210000 - 19
2011.07.03 13:28:01     test (EURUSD,M5)        0.02100000 - 3
2011.07.03 13:28:01     test (EURUSD,M5)        0.21000000 - 2
2011.07.03 13:28:01     test (EURUSD,M5)        2.10000000 - 1
2011.07.03 13:28:01     test (EURUSD,M5)        21.00000000 - 0
2011.07.03 13:28:01     test (EURUSD,M5)        210.00000000 - 0

要么是我做错了(请纠正),要么是MetaDriver 在理论上犯了错误(设计 算法时)。

 
voix_kas:

我的问题主要是确定地段中最低的地方,以使其正常化。

你不需要为这批人定义挖掘,只需将其规范化为正确的步骤。
   lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
   if ( lot < lot_min ) lot = lot_min;
   if ( lot > lot_max ) lot = lot_max;


即使在向手数变量发送交易请求 时,它将得到垃圾(在小数点后第二位),它将被终端本身拒绝。

至少,在使用这种设计的几年中,我没有遇到任何问题。


如果你想再保险,你可以把它规范化到小数点后第8位(有储备金)--如果在 "正确 "的规范化后出现垃圾,它将会更远。

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5