Validador automático - problemas

 

Intento actualizar la versión de EA y me da un error.

El mismo EA está en el probador de estrategias.


También estoy escribiendo EAs para MT4 al mismo tiempo, todo está bien allí. El código para los EAs 4 y 5 es el mismo, la única diferencia es el archivo de inclusión (son diferentes para 4 y 5).

La última vez que actualicé este EA, fue en enero y todo estaba bien.

Versión del software - MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memoria: 1866 / 3967 Mb, Disco: 5 / 35 Gb, GMT+3

 
Uladzimir Kirychenka:

Intento actualizar la versión de EA y me da un error.

El mismo EA está en el probador de estrategias.


También estoy escribiendo EAs para MT4 al mismo tiempo, todo está bien allí. El código para los EAs 4 y 5 es el mismo, la única diferencia es el archivo de inclusión (son diferentes para 4 y 5).

La última vez que actualicé este EA, fue en enero y todo estaba bien.

Versión del software - MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memoria: 1866 / 3967 Mb, Disco: 5 / 35 Gb, GMT+3

Pretende ser un idiota y poner un depósito de 1$ o un lote de 100500 y ver si habrá alguna operación. Y habrá alertas que sólo un idiota establecería tales parámetros.

 
Alexey Viktorov:

Finge que eres un idiota y pon un depósito de 1$ o lote 100500 y comprueba si habrá operaciones. Y si habrá alertas que sólo un idiota puede establecer tales parámetros.

El mismo problema. Lo he probado, pero no sirve de nada.) No puedo actualizar desde el 13 de abril. Si compruebo todo y todo - sólo obtengo una inscripción en todos los símbolos "trehe are no trading operations". Si no lo compruebo todo, me da un error: no hay suficiente capital para abrir la posición. La versión para MT4, así como para el autor del TS se actualiza sin problemas.

123

Vería en la imagen que el lote mínimo es de 2000, el saldo es de 10000 y claramente no hay suficiente dinero para abrir la posición. De todos modos, no paso el control.

¿Qué hacer en estos casos?

 

Por supuesto que no habrá acuerdos. ¿Y qué se supone que son las alertas? Sólo tengo en OnInit si el tamaño del lote no está en el rango SYMBOL_VOLUME_MIN y SYMBOL_VOLUME_MAX, entonces error de inicialización INIT_PARAMETERS_INCORRECT

 
Uladzimir Kirychenka:

Por supuesto que no habrá acuerdos. ¿Y qué se supone que son las alertas? Sólo tengo en OnInit si el tamaño del lote no está en el rango SYMBOL_VOLUME_MIN y SYMBOL_VOLUME_MAX, entonces error de inicialización INIT_PARAMETERS_INCORRECT

Recuerdo que en su día me pasó lo mismo con los moderadores revisando después de la autocomprobación. En caso de parámetros incorrectos, OnInit también termina con el código INIT_PARAMETERS_INCORRECT. Y el auto-check dio el mismo error de que no había ninguna operación comercial. Entonces, el moderador me aconsejó no terminar OnInit() con este código, sino emitir una Alerta.

 

Probablemente una vez al mes, alguien saca el tema. Lleva ya un tiempo en marcha.

La cuestión es que al operar (en la vida real) no sólo puede cambiar el tamaño del saldo, sino también el tamaño del lote.

Y durante las pruebas puede variar el tamaño del depósito (de 1 a 10000000) o del lote (de 1000000 a 0,01).

Por lo tanto, estas comprobaciones deben realizarse no sólo una vez en OnInit, sino permanentemente, en el bucle (por ejemplo, en OnTick).

Para evitar el desbordamiento del registro, es necesario emitir la advertencia(Imprimir mensaje o Alerta) sólo una vez.

 
Uladzimir Kirychenka:

