Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
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.
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.
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)
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...
Inténtalo en su lugar:
escribir:
¿Habrá también errores?
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 =)
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:
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)
y lo mismo para las posiciones de venta
if ( _OrderType == OP_SELL ) { }y finalmente, si no hay necesidad de modificar la parada, exit(0)
no sé....
¿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.