Comunidad de expertos - página 4

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

3 personas estaban mirando =)) Renat vino y sólo señaló el error con el dedo =)))
Lo comprobaré ahora, por supuesto, pero probablemente ese sea el problema... No he normalizado "bid - TrailingStop * point", y esta misma construcción está implicada en la modificación de la orden...
No estamos atentos, señores ;)


Así que varias personas le han ofrecido esta variante del problema. Incluso yo escribí que la oferta puede tener 5 decimales. Al principio pensé que no era posible, pero luego recordé que las cotizaciones las hace un autómata que probablemente toma las cotizaciones de varios datafeeds y las promedia usando algún tipo de algoritmo.
 
Incluso yo escribí que la oferta puede tener 5 decimales. Al principio pensé que era imposible

Bid/Ask tienen una precisión de símbolos inequívocamente estándar. Otra cosa es que en lugar de 1,6666 puede ver 1,6665999 (debido a un error de punto flotante).

Quiero señalar: los problemas de comparación de estos números(tipo double) existen en _todos_ los lenguajes y son consecuencia de la limitada precisión básica de este tipo de aritmética. En consecuencia, no hay que culpar a nadie, sino ser consciente del problema y escribir código protegido.
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

La oferta y la demanda son claramente de una precisión de carácter estándar. Otra cosa es que en lugar de 1,6666 se vea 1,6665999 (debido a las peculiaridades del error de punto flotante).

Quiero señalar: los problemas de comparación de estos números (tipo double) existen en _todos_ los lenguajes y son consecuencia de la limitada precisión básica de este tipo de aritmética. En consecuencia, no hay que culpar a nadie, sino ser consciente del problema y escribir código seguro.


Así que no estoy acusando a nadie. No le pedí a komposter por nada - en el cual el arrastre de la moneda no funcionó correctamente. Recuerdo con seguridad que en MT3 se pueden ver 3 decimales en Yen. Al menos, yo lo he visto más de una vez.
 
3 personas estaban mirando =) Renat vino y acaba de señalar con el dedo el error =)))<br/ translate="no"> ahora voy a comprobar, por supuesto, pero lo más probable es que este es el caso... No he normalizado "bid - TrailingStop * point", y esta misma construcción está implicada en la modificación de la orden...
no estamos atentos, señores ;)

la normalización no ayudó =(
más precisamente - errores de arrastre (euro - posición de compra):
03:41
12:07
12:11
14:31
14:33
14:36
14:39
14:44
14:46
14:47
14:48
(tiempo del servidor)
 
Perdón, me refería a la norma NormalizeDouble.

Renat, ¿cómo debo proceder?
En este momento hay 3 opciones:
1. si ( ordertoploss < ( bid - TrailingStop * point ) ) sustituido por if ( TrailingStop < ( bid -orderstoploss) / point )
2. Comparar int, no double, usando las funciones Begun
3. Cambiar el avance del stop ( no cada punto, sino después de n spreads)
y sus combinaciones, por supuesto.

Como el software es bastante responsable, me gustaría obtener (! no es una garantía!) recomendaciones para escribir...
 
<br / translate="no"> la normalización no ayudó =(


Inténtalo en su lugar:
if (orderstoploss < ( bid - TrailingStop * point ))


escribir:

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



¿Habrá también errores?

 
bueno, si " + Punto" no se... pero en realidad tengo lo mismo ahora...
Está claro que se puede hacer un contragolpe, pero no es serio.... Y si tengo que hacer un contragolpe de 10-20 pips, "por fiabilidad", sí, en M30, sólo un cuento =)
 
Renat, ¿cómo proceder de todos modos?

Por favor, vuelva a revisar su código, simplifíquelo, inserte mensajes de depuración.
 
Por favor, vuelva a revisar su código, simplifíquelo, inserte mensajes de depuración.


Para ser sincero, no sé cómo simplificarlo...
Pero puedes comprobarlo, por supuesto. Este es el código tal y como se utiliza ahora (por partes):

comprueba los parámetros de entrada y selecciona el orden requerido. Si se produce un error, simplemente salimos, es decir, la orden no se modifica...
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);
	}



Guarde todos los datos del pedido en variables y normalícelos:

	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;




este es el color y la "belleza" del tronco...

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



ahora, para una posición larga, defina un nuevo nivel de SL, normalícelo y compárelo con el anterior (sólo si la posición es rentable)

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


volcarlo en el registro

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



un triple intento de modificar la orden tras una pausa de 10 segundos (la orden se resalta 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 );


y sólo si ordermodify <= 0 se envía un código de error

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


si después de 3 intentos no se modifica la orden, salimos (-1)

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


y lo mismo para las posiciones de venta

 	if ( _OrderType == OP_SELL )
	{
	}


y finalmente, si no hay necesidad de modificar la parada, exit(0)

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





no sé....

 
<br / translate="no"> comprensiblemente, es posible hacer un contragolpe, pero no es serio.... Y si hay que hacer un contragolpe de 10-20 pips, "por fiabilidad", sí en M30, sólo un cuento =)


¿Qué tiene esto que ver? "+Punto" resuelve el problema del redondeo del último dígito significativo del precio. No estamos hablando de 2, 3, y mucho más de 10-20 pips.