Por supuesto que no habrá acuerdos. ¿Y qué se supone que son las alertas? Sólo tengo en OnInit si el tamaño del lote no está en el rango SYMBOL_VOLUME_MIN y SYMBOL_VOLUME_MAX, entonces error de inicialización INIT_PARAMETERS_INCORRECT

Entiendo que es muy difícil fingir ser un idiota, pero esta habilidad a veces ayuda. Inténtalo de nuevo. Usted establece un EA, con $1 en su cuenta, establece un lote de 100500 y espera... Esperas un día, un segundo, un tercero... entonces empiezas a resentirte, "Para qué he pagado. ¿Por qué no funciona esta mierda?" y nadie dice nada, nadie quiere decir algo como "Eres un idiota... No se puede trabajar en el mercado de divisas con un depósito así. Sólo un idiota pondría un lote 100500"... Así es.

 
Petros Shatakhtsyan:

Probablemente una vez al mes, alguien saca el tema. Lleva ya un tiempo en marcha.

La cuestión es que al operar (en la vida real) no sólo puede cambiar el tamaño del saldo, sino también el tamaño del lote.

Y durante las pruebas puede variar el tamaño del depósito (de 1 a 10000000) o del lote (de 1000000 a 0,01).

Por lo tanto, estas comprobaciones deben realizarse no sólo una vez en OnInit, sino permanentemente, en el bucle (por ejemplo, en OnTick).

La advertencia (Mensaje de impresión o Alerta) debe imprimirse sólo una vez para evitar el desbordamiento del registro.

Incluso un código muy simple no puede pasar la validación. Parece que cumple las condiciones que mencionas.

void OnTick()
  {
   ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL;
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);
   long digit;
   double point,Bid;
   SymbolInfoDouble(_Symbol,SYMBOL_BID,Bid);
   request.type   = ORDER_TYPE_SELL;
   request.price  = Bid;
   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   request.sl=0;
   request.tp=0;
   request.deviation=10;
   request.magic=55555;
   request.comment=NULL;
   request.type_filling=0;
   if(PositionsTotal()==0
   &&CheckMoneyForTrade(_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),ORDER_TYPE_SELL)==true
   ){
   OrderSend(request,result);
   }else{
      ExtExpert.Deinit();
      return;
   }
  }
  bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
con cheque de dinero - no hay operaciones comerciales, sin cheque - no hay suficiente dinero
 
Petros Shatakhtsyan:

Probablemente una vez al mes, alguien saca el tema. Lleva ya un tiempo en marcha.

La cuestión es que al operar (en la vida real) no sólo puede cambiar el tamaño del saldo, sino también el tamaño del lote.

Y durante las pruebas puede variar el tamaño del depósito (de 1 a 10000000) o del lote (de 1000000 a 0,01).

Por lo tanto, estas comprobaciones deben realizarse no sólo una vez en OnInit, sino permanentemente, en el bucle (por ejemplo, en OnTick).

La advertencia (Mensaje de impresión o Alerta) debe emitirse sólo una vez para evitar el desbordamiento del registro.

Estas comprobaciones (LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck) se realizan cada vez que se abre una posición. Y la comprobación del lote sólo en OnInit. No conozco la lógica de la comprobación del saldo en OnInit.

PD: La alerta no me salva de los errores del validador ((((((((((

 
Uladzimir Kirychenka:

Estas comprobaciones (LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck) se realizan cada vez que se abre una posición. Y onInit sólo comprueba el lote. No conozco la lógica de la comprobación del saldo en OnInit.

PD: La alerta no salva de los errores del validador ((((((((((

El validador no tiene errores :)

El validador sólo muestra que en el código proporcionado

  • no hay controles completos
  • no hay manejo de errores
El validador demuestra que el llamado escritor de código nunca se ha puesto en el lugar del usuario.

 
Vladimir Karputov:

El validador no tiene errores :)

El validador sólo muestra que el código proporcionado

  • no hay controles completos
  • No hay tratamiento de errores
El validador demuestra que el supuesto redactor del código nunca se ha puesto en el lugar del usuario.

))