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

 
Maxim Kuznetsov:

pensar en lo que sucederá en Stop Out. (ya tienes Margin Call, Steppe está más cerca que nunca)

su operación se cerrará forzosamente, pero usted ignora tal opción, y estará buscándola cada tick (en el historial, es largo) y enviando órdenes incorrectas.

Sólo para añadir para quien tenga "más de 10 años de programación MQL"

Si algo puede suceder, definitivamente sucederá.

El Stop Out y el Margin Call no son tan normales, pero es natural, y un EA debería estar preparado para ellos.

Las condiciones comerciales pueden cambiar, no son constantes. Los saltos de StopLevel e incluso los cambios de apalancamiento a veces.

El usuario puede establecer/cambiar fácilmente el Stop/Take o cerrar una posición, incluso involuntariamente - el Asesor Experto debe reaccionar a esto

Un usuario puede abrir/cerrar una orden con Magic (o accidentalmente poner Magic=0 y operar a mano) - ¿qué hará el robot?

El balance es depositado/retirado sin reiniciar el EA - es extremadamente importante que el robot sea capaz de hacer esto (hubo un tema recientemente - un hombre acaba de perder dinero)

Es posible que el terminal se reinicie y tarde en actualizarse, o que la conexión se pierda durante un tiempo considerable.

El validador sólo comprueba el 1-2% del "mínimo de candidatos" y la gente sigue quejándose...

 
Renat Akhtyamov:

parece haber sido escrito secuencialmente, pregunta - respuesta

todas las páginas del hilo son accesibles.

Renat, entiendo que cuente con garantías. No entiendo por qué.


Maxim Kuznetsov:

Sólo para añadir para todos los que tienen "más de 10 años de programación MQL".

Si algo puede suceder, definitivamente sucederá.

Los Stop Out y Margin Call no son tan normales, pero son naturales, y un EA tiene que estar preparado para ellos

Las condiciones comerciales pueden cambiar, no son constantes. Los saltos de StopLevel e incluso los cambios de apalancamiento a veces.

El usuario puede establecer/cambiar fácilmente el Stop/Take o cerrar una posición, incluso involuntariamente - el Asesor Experto debe reaccionar a esto

Un usuario puede abrir/cerrar una orden con Magic (o accidentalmente poner Magic=0 y operar a mano) - ¿qué hará el robot?

El balance es depositado/retirado sin reiniciar el EA - es extremadamente importante que el robot sea capaz de hacer esto (hubo un tema recientemente - un hombre acaba de perder dinero)

Es posible que el terminal se reinicie y tarde en actualizarse, o que la conexión se pierda durante un tiempo considerable; hay que tener en cuenta todo esto y todo lo ocurrido fuera de línea

El validador sólo lo comprueba el 1-2% de los "candidatos mínimos" y la gente sigue quejándose...

Maxim, ¿de qué estás hablando? Que he pedido consejo sobre qué hacer cuando me sale una parada. Lee el foro a partir de la página 6, en mi opinión he expuesto mi pregunta con mucho detalle.

 
Andrey Kaunov:

Renat, entiendo que cuente con garantías. No entiendo por qué.


Maxim, ¿de qué estás hablando? ¿He pedido consejo sobre qué hacer con una parada? Lee el foro en la página 6, creo que he expuesto mi pregunta con mucho detalle.

porque los billetes en el real no son 0,,,,N

 
Oh, te refieres a mi pequeño código. Así que no importa el tipo de entradas que haya. Renat es un array bidimensional. En la celda [0] escribe un billete y en la celda [1] cuenta los pedidos. Podríamos hacerlo con diferentes variables, pero decidí hacerlo así.
 
Andrey Kaunov:

Renat, entiendo que cuente con garantías. No entiendo por qué.


Maxim, ¿de qué estás hablando? ¿He pedido consejo sobre qué hacer con una parada? Lee el foro a partir de la página 6, en mi opinión he expuesto mi pregunta con mucho detalle.

con tus 10 años de experiencia, que puedo aconsejar...en principio nada :-)

Estás ignorando mi consejo y exigiendo un validador para tu EA.

---

tienes un stop out en el NZDUSD, una orden se cerró, la lógica de tu EA no importa, aún la seleccionas y envías OrderClose, obtienes false. Esta sorprendente operación se repite en cada tictac, el conjunto se ralentiza y el cheque se cancela. Y esto es en el nivel más simple.

