Error de validación al lanzar el robot de trading al mercado. - página 6

 
Andrey Kaunov:

Crees que no lo compruebo. El tamaño del lote se comprueba en una función independiente

Los límites no son necesarios aquí, porque el Stop Loss y el Take Profit son iguales a cero en la apertura de la operación.RefreshRates() actualiza los datos en el cálculo del lote. Por supuesto, no se comprueba la conexión, etc. antes de cada entrada, pero eso no es lo importante. Si OrderSend enviara una solicitud, habría un error específico: 130, 131, etc. Pero lo que tengo es.

No se trata de enviar una orden de apertura en absoluto. Incluso en la última prueba, cuando establezco una posición de control en la función OnInit().


Es posible. Pero ya he comprobado todo dos veces. No sé dónde ir ahora.

En la función de normalización de lotes, se redondea el lote después de comprobarlo al valor máximo/mínimo.
 
Artyom Trishkin:
En la función de normalización del lote, se redondea el lote después de comprobarlo al valor máximo/mínimo.

Bueno, sí, lo sé.

MathRound();
P.D. Creo que hay que cavar desde los parámetros de entrada, porque resulta que se pasa. Haga una comprobación "a prueba de tontos" de cada parámetro.
 
No me refiero a los registros de prueba del validador. Pero al menos los parámetros que NO están validados podrían ser posibles de enviar. No hay nada que coger para arreglar el código. Entiendo que la variabilidad de la selección de los parámetros de la prueba puede ser infinita. Puedes poner una variable de tipo int a +50000 o -45000. Pero no puedo limitar simplemente algunos parámetros de entrada a un rango de valores. Será diferente para las distintas herramientas.
 
Andrey Kaunov:
Ni siquiera estoy hablando de los registros de prueba del validador. Pero al menos los parámetros que NO están validados podrían ser posibles de enviar. No hay nada que coger para arreglar el código. Entiendo que la variabilidad de la elección de los parámetros de las pruebas puede ser infinita. Puedes poner una variable de tipo int a +50000 o -45000. Pero no puedo limitar simplemente algunos parámetros de entrada a un rango de valores porque será diferente para diferentes instrumentos.

Hay que asegurarse de que el lote comercial es válido en todos los casos. No en vano he señalado que cambias el lote en tu código después de que se haya comprobado que el rango de tamaño es válido.

Y es la comprobación de parámetros de entrada absolutamente estúpidos la que debe hacerse.

 

No hay ningún problema con el lote. Se comprueba si se trata de un máximo/minuto. Antes de redondear se divide por el paso, luego el entero redondeado se multiplica por el paso de nuevo. Obtenemos un lote perfectamente correcto.

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin()*0.95;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*paso(0,01)=0,57

A continuación, comprueba si hay suficiente margen libre para abrir. El validador no maldice en absoluto. No ve las funciones comerciales, aparentemente, debido a los parámetros de entrada incorrectos. ¡El Asesor Experto simplemente no hace operaciones en absoluto con una determinada combinación de ellas! No es que tenga un martin no acondicionado, o un gridlocker que se abre en cada vela. ¿Cómo le explico al validador que el EA lógicamente no hace operaciones con ciertos parámetros?

 
Andrey Kaunov:

No hay ningún problema con el lote. Se comprueba si se trata de un máximo/minuto. Antes de redondear se divide por el paso, luego el entero redondeado se multiplica por el paso de nuevo. Obtenemos un lote perfectamente correcto.

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*paso(0,01)=0,57

A continuación, se comprueba si hay suficiente margen libre para abrir. El validador no maldice en absoluto. No ve las funciones comerciales, aparentemente, debido a los parámetros de entrada incorrectos. ¡El Asesor Experto simplemente no hace operaciones en absoluto con una determinada combinación de ellas! No es que tenga un martin no acondicionado, o un gridlocker que se abre en cada vela. ¿Cómo puedo explicar al validador que el EA lógicamente no realiza operaciones con ciertos parámetros?

No explique, pero haga que el EA corrija los parámetros de entrada erróneos. Preferiblemente con un mensaje al diario sobre su valor no válido y la corrección al valor válido.

Y, si por alguna razón se quiere responsabilizar al usuario de la introducción de parámetros incorrectos en el mundo real, el usuario debe ser notificado de los parámetros incorrectos.
Pero para el probador, también necesitan ser corregidos - para que el EA opere.

 

Entonces, cómo se pueden ajustar si hay unos parámetros para el EURUSD y otros para el Oro, por ejemplo. Ahora mismo los ajustes por defecto son más o menos tolerables para los principales pares, pero para el oro no funcionarán en absoluto. No habrá intercambios allí. Para eso existen los parámetros (según tengo entendido), para adaptarlos a cada instrumento. Si todo fuera tan fácil, habría incrustado todos los parámetros en el Asesor Experto y no habría enviado nada a los externos.

Otro error del validador es que no ve otros plazos en absoluto. Lo he obviado, pero en detrimento del algoritmo en cierta medida. El Asesor Experto toma datos de otros marcos temporales, desde semanal, D1, H4, etc. hasta M1. Pero los datos son nulos, como descubrí a través de numerosos experimentos. No hay nada que podamos hacer al respecto, sólo podemos trabajar en torno a ello. ¿Por qué tenemos que modificar el Asesor Experto en detrimento del algoritmo? ¿No es al revés? El validador debe adaptarse a las pruebas. De lo contrario, la comprobación de un EA que funciona perfectamente se convierte en una especie de trabajo duro.

 
Andrey Kaunov:
Entonces, cómo se pueden ajustar si hay unos parámetros para el EURUSD y otros para el Oro, por ejemplo. Ahora mismo los ajustes por defecto son más o menos tolerables para los pares principales, pero para el Oro no funcionarán en absoluto. No habrá intercambios allí. Para eso existen los parámetros (según tengo entendido), para adaptarlos a cada instrumento. Si todo fuera tan sencillo, habría incrustado todos los parámetros en el Asesor Experto y no habría enviado nada a los externos.
Has puesto una división por 0 justo antes de OrderSend - y ha habido un error de este tipo. Así, llega a OrderSend, pero no se abre. Es decir, lotes/margen/límites/precio, algo de ellos no se cuenta
 
Maxim Kuznetsov:
Ya pusiste la división por 0 justo antes de OrderSend - y hubo tal error. Así que llega a OrderSend, pero no se abre. Así que lotes/margen/límites/precio, algunos de ellos no se tienen en cuenta.

Maxim, si alguna de estas cosas no se tiene en cuenta, el validador dará un error muy claro : 130, 131, 134, 145, etc. No es el caso aquí.

P.D. Créeme, he enviado más de cien validaciones en 4 días, y he probado un montón de opciones.

 

Sí, llega a la división por 0 (por lo tanto, OrderSend) inmediatamente. Y genera un error.

Pero si envío para comprobar el Asesor Experto sin la división por 0 en el código, de alguna manera mágicamente establece parámetros que no abren las operaciones en absoluto durante el período especificado y devuelve un error. Esta es mi versión de lo que está ocurriendo, pero aparentemente no está lejos de la verdad.