错误、漏洞、问题 - 页 443 1...436437438439440441442443444445446447448449450...3184 新评论 Vladimir Gomonov 2011.07.03 16:46 #4421 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; } 附上压力测试。//我没有从代码中删除一些中间的实现方式。我在评论中留下了它,供你尝试/思考。包括开发商。 附加的文件: CSDigitTest.mq5 2 kb Vladimir Gomonov 2011.07.03 17:36 #4422 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....。 ;) --- 2011.07.03 17:40 #4423 metadriverNormalizeLot变体是正确的。在我的NL()中,正确地用lot_min 来说明。 Dmitriy Skub 2011.07.03 17:56 #4424 我的变体也包括在内。请注意,对于一些工具来说,价格变化的步骤大于点。//--------------------------------------------------------------------- // Нормализация цены: //--------------------------------------------------------------------- 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 ); } [删除] 2011.07.03 18:31 #4425 如果我们把步骤 不是从零开始,而是从最小批量开始作为一个公理,那么正确的算法是如下。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的变体中,代码跳过一个负值。=Р Vladimir Gomonov 2011.07.03 19:06 #4426 voix_kas:...在MetaDriver的变体中,代码跳过一个负值。=Р:)) .....哦,是这样的!你根本不会工作!;-R;-b;-Rdouble 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_step、lot_min和 lot_max 的无效性和消极性!!......:)))) [删除] 2011.07.03 19:32 #4427 呃...打了个激灵。:))最后一行是在一个论坛帖子中手工更正的,所以请原谅我。=) 顺便说一下,你的代码也没有编译(我忘了在最后一行加一个结尾括号)。:-Р 此外,它的速度要慢2-3倍(现在我已经用脚本检查过了),但检查的质量是一样的。:-Р总之,只要没有合适的代码来确定重要的整数,我就接受Composter的建议:将体积归一到小数点后8位。 希望不会有什么隐患。感谢大家的帮助。 --- 2011.07.03 19:45 #4428 你们很有趣,我明白了。在你的第一篇文章中给了NL()什么你只到了两页之后;) [删除] 2011.07.03 20:00 #4429 还有一个问题要问大师们。当我测试多币种的时候,我得到了错误(截图附后)。 我正试图进行交易操作,但我得到的答案是:没有价格。根据测试仪可以看出,该货币对的报价从2011.01.0301:00:00开始,而欧元兑美元的报价也是从2011.01.0300:00:00开始的,有什么方法可以找出报价开始的时间来绕过这个错误? [删除] 2011.07.03 20:06 #4430 voix_kas:还有一个问题要问大师们。当我测试多币种的时候,我得到了错误(截图附后)。 我正试图进行交易操作,但我得到的答案是:没有价格。根据测试者可以看出,该货币对的报价从2011.01.0301:00:00开始,而欧元兑美元的报价也是从2011.01.0300:00:00开始的,有什么方法可以找出报价开始的时间来避免这种错误吗? 交易和报价会议将无助于解决问题? 1...436437438439440441442443444445446447448449450...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
结果。
要么是我做错了(请纠正),要么是MetaDriver 在理论上犯了错误(设计算法时)。
:)
好吧,考虑到算法 "设计 "花了大约3分钟(还有7分钟的实施),我做得很好:)目的是展示工作思路和澄清问题陈述。
而这一切都变成了有用的东西--开发人员有一个真正的机会来改进MathFloor()函数--显然它没有完全干净地实现。
最后,他们不得不对其进行修补。这很有趣。经过近一个小时的实验,我才设法得到一个稳定的函数(我是指CountSignedDigits(double x))。
即使现在我也不确定它在所有的输入值下都能正常工作。 我没有开发自动压力测试,我做了一个手动测试。 请测试一下。
我期望在浮点后稳定运行到10位小数。
附上压力测试。//我没有从代码中删除一些中间的实现方式。我在评论中留下了它,供你尝试/思考。包括开发商。1.你不需要为很多东西定义挖掘,只要把它规范化为正确的步骤即可。
2.即使在发送交易请求 时,手数变量中有一些垃圾(在小数位上),也应该被终端本身丢弃掉。
至少,在使用这种结构的几年中,我没有遇到任何问题。
4.如果你想保险,你可以把它规范化到小数点后8位(留有余地)--如果 "正确 "规范化后有垃圾,它将会更远。
第一个想法是正确的,其他的想法是可疑的。:)
该实施方案 在实践中 是可行的,但对于 "问题启动器"(c)所定义的人工条件来说,是不准确的。对于离散的步骤产生的不是相对于lot_min,而是相对于零。:)
然而,如果你注意到这一点,就很容易解决。
// 请不要把所有这些珍珠看得太重。澄清纯粹是理论上的,用于大脑训练,因为在实践中,我从未见过lot_step等于,比如0.0231....。
;)
变体是正确的。在我的NL()中,正确地用lot_min 来说明。
我的变体也包括在内。请注意,对于一些工具来说,价格变化的步骤大于点。
如果我们把步骤 不是从零开始,而是从最小批量开始作为一个公理,那么正确的算法是如下。
在Composter版本中,步骤从零开始。这在我看来是不对的。
在MetaDriver的变体中,代码跳过一个负值。=Р
...
在MetaDriver的变体中,代码跳过一个负值。=Р
:)) .....哦,是这样的!你根本不会工作!;-R;-b;-R
好吧,如果有的话,最短的,同时也是 "有点准确 "的变体是这样的。
这还没有检查lot_step、lot_min和 lot_max 的无效性和消极性!!......
:))))
呃...打了个激灵。:))最后一行是在一个论坛帖子中手工更正的,所以请原谅我。=)
顺便说一下,你的代码也没有编译(我忘了在最后一行加一个结尾括号)。:-Р
此外,它的速度要慢2-3倍(现在我已经用脚本检查过了),但检查的质量是一样的。:-Р
总之,只要没有合适的代码来确定重要的整数,我就接受Composter的建议:将体积归一到小数点后8位。
希望不会有什么隐患。
感谢大家的帮助。
你们很有趣,我明白了。
在你的第一篇文章中给了NL()什么你只到了两页之后;)
还有一个问题要问大师们。当我测试多币种的时候,我得到了错误(截图附后)。
我正试图进行交易操作,但我得到的答案是:没有价格。根据测试仪可以看出,该货币对的报价从2011.01.0301:00:00开始,而欧元兑美元的报价也是从2011.01.0300:00:00开始的,有什么方法可以找出报价开始的时间来绕过这个错误?
还有一个问题要问大师们。当我测试多币种的时候,我得到了错误(截图附后)。
我正试图进行交易操作,但我得到的答案是:没有价格。根据测试者可以看出,该货币对的报价从2011.01.0301:00:00开始,而欧元兑美元的报价也是从2011.01.0300:00:00开始的,有什么方法可以找出报价开始的时间来避免这种错误吗?