El error es que no hay operaciones comerciales - página 5

 
Alexey Viktorov:

No es porque lo haya recompilado, es porque las pruebas empezaron desde una fecha diferente. Y me he dado cuenta de este error, si pones algo que ya estaba, entonces la prueba no sucede, sino que inmediatamente da el resultado de la prueba anterior. Así que no se deje engañar por esas muletas. Intenta que sea normal. Si falta algo o los parámetros no son válidos, comunícalo a través de Print y todo será correcto.

Si sólo se debiera a una fecha diferente, entonces mis comprobaciones lo revelarían (falta de barras, etc.), pero el problema no es la fecha. Si no puedo reconstruir el error que encuentra la validación automática, entonces es más fácil para mí deslizar lo mismo y esperar que la venganza con los compradores encuentre el área del problema (si hay tal). Esta implementación de validaciones no me permite entender completamente dónde buscar el error. Y la impresión ya está metida por todos lados para mí.

Alexey Viktorov:

Y me he dado cuenta de que tal meneo, si pego que ya estaba, entonces la prueba no se produce e inmediatamente da el resultado de la prueba anterior.

Y para no obtener un resultado de la prueba anterior, debo cambiar algo, incluso añadir una cadena vacía (me refería a "recompilar").

 
Roman Gergert:

Finalmente me di cuenta, tal vez alguien puede ayudar, en general, el soviético sólo ha comprobado el lote mínimo cuando el MM se habilitó, y por lo que el conjunto duro lote = 0,01, así, en el depósito validador resulta ser $ 1 (encontrado esta información en uno de los temas), respectivamente, se utiliza el lote 0,001 (o así) para el comercio, y desde que siempre tenía en un lugar era un lote de 0,01, que era, por tanto, no hay suficiente dinero y el robot no el comercio)

Exactamente, Roman, el validador está probando con un depósito de 1 dólar.

Hay mucha función de normalización en el EA. Si devuelve 0, la operación ni siquiera intenta abrirse:

      if((Auto() && (b==0 || (b>0 && BuyPriceMin-Ask>(b==1?iPointOrderStep_1:iPointOrderStep_2)*Point()))) || buy) {
         BuyLot=buy && LotFromPanel()>0 ? LotFromPanel() : BuyLot;
         double norm_lot=NormalizeLots(_Symbol,BuyLot);
         if(norm_lot>0.0) {  
            int ticket=OrderSend(Symbol(),OP_BUY,norm_lot,NormalizeDouble(Ask,_Digits),30,0,0,
                        "NZT-48",iMagicNumber,0,clrGreen);
            if(ticket>0) {
                ObjectSetInteger(0,"V_5_buy",OBJPROP_STATE,false);
                buy=false;
            }
            else  
               Print("Order Send error #",GetLastError());
         } else Print("Not enough money for the minimum lot");   
      }

Pero no está claro entonces cómo la función de normalización de lotes de este EA envía un lote de 0,2 para abrir:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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;
   return(_lot);
}

Al fin y al cabo, si el lote 0,2 entra en verificación y el margen a juzgar por los registros es de 645, entonces esta parte de la expresión debería dar verdadero

if(is_margin && _lot*margin>free)  _lot=0.0;     //0.2*645>0.95

Y la función enviará 0,0, pero no 0,2. Sólo puede enviar 0,2 si

MarketInfo(symbol,MODE_MARGINREQUIRED);

devuelve 0 o un valor insignificante. No entiendo en absoluto cómo funciona este validador.

Estimados desarrolladores de MQL, por favor, envíennos los registros de prueba en lugar de informes de error de validación secos en tres líneas. Será mucho más fácil para nosotros, humildes programadores, entender los errores del código y corregirlos. Puedes enviarlo como archivo al correo electrónico, seguro que se te ocurre cómo)))

P.D. Situación curiosa. Por quinto día estoy tratando de poner en el mercado un Asesor Experto que funciona perfectamente en el tester y en el mercado real.
 
Andrey Kaunov:

Exactamente, Roman, el validador prueba con un depósito de 1 dólar.

Hay una función de normalización de lotes en el EA. Si devuelve 0, la operación ni siquiera intenta abrirse:

Pero no está claro entonces cómo la función de normalización de lotes de este EA envía un lote de 0,2 para abrir:

