Errores, fallos, preguntas - página 100

 
Urain:

¿Existe una terminación forzada de la función OnTester()

o por qué existe el historial de transacciones antes de la función personalizada y devuelve cero después :

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

¿Qué funciones no funcionan en el probador?

¿Cómo puede el probador (durante la optimización) señalar al exterior que algo va mal (imprimir alertas, nada funciona)?

Aparentemente todo el mundo está dormido esta noche.
 
Urain:
Aparentemente, todo el mundo está dormido hoy.

¿Has mirado los registros de los agentes, quizás todo esté ahí?

Por lo que sé, las impresoras no aparecen en el registro principal del probador sólo durante la optimización (en modo normal todo está bien).

OnTester(), según tengo entendido no es posible salir a la fuerza. ¿Y para qué? ¿Simplemente calcula un determinado resultado de la prueba (además, se utiliza esencialmente sólo para la optimización)?

OnTester:
La función OnTester() es un manejador de eventos Tester que se genera automáticamente al final de las pruebas históricas del Asesor Experto en un intervalo de fechas determinado. La función debe ser definida con el tipo double, no tiene parámetros:

dobleOnTester();

La función se llama inmediatamente antes de OnDeinit() y tiene el tipo de retorno double. La función OnTester() se puede utilizar sólo en los expertos durante las pruebas. Su propósito principal es calcular algún valor que se utilizará como el criterio Custom max en la optimización genética de los parámetros de entrada.


PS

> por qué el historial de transacciones antes de una función personalizada, pero después de eso muestra cero...

Tal vez sea una pregunta para los desarrolladores.

Por lo que entiendo, OnTester debe devolver el número de operaciones (si las hay), mientras que Custom_func() se entiende como una función personalizada?

 
Urain:

Dedicado a los desarrolladores ...

Ustedes al menos habrían avisado si dan una oportunidad que antes en principio no era posible.

Perdí veinticuatro horas tratando de atrapar este bicho.

No me digas que está bien, claro que lo sé, pero he perdido 24 horas sólo porque estoy acostumbrado a que con este

Estoy acostumbrado a que el compilador me dé un error.

¿Cuál es la forma correcta de hacerlo? ¿Es "==" o es "="?
 
Urain:

¿Existe una terminación forzada de la función OnTester()

o por qué existe el historial de transacciones antes de la función personalizada y devuelve cero después :

¿Qué funciones no funcionan en el probador?

¿cómo señalar desde el probador (durante la optimización) al exterior que algo va mal (imprime alertas de que nada funciona)?

Gracias por su mensaje. Hemos recibido su solicitud y la estamos tramitando.

 

¿Cómo puedo calcular el lote máximo permitido por margen para abrir una nueva posición? En MQL4 se hizo de la siguiente manera:

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

¿Cómo puedo calcular el lote máximo permitido por margen para abrir una nueva posición? En MQL4 se hacía así:

Aproximadamente así:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
Este código no sólo calcula el volumen máximo, sino que lo ajusta exactamente a los límites de la configuración del símbolo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

Es algo así:

Este código no sólo calcula el volumen máximo, sino que lo ajusta exactamente a los límites de la configuración de los caracteres.
Gracias. No tengo OrderCalcMargin() en mi ayuda :)
 
EvgeTrofi:
Gracias. No tengo OrderCalcMargin() en mi ayuda :)
Esta función fue añadida hace mucho tiempo - busque en la documentación, por favor.
 
EvgeTrofi:
Entonces, ¿cuál es el camino correcto al final? ¿Es "==" o es "="?

De cualquier manera.

if(a==0){expresión} significa que si a es 0 entonces es cierto, por lo que ejecutamos {expresión}.

if(a=0){expresión} es igual a if(a){a=0;expresión} si a es verdadero, {a=0;expresión}.

 
Interesting:

¿Has mirado los registros de los agentes, quizá todo esté ahí?

Por lo que sé, las impresoras no aparecen en el registro principal del probador sólo durante la optimización (en modo normal todo está bien).

OnTester() según tengo entendido no es posible salir a la fuerza. ¿Y para qué, sólo calcula un determinado resultado de la prueba (además, se utiliza esencialmente sólo para la optimización)?

PS

> ¿Por qué el historial de transacciones antes de una función personalizada existe y da cero después...

Quizás esto sea un problema para los desarrolladores.

Por lo que entiendo, el OnTester debería devolver el número de ofertas (si las hay), mientras que la función personalizada es Custom_func()?

El problema es que en la propia optimización el programa no funciona como en otras situaciones (por eso necesito enviar el mensaje desde debajo de OnTester).

Para ello, he inventado la impresión analógica (función que crea un archivo con el fin de imprimir una cadena pasada a la función como parámetro).

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

De este modo, he conseguido captar la ejecución incorrecta de algunas funciones en OnTester.