Errores, fallos, preguntas - página 1661

 

Es un error o una pregunta, pero algo incomprensible ...está ocurriendo en el probador y en el depurador... Todo está bien en el EURUSD, pero hay un problema con el USDJPY...

Parte del código

void funArrPositionTicket(ulong & arrBuy[], int & buySize, ulong & arrSell[], int & sellSize)
{
 double bp, sp;
  buyProfit = 0; sellProfit = 0; buyVolume = 0; sellVolume = 0;
   int i, total = PositionsTotal();
    for(i = 0; i < total; i++)
     {
      if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol)
       {
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          buySize = ArraySize(arrBuy);
           ArrayResize(arrBuy, buySize+1);
            arrBuy[buySize] = (int)PositionGetInteger(POSITION_TICKET);
           buyProfit += PositionGetDouble(POSITION_PROFIT);
          buyVolume += PositionGetDouble(POSITION_VOLUME);
         }
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          sellSize = ArraySize(arrSell);
           ArrayResize(arrSell, sellSize+1);
            arrSell[sellSize] = (int)PositionGetInteger(POSITION_TICKET);
           sp = PositionGetDouble(POSITION_PROFIT);
           sellProfit += sp;
          sellVolume += PositionGetDouble(POSITION_VOLUME);
         }
       }
     }
}/*******************************************************************/

Lo que me interesa del código está claro en las capturas de pantalla... Está marcado en el código.

Hay UNA orden de venta con una pérdida de 7,39, pero el código muestra una pérdida de sólo 0,93


La flecha verde en la siguiente captura de pantalla muestra que la depuración se detiene en esta línea...



Es decir, la variable sl ya se ha establecido como PositionGetDouble(POSITION_PROFIT)


PREGUNTA: ¿Por qué ocurre esto? ¿Es un error o un patrón, una característica especial del probador/depurador de mql5?

La variable sp se introdujo un poco más tarde, inicialmente se comprobaba la variable sellProfit, que se ponía a cero al entrar en la función.

 
Alexey Viktorov:

Ya sea un error o una pregunta, pero hay algo que no está claro... sucede en el probador y en la depuración... Todo está bien en el EURUSD, pero hay un problema en el USDJPY...

Hubo un problema en la construcción de una docena de años antes cuando el visualizador mostraba el futuro por un tick, mientras que MQL funcionaba normalmente - el futuro no se veía.

Intenta comparar PositionGetDouble(POSITION_PROFIT) en el siguiente tick. Si coincide con lo que el visualizador ha mostrado antes - el problema está ahí. Slawa dio una explicación y prometió corregirlo.

Si no es así, se trata de otro error en este caso.

 
fxsaber:

En una compilación una o dos veces anterior a la actual, había un problema cuando el visualizador mostraba el futuro en un tick, mientras que MQL funcionaba bien - el futuro no se veía.

Intenta comparar PositionGetDouble(POSITION_PROFIT) en el siguiente tick. Si coincide con lo que el visualizador ha mostrado antes - el problema está ahí. Slawa dio una explicación y prometió corregirlo.

Si no es así, se trata de otro error en este caso.

Tal vez sea así, pero el código no proporciona una comprobación en el siguiente tick. Sólo una vez en el momento de la apertura de un nuevo bar. ¿Y qué garantía hay de que estos valores sean del siguiente tick? Ninguno... Lo he vuelto a intentar; la pérdida es de 2,55, pero el depurador sigue mostrando 0,93.

Pero, crucemos los dedos... el probador 5 es mucho mejor que el probador 4... Sólo los fallos y el funcionamiento inadecuado... ¿Cómo se puede depurar un Asesor Experto con estos fallos? ¿De qué otra forma se optimiza la gente? De hecho, la optimización es un autoengaño, y con semejantes chanchullos, es un autoengaño al grado de mentir 8.

Tendré que probarlo en una demo... durante semanas...

 