Al fin y al cabo, si el lote 0,2 entra en verificación y el margen a juzgar por los registros es de 645, entonces esta parte de la expresión debería dar verdadero

Y la función enviará 0,0, pero no 0,2. Sólo puede enviar 0,2 si

devuelve 0 o un valor insignificante. No entiendo en absoluto cómo funciona este validador.

Estimados desarrolladores de MQL, por favor, envíennos los registros de prueba en lugar de informes de error de validación secos en tres líneas. Será mucho más fácil para nosotros, humildes programadores, entender los errores del código y corregirlos. Puede enviarlos como archivo al correo electrónico, puede pensar en una manera :)))

P.D. Situación curiosa. Por quinto día estoy tratando de poner en el mercado un Asesor Experto que funciona perfectamente en el tester y en la vida real.

parece que tienes un apalancamiento diferente al del Mercado, quizás 1:500

intente llevar el cálculo del lote a 1k100 cambiando sólo una línea en el código:

margen = AccountLeverage()*MarketInfo(símbolo,MODE_MARGINREQUIRED)/100,0;

y el lote mínimo para el mercado es de 0,1 en mi opinión....
 

Vives en una especie de mundo propio y limitado. En un mundo normal, el lote mínimo puede ser muy diferente de 0,01

RECIPIENTE: lea y vuelva a leer el artículo "Qué controles deben pasar...".

Antes de enviar una orden de negociación, hay que comprobar si va a pasar, si hay suficiente margen ...


En general, el validador ha cumplido hasta ahora su principal cometido: cribar el código incompleto del Mercado.

 
Renat Akhtyamov:

parece que tienes un apalancamiento diferente al del mercado, quizás 1:500

intente llevar el cálculo del lote a 1k100 de apalancamiento cambiando sólo una línea en el código:

margen = AccountLeverage()*MarketInfo(símbolo,MODE_MARGINREQUIRED)/100,0;

Renat, gracias por el consejo, lo probaré.

Vladimir Karputov:

Vives en un mundo propio y limitado. En un mundo normal el lote mínimo puede ser muy diferente de 0,01

RECIPIENTE: lea y vuelva a leer el artículo "Qué controles deben pasar...".

Antes de enviar una orden de negociación, hay que comprobar si va a pasar, si hay suficiente margen ...


En general, el validador ha cumplido hasta ahora con su tarea principal: filtrar el código incompleto del mercado.

Vladimir, ¿puedes entender la pregunta de forma constructiva? ¿No reviso el lote por el margen y otras cosas?El artículo "Qué controles hay que pasar..." es ya como una biblia para mí. He publicado fragmentos de código más arriba. He cambiado el código según tus recomendaciones del artículo para que sea totalmente compatible:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

Pero sigo recibiendo "no hay intercambios":

Bueno, si la función siempre envía 0.0 lote y no permite abrir operaciones, la cambio para enviar el lote mínimo:

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, 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;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

Y tengo el historial de que los intercambios sí se producen (ver capturas de pantalla más abajo). Pero el lote mínimo por supuesto viene muy extraño, pero que venga. Pero las ofertas están ahí.

Es decir, en esta situación, muy extraño es validador, haciendo un lote mínimo 0,2 para un depósito de $ 1.


Naturalmente, ¡no habrá ningún trato! Y esto es con un código perfectamente adecuado. Por cierto, he eliminado todas las condiciones de los indicadores, etc. para probar. Las operaciones comienzan a abrirse tan pronto como se inicia el EA.

Vladimir Karputov:

...

Hasta ahora, el validador ha cumplido con su tarea principal: filtrar el código incompleto del mercado.

¿Qué hace el validador? No veo que haga otra cosa que reventar los sesos de los programadores.

Ten en cuenta que no te pido que cambies nada en el validador. Simplemente podemos ver los registros de las pruebas. Entenderemos entonces con qué parámetros se ejecutan las pruebas y en qué depósitos. A fin de cuentas, al menos podemos utilizar las impresiones para comprobar dónde está el error en el código y solucionarlo lo antes posible. No vamos a señalar con el dedo al cielo durante toda una semana, tratando sólo de localizar un error. No estamos trabajando unos contra otros, ¿verdad? Lo entiendo, estamos tratando de ganar algo juntos.

 
Andrey Kaunov:

