专家社区 - 页 4 1234567891011 新评论 Forex Trader 2005.04.19 10:32 #31 Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене? 3个人在看=))雷纳特来了,只是用手指了指错误=)))。 当然,我现在会检查,但这可能是问题所在...我还没有把 "bid - TrailingStop * point "规范化,而这一结构恰恰涉及到订单修改... 我们并不殷勤,先生们;) 所以有几个人向你提供了这个问题的变体。甚至我还写道,投标可能有5位小数。我起初认为这是不可能的,但后来我想起来,这些报价是由一个自动机制作的,它可能从几个数据源中获取报价,并使用某种算法对其进行平均。 MetaQuotes 2005.04.19 12:34 #32 甚至我还写道,投标可以有5位小数。起初我认为这是不可能的 Bid/Ask有明确的标准符号精度。另一件事是,你可能看到的不是1.6666,而是1.6665999(由于浮点误差)。 我想指出:比较这些数字(double类型)的问题存在于_所有_语言中,是这种类型的算术的有限精度的结果。因此,人们不应该责怪任何人,而应该意识到这个问题,并编写受保护的代码。 Forex Trader 2005.04.19 12:44 #33 Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно 出价/询问显然是标准字符的准确性。另一件事是,人们可能看到的不是1.6666,而是1.6665999(由于浮点误差的特殊性)。 我想指出:比较这些数字(double类型)的问题存在于_所有_语言中,是这种类型的算术的基本有限精度的结果。相应地,你不应该责怪任何人,而应该意识到这个问题并编写安全的代码。 所以我没有指责任何人。我没有白问komposter--在其上,货币拖尾没有正常工作。我记得很清楚,在MT3中你可以看到日元的小数点后3位。至少,我不止一次看到过这种情况。 Forex Trader 2005.04.19 19:31 #34 3个人在看=)Renat来了,只是用手指着错误=)))<br/ translate="no">现在我将检查,当然,但最有可能是这种情况。我没有将 "bid - TrailingStop * point "规范化,而这一结构也参与了订单的修改。 我们并不用心,先生们;) 归一化没有帮助 =( 更准确地说 - 尾随误差(欧元 - 买入位置): 03:41 12:07 12:11 14:31 14:33 14:36 14:39 14:44 14:46 14:47 14:48 (服务器时间)。 Forex Trader 2005.04.19 19:45 #35 对不起,我是指标准的NormalizeDouble。 雷纳特,我应该怎么做? 目前有3个选项: 1. if ( orderstoploss < ( bid - TrailingStop *point))改为 if ( TrailingStop < ( bid -orderstoploss) / point ) 2.使用Begun函数比较int,而不是double 3.改变止损提前量(不是每个点,而是在n个点差之后) ,当然还有它们的组合。 由于该软件相当负责任,我想得到(!不是保证!)关于写... Forex Trader 2005.04.19 20:00 #36 <br / translate="no"> 正常化没有帮助 =( 试试吧。 if (orderstoploss < ( bid - TrailingStop * point )) 写。 double newSL = NormalizeDouble(bid - TrailingStop * Point); if (orderstoploss + Point < newSL) orderstoploss = newSL;//OrderModify(... newSL...) 也会有错误吗? Forex Trader 2005.04.19 21:51 #37 好吧,如果 "+点"我不知道......但实际上我现在也有同样的事情...... 很明显,你可以做出反击,但这并不严重....。如果我必须做10-20个点的反击,"为了可靠性",是的,在M30上,只是一个童话故事=) MetaQuotes 2005.04.19 23:55 #38 雷纳特,到底该如何进行? 请再次重新检查你的代码,简化它,插入调试信息。 Forex Trader 2005.04.20 01:53 #39 请再次重新检查你的代码,简化它,插入调试信息。 说实话,我不知道如何简化它... 但你当然可以检查一下。以下是现在使用的代码(部分): 检查传入的参数并选择所需的顺序。如果发生错误,我们就直接退出,也就是说,订单不会被修改...int _TrailingStop ( int _OrderTicket, int TrailingStop, color _Color = CLR_NONE ) { // Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - loaded..." ); if ( TrailingStop <= 0 ) { // Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(0);" ); return(0); } if ( OrderSelect( _OrderTicket, SELECT_BY_TICKET ) == false ) { // Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-2);" ); return(-2); } 将所有订单数据保存为变量,并对其进行归一化处理。 string _Symbol = OrderSymbol(); int _OrderType = OrderType(); double point = MarketInfo ( _Symbol, MODE_POINT ); int digits = MarketInfo( _Symbol, MODE_DIGITS ); double bid = NormalizeDouble( MarketInfo ( _Symbol, MODE_BID ), digits ); double ask = NormalizeDouble( MarketInfo ( _Symbol, MODE_ASK ), digits ); double orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits ); double orderstoploss = NormalizeDouble ( OrderStopLoss(), digits ); double ordertakeprofit = NormalizeDouble ( OrderTakeProfit(), digits ); datetime orderexpiration = OrderExpiration(); double NewStopLoss; 这是原木的颜色和 "漂亮 "程度... string _OrderType_str = _OrderType_str ( _OrderType ); if ( _Color <= 0 ) { _Color = ordersellcolor; if ( _OrderType == OP_BUY || _OrderType == OP_BUYLIMIT || _OrderType == OP_BUYSTOP ) { _Color = orderbuycolor; } } 现在,对于一个多头头寸,定义一个新的SL水平,将其规范化,并与旧的SL水平进行比较(只有在该头寸是盈利的情况下)。 if ( _OrderType == OP_BUY ) { NewStopLoss = NormalizeDouble( bid - TrailingStop * point, digits ); if ( ( bid - orderopenprice ) > 0 ) { if ( orderstoploss <= 0 || orderstoploss < NewStopLoss )//TrailingStop < ( bid - orderstoploss ) / point ) { 倾入日志 _info1 ( "Trailing Stop (" + TrailingStop + " points) для позиции № " + _OrderTicket + ", " + _OrderType_str + "..." ); _info2 ( "New Stop Loss = " + DoubleToStr( NewStopLoss, digits ) ); _info3 ( "" ); _info4 ( "" ); 暂停10秒后,三度尝试修改订单(每次都突出显示订单)。 for ( int x = 0; x < 3; x ++ ) { while ( LocalTime() - GlobalVariableGet ( "LastTradeTime" ) < 10 ) { Sleep(1000); } if ( OrderSelect( _OrderTicket, SELECT_BY_TICKET ) == false ) { // Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-2);" ); return(-2); } int ordermodify = OrderModify( _OrderTicket, orderopenprice, NewStopLoss, ordertakeprofit, orderexpiration, _Color ); 只有当 ordermodify <= 0 时,才会发送错误代码 if ( ordermodify > 0 ) { _info3 ( "Успешно..." ); GlobalVariableSet ( "LastTradeTime", LocalTime() ); // Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(1);" ); return(1); } int error_code = GetLastError(); _info1 ( "Ошибка Trailing Stop!!!", 1 ); Processing_Error ( error_code ); Sleep(10000); } 如果经过3次尝试,订单没有被修改,我们就退出(-1)。// Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-1);" ); return(-1); } } } 然后,卖出头寸的情况也一样 if ( _OrderType == OP_SELL ) { } 最后,如果不需要修改停止,则退出(0)。//Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(0);" ); return(0); } 不知道.... Forex Trader 2005.04.20 11:56 #40 <br / translate="no">可以理解的是,有可能做出反击,但这并不严重....。如果我们必须做出10-20个点的反击,"为了可靠性",是的,在M30上,只是一个童话故事=) 这跟它有什么关系?"+点 "解决了对价格的最后一位有效数字进行四舍五入的问题。我们不是在谈论2,3,以及所有关于10-20点的问题。 1234567891011 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
3个人在看=))雷纳特来了,只是用手指了指错误=)))。
当然,我现在会检查,但这可能是问题所在...我还没有把 "bid - TrailingStop * point "规范化,而这一结构恰恰涉及到订单修改...
我们并不殷勤,先生们;)
所以有几个人向你提供了这个问题的变体。甚至我还写道,投标可能有5位小数。我起初认为这是不可能的,但后来我想起来,这些报价是由一个自动机制作的,它可能从几个数据源中获取报价,并使用某种算法对其进行平均。
Bid/Ask有明确的标准符号精度。另一件事是,你可能看到的不是1.6666,而是1.6665999(由于浮点误差)。
我想指出:比较这些数字(double类型)的问题存在于_所有_语言中,是这种类型的算术的有限精度的结果。因此,人们不应该责怪任何人,而应该意识到这个问题,并编写受保护的代码。
出价/询问显然是标准字符的准确性。另一件事是,人们可能看到的不是1.6666,而是1.6665999(由于浮点误差的特殊性)。
我想指出:比较这些数字(double类型)的问题存在于_所有_语言中,是这种类型的算术的基本有限精度的结果。相应地,你不应该责怪任何人,而应该意识到这个问题并编写安全的代码。
所以我没有指责任何人。我没有白问komposter--在其上,货币拖尾没有正常工作。我记得很清楚,在MT3中你可以看到日元的小数点后3位。至少,我不止一次看到过这种情况。
我们并不用心,先生们;)
归一化没有帮助 =( 更准确地说 - 尾随误差(欧元 - 买入位置): 03:41 12:07 12:11 14:31 14:33 14:36 14:39 14:44 14:46 14:47 14:48
(服务器时间)。
雷纳特,我应该怎么做?
目前有3个选项:
1. if ( orderstoploss < ( bid - TrailingStop *point))改为 if ( TrailingStop < ( bid -orderstoploss) / point )
2.使用Begun函数比较int,而不是double
3.改变止损提前量(不是每个点,而是在n个点差之后)
,当然还有它们的组合。
由于该软件相当负责任,我想得到(!不是保证!)关于写...
试试吧。
写。
也会有错误吗?
很明显,你可以做出反击,但这并不严重....。如果我必须做10-20个点的反击,"为了可靠性",是的,在M30上,只是一个童话故事=)
请再次重新检查你的代码,简化它,插入调试信息。
说实话,我不知道如何简化它...
但你当然可以检查一下。以下是现在使用的代码(部分):
检查传入的参数并选择所需的顺序。如果发生错误,我们就直接退出,也就是说,订单不会被修改...
将所有订单数据保存为变量,并对其进行归一化处理。
这是原木的颜色和 "漂亮 "程度...
现在,对于一个多头头寸,定义一个新的SL水平,将其规范化,并与旧的SL水平进行比较(只有在该头寸是盈利的情况下)。
倾入日志
暂停10秒后,三度尝试修改订单(每次都突出显示订单)。
只有当 ordermodify <= 0 时,才会发送错误代码
如果经过3次尝试,订单没有被修改,我们就退出(-1)。
然后,卖出头寸的情况也一样
最后,如果不需要修改停止,则退出(0)。
不知道....
这跟它有什么关系?"+点 "解决了对价格的最后一位有效数字进行四舍五入的问题。我们不是在谈论2,3,以及所有关于10-20点的问题。