Comunidade de Especialistas - página 4

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

3 pessoas estavam observando =))) Renat veio e apenas apontou seu dedo para o erro =)))))
Vou verificar agora, é claro, mas esse é provavelmente o problema... Eu não normalizei o "bid - TrailingStop * point", e esta mesma construção está envolvida na modificação da ordem...
Não estamos atentos, cavalheiros ;)


Portanto, várias pessoas lhe ofereceram esta variante do problema. Até eu escrevi que a licitação pode ter 5 casas decimais. A princípio pensei que não era possível, mas depois lembrei que as citações são feitas por um autômato que provavelmente pega citações de vários datafeeds e as calcula usando algum tipo de algoritmo.
 
Até eu escrevi que a licitação pode ter 5 casas decimais. No início pensei que isso era impossível

Bid/Ask têm uma precisão de símbolo padrão inequívoca. Outra coisa é que ao invés de 1.6666 você pode ver 1.6665999 (devido a erro de ponto flutuante).

Quero observar: existem problemas para comparar estes números(tipo duplo) em _todos_ os idiomas e são uma conseqüência da precisão básica limitada deste tipo de aritmética. Conseqüentemente, não se deve culpar ninguém, mas estar ciente do problema e escrever código protegido.
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

Licitações/Ask são claramente de precisão de caráter padrão. Outra coisa é que ao invés de 1.6666 pode-se ver 1.6665999 (devido às peculiaridades do erro de ponto flutuante).

Quero observar: existem problemas para comparar estes números (tipo duplo) em _todos_ os idiomas e são uma conseqüência da precisão básica limitada deste tipo de aritmética. De forma correspondente, você não deve culpar ninguém, mas estar ciente do problema e escrever um código seguro.


Portanto, não estou acusando ninguém. Eu não pedi nada ao komposter - em que a moeda não funcionava corretamente. Lembro com certeza que em MT3 você pode ver 3 casas decimais em iene. Pelo menos, eu já vi isso mais de uma vez.
 
3 pessoas estavam observando =) Renat veio e apenas apontou o dedo para o erro =)))<br/ translate="no"> agora vou verificar, é claro, mas o mais provável é que seja este o caso... Eu não normalizei o "bid - TrailingStop * point", e esta mesma construção está envolvida na modificação da ordem...
não estamos atentos, cavalheiros ;)

normalização não ajudou =(
mais precisamente - erros de rastreio (euro - posição de compra):
03:41
12:07
12:11
14:31
14:33
14:36
14:39
14:44
14:46
14:47
14:48
(horário do servidor)
 
Desculpe, eu quis dizer o padrão NormalizeDouble.

Renat, como devo proceder?
No momento existem 3 opções:
1. if ( ordertoploss < ( bid - TrailingStop * point ) ) substituído por if ( TrailingStop < ( bid -ordertoploss) / point )
2. Comparar int, não duplo, usando as funções Begun
3. Mudar stop advance ( não todo ponto, mas após n spreads)
e suas combinações, é claro.

Como o software é bastante responsável, eu gostaria de obter (! não uma garantia!) recomendações para escrever...
 
<br / translate="no"> a normalização não ajudou =(


Tente, ao invés disso:
if (orderstoploss < ( bid - TrailingStop * point ))


escrever:

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



Haverá erros também?

 
bem, se " + Ponto" eu não sei... mas na verdade eu tenho a mesma coisa agora...
É claro que você pode fazer um backlash, mas não é sério.... E se eu tiver que fazer um backlash de 10-20 pips, "por confiabilidade", sim, em M30, apenas um conto de fadas =)
 
Renat, como proceder de qualquer maneira?

Por favor, verifique novamente seu código, simplifique-o, insira mensagens de debug.
 
Por favor, verifique novamente seu código, simplifique-o, insira mensagens de debug.


Para ser honesto, não sei como simplificá-lo...
Mas você pode verificá-lo, é claro. Aqui está o código como é usado agora (em partes):

verifique os parâmetros de entrada e selecione a ordem desejada. Se ocorrer um erro, nós simplesmente saímos, ou seja, a ordem não será modificada.
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);
	}



Salve todos os dados do pedido em variáveis e os normalize:

	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;




esta é a cor e a "gentileza" do tronco.

	string _OrderType_str = _OrderType_str ( _OrderType );
	if ( _Color <= 0 )
	{
		_Color = ordersellcolor;
		if ( _OrderType == OP_BUY || _OrderType == OP_BUYLIMIT || _OrderType == OP_BUYSTOP )
		{ _Color = orderbuycolor; }
	}



agora, para uma posição longa, definir um novo nível SL, normalizá-lo e compará-lo com o antigo (somente se a posição for lucrativa)

	if ( _OrderType == OP_BUY )
	{
		NewStopLoss = NormalizeDouble( bid - TrailingStop * point, digits );
		if ( ( bid - orderopenprice ) > 0 )
  		{
			if ( orderstoploss <= 0 || orderstoploss < NewStopLoss )//TrailingStop < ( bid - orderstoploss ) / point )
			{


despejá-lo no tronco

				_info1 ( "Trailing Stop (" + TrailingStop + " points) для позиции № " + _OrderTicket + ", " + _OrderType_str + "..." );
				_info2 ( "New Stop Loss = " + DoubleToStr( NewStopLoss, digits ) );
				_info3 ( "" );
				_info4 ( "" );



uma tripla tentativa de modificar o pedido após uma pausa de 10 segundos (o pedido é destacado a cada vez)

				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 );


e somente se ordermodify <= 0 um código de erro for enviado

					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);
				}


se depois de 3 tentativas a ordem não for modificada, saímos (-1)

//				Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-1);" );
				return(-1);
			}
  		}
  	}


o mesmo para as posições de venda

 	if ( _OrderType == OP_SELL )
	{
	}


e finalmente, se não houver necessidade de modificar a parada, sair(0)

//Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(0);" );
return(0);
}





don't know....

 
<br / translate="no"> compreensivelmente, é possível fazer um backlash, mas não é sério.... E se tivermos que fazer um backlash de 10-20 pips, "por confiabilidade", sim em M30, apenas um conto de fadas =)


O que isso tem a ver com o assunto? O "+Point" resolve o problema de arredondar o último dígito significativo do preço. Não estamos falando de 2, 3, e ainda mais de 10-20 pips.