...¡No es que estemos trabajando en contra de los demás! Lo entiendo, estamos tratando de ganar algo juntos.

Andrew, una vez me encontré con un servidor congelado durante el fin de semana.

lo que significa que simplemente no comería MarketInfo(...)

Apenas pude hacerla funcionar.

Así que, si entiendes que no puedes tragarte el Mercado, queda pensar cómo hacer que el validador no jure

Por ejemplo, pregunto: ¿qué apalancamiento?

Dice 0.

Agrego en el código - si es 0, entonces dice 100

Si la lógica es clara, funcionará y ¡buena suerte!

 

Ya veo, Renat, gracias.

Ya he hecho muchas muletillas, pero en algunos puntos estoy en un callejón sin salida. Y quiero que el código adecuado sea probado adecuadamente. Además, no es imposible encontrar un problema en ausencia de registros de pruebas, pero es muy laborioso.

Tal vez el validador también sería bueno para obtener una actualización. No soy el único que se encuentra con estos problemas.

 
Andrey Kaunov:

Ya veo, Renat, gracias.

Ya he hecho muchas muletillas, pero en algunos puntos estoy en un callejón sin salida. Y quiero que el código adecuado sea probado adecuadamente. Además, no es imposible encontrar un problema en ausencia de registros de pruebas, pero es muy laborioso.

Tal vez el validador también sería bueno para obtener una actualización. No soy el único que se encuentra con estos problemas.

Sí, no eres el único que se ha enfrentado a este problema, en el siguiente hilo hay otro que se ha enfrentado a este problema, ya sois dos.

Además, fíjate en la cantidad de EAs que se publican en el mercado cada día sin ningún problema, se llama "el nivel de profesionalidad".

 

Vitaly, si tú y otros "profesionales" conseguís pasar la convalidación a la primera, sólo puedo aplaudir. Pero hay mucho más que dos hilos sobre un problema similar. Además, no todo el mundo escribe, algunos sólo leen. Por cierto, el Asesor Experto no es mío. Lo preparo en el mercado para el cliente. Pero eso no anula los problemas descritos anteriormente. Si lees atentamente mi post, quizás como "profesional" puedas sugerir una solución al problema. Poner un post del tipo "Tú eres tonto y yo soy listo" no requiere muchos conocimientos.

Aquí hay otro problema para ti. Por qué habiendo añadido en el inicio de OnTick() la apertura en serie incondicional de 5 transacciones en 5 minutos con lote mínimo, el validador también me da un mensaje de"no hay operaciones de trading".

void OnTick() { 
   static int test_ticket[2]={0,0};
   if(test_ticket[1]<5 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend(_Symbol,OP_BUY,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),NormalizeDouble(Ask,_Digits),30,0.0,0.0,"NZT-48_test",33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
   }   
   if(OrderSelect(test_ticket[0],SELECT_BY_TICKET))
      if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
         if(OrderClose(test_ticket[0],NormalizeDouble(OrderLots(),2),NormalizeDouble(Bid,_Digits),30,clrNONE)) {
            printf("Test order closed, ticket #%d",test_ticket[0]);
            test_ticket[0]=0;
         }   
...
}
 
Andrey Kaunov:

Vitaly, si tú y otros "profesionales" conseguís pasar la convalidación a la primera, sólo puedo aplaudir. Pero hay mucho más que dos hilos sobre un problema similar. Además, no todo el mundo escribe, algunos sólo leen. Por cierto, el Asesor Experto no es mío. Lo preparo en el mercado para el cliente. Pero eso no anula los problemas descritos anteriormente. Si lees atentamente mi post, quizás como "profesional" puedas sugerir una solución al problema. Poner un post del tipo "Tú eres tonto y yo soy listo" no requiere muchos conocimientos.

Aquí hay otro problema para ti. ¿Por qué habiendo añadido en el inicio de OnTick() la apertura secuencial incondicional de 5 transacciones en 5 minutos con lote mínimo, el validador me da"no hay operaciones de trading" de la misma manera?

Y primero debería publicar la respuesta completa del validador aquí

¿Y qué le hace pensar que el validador fija los billetes según el principio que usted inventó?

para abrir 5 operaciones, hay que contar el número de operaciones abiertas, no el de entradas