El hecho de que el visualizador muestre tonterías no significa que el propio comprobador esté equivocado. Al probador no le importan los problemas de visualización, en absoluto.

Utilice TickValue para calcular el tamaño de las ganancias y compárelo con POSITION_PROFIT. Verás que todo es igual. La visualización parece ser un error.

 
fxsaber:

El hecho de que el visualizador muestre tonterías no significa que el propio comprobador esté equivocado. Al probador no le importan los problemas de visualización, en absoluto.

Utilice TickValue para calcular el tamaño de las ganancias y compárelo con POSITION_PROFIT. Verás que todo es igual. La visualización parece ser un error.

Sí, lo he recalculado antes de publicar la pregunta. Parece que es cierto, se puede recalcular a partir de las capturas de pantalla. No empecé a comprobarlo por una razón. La pérdida se calcula en base al tamaño del lote que llevará a la ganancia esperada al cierre del take profit. Todo se calculó correctamente en el EURUSD, pero de repente las pérdidas no se cubren en el USDJPY... Empecé a comprobar la fórmula... y llegó a este error. Resulta que el visualizador no tiene nada que ver.

 
Alexey Viktorov:

Sí, lo conté antes de publicar la pregunta. Parece que es cierto, se puede recalcular a partir de las capturas de pantalla. No empecé a comprobarlo por una razón. La pérdida se calcula en función del tamaño del lote con el que se cerrará el beneficio esperado en la toma. Todo se calculó correctamente en el EURUSD, pero de repente las pérdidas no se cubren en el USDJPY... Empecé a comprobar la fórmula... y llegó a este error. Resulta que el visualizador no tiene nada que ver.

Lo siento, pero no entiendo su punto. ¿Quién crees que es el bicho: el probador o el visualizador?
 

Error al compilar Script1.mq5

//Script.mqh
typedef void (*fn)();
#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void h();
        void h( fn );
#import
class A {
public:
        void f1() { h( g ); } //Error: #1 - no one of the overloads can be applied to the function call
                              //Error: #2 - cannot resolve function address
        void f2() {    g(); } //нормально (*)
        void f3() { Print( __FUNCTION__ ); }
};
//Script1.mq5
#property library
#include "Script.mqh"
void g() export
{
        A a;
        a.f3();
}

Error nº 1. La llamada h es inequívoca por la firma aquí.

Error #2. En A::f1() la llamada de h( g ) en el sentido de g - puede parecer ambigua, pero en cambio en A::f2() el compilador no hace preguntas innecesarias sobre g() (y lo hace correctamente - al menos al principio los problemas existentes de incluir el archivo de cabecera con la declaración de la función en el módulo con su implementación y uso posterior en este módulo fueron resueltos hace tiempo). Y además, es difícil reescribirlo de otra manera, porque Script.mqh es un archivo de cabecera común

 
fxsaber:
Lo siento, pero no entiendo su punto. ¿Quién cree que se equivoca, el probador o el visualizador?

Si muestra valores similares a la verdad, pero los calcula utilizando datos erróneos, entonces el problema está en mql5, y no en el probador o el visualizador.

En definitiva, gracias por tu aportación, a la larga le ganaré la partida al problema. Y hoy comprobaré otra pieza de moneda similar. ¿Tal vez sea el problema de las garrapatas en ese lugar, hhz?

 

¿Por qué la advertencia está en igualdad de condiciones?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
Estimados profesionales, por favor ayúdenme a entender el problema. El Asesor Experto funciona por la señal del indicador cuyo período puede ser cambiado dentro de un amplio rango de 3 barras hasta 10000 y más. El propio indicador funciona bien por sí mismo y reacciona adecuadamente a los cambios en el periodo dentro de estos límites. Sin embargo, el Asesor Experto en el Probador de Estrategias no acepta configuraciones superiores a 1002 barras e informa de "División Cero". ¿Cuál puede ser el problema? No he encontrado ninguna limitación en el código del Asesor Experto.