错误、漏洞、问题 - 页 443

 
voix_kas:

结果。

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

:)

好吧,考虑到算法 "设计 "花了大约3分钟(还有7分钟的实施),我做得很好:)目的是展示工作思路和澄清问题陈述。

而这一切都变成了有用的东西--开发人员有一个真正的机会来改进MathFloor()函数--显然它没有完全干净地实现。

最后,他们不得不对其进行修补。这很有趣。经过近一个小时的实验,我才设法得到一个稳定的函数(我是指CountSignedDigits(double x))。

即使现在我也不确定它在所有的输入值下都能正常工作。 我没有开发自动压力测试,我做了一个手动测试。 请测试一下。

我期望在浮点后稳定运行到10位小数。

int CountSignedDigits(double x)
{
  for(int i=0; i<1000; i++,x*=10)
  {
    if(x-MathFloor(x+0.000000000005)<double(0.000000000005)) return i;
  }
  return -1;
}
附上压力测试。//我没有从代码中删除一些中间的实现方式。我在评论中留下了它,供你尝试/思考。包括开发商。
附加的文件:
 
komposter:
1.你不需要为很多东西定义挖掘,只要把它规范化为正确的步骤即可。

2.即使在发送交易请求 时,手数变量中有一些垃圾(在小数位上),也应该被终端本身丢弃掉。

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

4.如果你想保险,你可以把它规范化到小数点后8位(留有余地)--如果 "正确 "规范化后有垃圾,它将会更远。

第一个想法是正确的,其他的想法是可疑的。:)

该实施方案 在实践中 是可行的,但对于 "问题启动器"(c)所定义的人工条件来说,是不准确的。对于离散的步骤产生的不是相对于lot_min,而是相对于零。:)

然而,如果你注意到这一点,就很容易解决。

double komposterNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
   if ( lot < lot_min ) lot = lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}
double metadriverNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}

// 请不要把所有这些珍珠看得太重。澄清纯粹是理论上的,用于大脑训练,因为在实践中,我从未见过lot_step等于,比如0.0231....。

;)

 
metadriverNormalizeLot

变体是正确的。在我的NL()中,正确地用lot_min 来说明。

 

我的变体也包括在内。请注意,对于一些工具来说,价格变化的步骤大于点。

//---------------------------------------------------------------------
//  Нормализация цены:
//---------------------------------------------------------------------
double
NormalizePrice( string _symbol, double _org_price )
{
  double  norm_price = _org_price;

  double  min_price_step = NormalizeDouble( current_tick_size / current_point, 0 );

  norm_price = NormalizeDouble( NormalizeDouble(( NormalizeDouble( _org_price / current_point, 0 )) / min_price_step, 0 ) * min_price_step * current_point, current_digits );

  return( norm_price );
}

//---------------------------------------------------------------------
//  Вычисление лота:
//---------------------------------------------------------------------
double
NormalizeLot( double _required_lot )
{
  double        lot, k;

  if( current_min_lot_step > 0 )
  {
    k = 1.0 / current_min_lot_step;
  }
  else
  {
    k = 1.0 / current_min_permitted_lot;
  }

  lot = MathFloor( _required_lot * k ) / k;

  if( lot < current_min_permitted_lot )
  {
   lot = current_min_permitted_lot;
  }

  if( lot > current_max_permitted_lot )
  {
    lot = current_max_permitted_lot;
  }

  lot = NormalizeDouble( lot, 2 );
  return( lot );
}
 

如果我们把步骤 不是从零开始,而是从最小批量开始作为一个公理,那么正确的算法是如下。

double voixkasNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
  if ( lot < lot_min ) lot = lot_min;
  else lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;

  if ( lot > lot_max ) lot = lot_max;
  return NormalizeDouble(Lot, 8);
}

在Composter版本中,步骤从零开始。这在我看来是不对的。
在MetaDriver的变体中,代码跳过一个负值。=Р

 
voix_kas:
...

在MetaDriver的变体中,代码跳过一个负值。=Р

:)) .....哦,是这样的!你根本不会工作!;-R;-b;-R

double voixkasNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
  if ( lot < lot_min ) lot = lot_min;
  else lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;

  if ( lot > lot_max ) lot = lot_max;
  return NormalizeDouble(L ot, 8);
}

好吧,如果有的话,最短的,同时也是 "有点准确 "的变体是这样的。

double mdNormalizeLot(double lot, double lot_step, double lot_min, double lot_max)
{
  lot = MathMin(lot, lot_min);
  lot = NormalizeDouble((lot-lot_min) / lot_step, 0) * lot_step + lot_min;
  return NormalizeDouble(MathMin(lot, lot_max), MathMax(CountSignedDigits(lot_min),CountSignedDigits(lot_step));
}

这还没有检查lot_steplot_min和 lot_max 的无效性和消极性!!......

:))))

 

呃...打了个激灵。:))最后一行是在一个论坛帖子中手工更正的,所以请原谅我。=)
顺便说一下,你的代码也没有编译(我忘了在最后一行加一个结尾括号)。:-Р
此外,它的速度要慢2-3倍(现在我已经用脚本检查过了),但检查的质量是一样的。:-Р

总之,只要没有合适的代码来确定重要的整数,我就接受Composter的建议:将体积归一到小数点后8位。
希望不会有什么隐患。

感谢大家的帮助。

 

你们很有趣,我明白了。

在你的第一篇文章中给了NL()什么你只到了两页之后;)

 

还有一个问题要问大师们。当我测试多币种的时候,我得到了错误(截图附后)。
我正试图进行交易操作,但我得到的答案是:没有价格。根据测试仪可以看出,该货币对的报价从2011.01.0301:00:00开始,而欧元兑美元的报价也是从2011.01.0300:00:00开始的,有什么方法可以找出报价开始的时间来绕过这个错误?

有错误的屏幕截图

 
voix_kas:

还有一个问题要问大师们。当我测试多币种的时候,我得到了错误(截图附后)。
我正试图进行交易操作,但我得到的答案是:没有价格。根据测试者可以看出,该货币对的报价从2011.01.0301:00:00开始,而欧元兑美元的报价也是从2011.01.0300:00:00开始的,有什么方法可以找出报价开始的时间来避免这种错误吗?

交易和报价会议将无助于解决问题?