专家社区 - 页 4

 
Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?

3个人在看=))雷纳特来了,只是用手指了指错误=)))。
当然,我现在会检查,但这可能是问题所在...我还没有把 "bid - TrailingStop * point "规范化,而这一结构恰恰涉及到订单修改...
我们并不殷勤,先生们;)


所以有几个人向你提供了这个问题的变体。甚至我还写道,投标可能有5位小数。我起初认为这是不可能的,但后来我想起来,这些报价是由一个自动机制作的,它可能从几个数据源中获取报价,并使用某种算法对其进行平均。
 
甚至我还写道,投标可以有5位小数。起
我认为这是不可能的

Bid/Ask有明确的标准符号精度。另一件事是,你可能看到的不是1.6666,而是1.6665999(由于浮点误差)。

我想指出:比较这些数字(double类型)的问题存在于_所有_语言中,是这种类型的算术的有限精度的结果。因此,人们不应该责怪任何人,而应该意识到这个问题,并编写受保护的代码。
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

出价/询问显然是标准字符的准确性。另一件事是,人们可能看到的不是1.6666,而是1.6665999(由于浮点误差的特殊性)。

我想指出:比较这些数字(double类型)的问题存在于_所有_语言中,是这种类型的算术的基本有限精度的结果。相应地,你不应该责怪任何人,而应该意识到这个问题并编写安全的代码。


所以我没有指责任何人。我没有白问komposter--在其上,货币拖尾没有正常工作。我记得很清楚,在MT3中你可以看到日元的小数点后3位。至少,我不止一次看到过这种情况。
 
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












(服务器时间)。
 
对不起,我是指标准的NormalizeDouble。

雷纳特,我应该怎么做?
目前有3个选项:
1. if ( orderstoploss < ( bid - TrailingStop *point))改为 if ( TrailingStop < ( bid -orderstoploss) / point )
2.使用Begun函数比较int,而不是double
3.改变止损提前量(不是每个点,而是在n个点差之后)
,当然还有它们的组合。

由于该软件相当负责任,我想得到(!不是保证!)关于写...
 
<br / translate="no"> 正常化没有帮助 =(


试试吧。
if (orderstoploss < ( bid - TrailingStop * point ))


写。

double newSL = NormalizeDouble(bid - TrailingStop * Point);
if (orderstoploss + Point < newSL)
   orderstoploss  = newSL;//OrderModify(... newSL...)



也会有错误吗?

 
好吧,如果 "+"我不知道......但实际上我现在也有同样的事情......
很明显,你可以做出反击,但这并不严重....。如果我必须做10-20个点的反击,"为了可靠性",是的,在M30上,只是一个童话故事=)
 
雷纳特,到底该如何进行?

请再次重新检查你的代码,简化它,插入调试信息。
 
请再次重新检查你的代码,简化它,插入调试信息。


说实话,我不知道如何简化它...
但你当然可以检查一下。以下是现在使用的代码(部分):

检查传入的参数并选择所需的顺序。如果发生错误,我们就直接退出,也就是说,订单不会被修改...
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);
}





不知道....

 
<br / translate="no">可以理解的是,有可能做出反击,但这并不严重....。如果我们必须做出10-20个点的反击,"为了可靠性",是的,在M30上,只是一个童话故事=)


这跟它有什么关系?"+点 "解决了对价格的最后一位有效数字进行四舍五入的问题。我们不是在谈论2,3,以及所有关于10-20点的问题。