Sobre las comprobaciones de las condiciones comerciales - ver las 14 páginas anteriores

 
Andrey Kaunov:

Presta atención a este post tuyo:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Cansado del error no hay operaciones comerciales

Andrey Kaunov, 2020.07.25 11:42

Lo probaré, gracias por el consejo.

Vladimir, ¿puedes entender la pregunta de forma constructiva? ¿No reviso el lote por el margen y demás?El artículo "Lo que los controles deben 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 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 lanza el Asesor Experto.

¿Qué hace el validador? Creo que hasta ahora lo único que hace es dejar boquiabiertos a los programadores.

Ten en cuenta que no estoy pidiendo que se cambie nada en el validador. Simplemente podemos ver los registros de las pruebas. Entonces quedará claro 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.

Tu primera captura de pantalla. Se ha unido al mensaje de que no hay operaciones en el NZDUSD. Y has estado luchando contra este molino durante 14 páginas.

Pero el error principal de la primera captura de pantalla no es ese. Es el que le informa sobre las pruebas demasiado largas en GBPUSD. Como la prueba ha durado demasiado, el validador la ha cancelado.

Ejecute el perfilador de código en GBPUSD, M30 y déjelo operar durante tres horas. A continuación, busque los cuellos de botella y arréglelos.

 
Maxim Kuznetsov:


---

Tienes un stop out en el NZDUSD, has cerrado una orden, a la lógica de tu Expert Advisor no le importa, sigues seleccionándolo y envías OrderClose, obtienes false. Esta sorprendente operación se repite en cada tictac, el conjunto se ralentiza y el cheque se cancela. Y esto en el caso más sencillo.

Acerca de la comprobación de las condiciones comerciales - vea las 14 páginas anteriores.

Maxim, estás leyendo el código con muy poca atención.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

La condición mencionada en el marcador no permitirá que la función OrderClose() se ejecute si la orden está cerrada, esto es lo primero. Y en segundo lugar, si al menos una orden está abierta en NZDUSD, el validador no devolvería "no trade".

Artyom Trishkin:

...

Ejecute el perfilador de código en GBPUSD, M30 y déjelo operar durante tres horas. A continuación, busque los cuellos de botella y arréglelos.

Bien, Artyom. Lo intentaré.

 
Andrey Kaunov:

Maxim, has leído el código con muy poca atención.

La condición especificada por el marcador no dejará escapar la función OrderClose(), esto es lo primero. Y en segundo lugar, si se abriera al menos una orden en NZDUSD, el validador no devolvería "no trade".


Francamente, estoy cansado de actuar como depurador de un código torcido e intentar luchar contra la autoconfianza del autor. Los errores especificados están ahí, míralos tú mismo

Si no sabes qué hacer con él, tendrás que hacer algo en tu propio beneficio. El validador no tiene nada que ver con esto

 
No te estoy pidiendo personalmente, Maxim, que depures nada. El código está torcido, bien, pero pasa la validación. La cuestión es muy diferente.
 
Artyom Trishkin:

...

Ejecute el perfilador de código en GBPUSD, M30 y déjelo operar durante tres horas. Entonces, vea los cuellos de botella y arréglelos.

Artyom, el perfilador de código no ha mostrado ningún cuello de botella. Todo el código se ejecuta sin problemas, sin procesos patológicamente largos.

La conclusión de toda esta historia es la siguiente. Por las buenas o por las malas, finalmente pasé la validación. No depende en absoluto del código (si es correcto, sin errores evidentes, como se menciona en este artículo). El funcionamiento del validador sólo lo conoce, obviamente, su creador. El código se comprueba después de 2 veces y a la tercera vez. A veces pasa varias veces seguidas y otras no. Es más, sólo cambio los parámetros de entrada (no son significativos) o desplazo las líneas que no cambian nada al reordenarlas, o incluso quito o añado comentarios (que no deberían afectar al archivo de trabajo de ninguna manera).

En general, la validación de pasar o fallar, depende sólo del validador de "humor" (tensión en la red, algún tipo de flujo de energía o lo que sea). Así, el código en el probador habitual con parámetros normales nunca se colgó y no dio ningún fallo, en ningún par y TF.