Por favor, explique qué puede estar mal en esta función.

 
MetaQuotes Software Corp.:

Todo nuevo producto de software contiene inevitablemente errores, que no siempre pueden detectarse ni siquiera con las pruebas más exhaustivas realizadas en la empresa. Y por eso damos gran importancia a todos los informes de los usuarios sobre los problemas encontrados en nuestro software e intentamos responder a cada uno de ellos.

Cómo podemos comunicarnos si primero hay una respuesta errónea y luego la ignoramos. Aplicación 2016.06.22 08:06, #1499568

¿Tal vez algo que la comunidad pueda explicar?


Aquí está parte del código de EA. Dentro del void OnTick().

   bool openNew, newDay, newHour;

    if((int)mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено.
     {
      newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); // 
   if(newDay)
    Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true
       newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
    if(newHour)
     Print("***** newHour ", newHour); // Судя по распечатке newHour = true
        if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ.
         {
          openNew = openNew_or_No();
           Print("***** openNew ", openNew, " ***** PositionsTotal ", PositionsTotal()); // Эта распечатка отсутствует
            if(openNew || PositionsTotal() == 0)
             
              // Продолжение кода...
              // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.

Este es el contenido de la pestaña "Expertos".

2016.06.22 00:00:44.531 Toad Green (EURUSD,M15) ***** newHour true
2016.06.22 00:00:44.331 Toad Green (USDJPY,M15) ***** newHour true
2016.06.22 00:00:18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0
2016.06.22 00:00:12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0

Primeras líneas del archivo de registro de 21.06 donde se ve claramente que el código anterior funcionó bien.

GM      0       00:00:30.116    Trades  '3265046': instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55)
NK      0       00:00:30.246    Trades  '3265046': accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55)
IE      0       00:00:30.246    Trades  '3265046': deal #73303810 buy 0.01 EURUSD at 1.13188 done (based on order #87892298)
KI      0       00:00:30.246    Trades  '3265046': order #87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms
ON      0       00:00:30.256    Trades  '3265046': instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55)
LQ      0       00:00:30.366    Trades  '3265046': accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55)
HG      0       00:00:30.376    Trades  '3265046': deal #73303813 sell 0.01 EURUSD at 1.13093 done (based on order #87892301)
RK      0       00:00:30.376    Trades  '3265046': order #87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms
MJ      0       00:00:30.376    Trades  '3265046': modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462
GK      0       00:00:30.476    Trades  '3265046': accepted modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462
OK      0       00:00:30.486    Trades  '3265046': modify #87608748 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 107 ms
OH      0       00:00:30.486    Trades  '3265046': modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462
GJ      0       00:00:30.586    Trades  '3265046': accepted modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462
KI      0       00:00:30.596    Trades  '3265046': modify #87892301 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 109 ms
EN      0       04:20:25.608    Trades  '3265046': deal #73317674 sell 0.01 EURUSD at 1.13388 done (based on order #87906853)

El EA descansa hasta el comienzo del día siguiente.

Últimas 2 líneas del archivo de registro de 21.06

OD      0       23:09:20.196    Network '3265046': scanning network for access points
NR      0       23:09:33.496    Network '3265046': scanning network finished

y el comienzo del registro de 22.06

PM      1       02:13:39.422    Network '3265046': connection to MetaQuotes-Demo lost
GF      2       02:13:39.582    MQL5.community  authorization failed
DO      2       02:13:39.682    MQL5.community  authorization failed
IP      2       02:13:40.052    MQL5.community  authorization failed
PK      0       02:13:43.252    Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms)
DI      0       02:13:43.252    Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
Equipo de apoyo 2016.06.22 08:36

Si se imprimen simultáneamente NewDay y NewHour, deberían estar uno al lado del otro en los registros. Con el mismo tiempo

Y en sus registros no sólo son de diferentes EAs (EURUSD y USDJPY) sino de diferentes tiempos
Y la solicitud se ha cerrado...
Alexey Viktorov 2016.06.22 11:25

Disculpa las molestias, no estaba atento a la hora. Pero... Entonces, ¿por qué en la aparición de la primera barra del nuevo día, también la primera barra de la nueva hora y el nuevo minuto la misma función devuelve alguien verdadero a alguien falso y cuando quiere puede devolver todo correctamente?

Por favor, explique qué puede estar mal en esta función?

/*****************Определение появления нового бара******************/
class cNewBar
{
   public:
bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime & m_tOld)
 {
  datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE);
   if(tNew > m_tOld)
    {
     m_tOld = tNew;
     return(true);
    }
   return(false);
 }
};
/********************************************************************/
¿Por qué todo ha funcionado bien durante muchas semanas y de repente se ha estropeado?
LE RUEGO QUE SE ABSTENGA DE EVALUAR EL USO DE DICHA CLASE.

Equipo de apoyo 2016.06.22 11:31

Esta función no puede utilizarse repetidamente debido a

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Algo que no entendí inmediatamente ayer... Al fin y al cabo, la variable m_tOld se pasa por referencia, lo que se declara a nivel de variables globales y no debería afectar a la llamada múltiple si se pasan diferentes variables a la función por referencia. ¿No es así? En primer lugar, por qué funciona correctamente en Tester y Debug, y luego no funciona en la cuenta demo.

Equipo de apoyo 2016.06.23 10:24

¿Y este cheque?

   if(tNew > m_tOld)


Equipo de apoyo 2016.06.23 10:24

Llame a su función 2 veces seguidas. Si en la primera llamada devuelve true, en la siguiente devolverá false, aunque se llame en el mismo tick


Alexey Viktorov 2016.06.23 10:36

Pues se llama. Todo el código necesario lo he proporcionado yo. ¿Por qué no impide en tester y debug, y en demo como quieres? Eso es lo que no puedo entender. Bueno, si en el probador se produjera ocasionalmente un problema de este tipo, podríamos y deberíamos buscar nuevas formas, pero no hay problemas en el probador...

Igualmente, no he guardado un EA usando la misma función en mql4, pero no hubo problemas. Este problema sólo ha aparecido con mql5.

Alexey Viktorov 2016.06.23 10:41


¿Y qué? Así que la prueba... Porque antes de la comprobación, a la variable tNuevo se le asigna un valor y se compara con la variable pasada por referencia, no con la propia variable m_tOld. Y esta m_tOld puede tener el valor del tiempo de la barra anterior del periodo especificado, o del 01.01.1970 si es la primera llamada. Y sólo en el siguiente tick de cada periodo se compararán los valores de la misma barra.

Alexey Viktorov 2016.06.23 10:57


Tenga en cuenta que a la función se le pasan diferentes variables y diferentes periodos

      newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay);
   

       newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);


Y TODO... Después de eso me ignoran por completo. Gracias por la rápida respuesta sin demora, pero no he recibido ninguna respuesta inteligible. Si hay un error en mql5, puedes escribir simplemente: "Estamos intentando arreglarlo, así que espera...". Pero en este caso, simplemente está ignorando el problema.

Una función similar en mql4 definía el cambio de tiempo como un múltiplo de 15 segundos, y en mql5 este problema apareció de repente...

 

Esto es lo que significa una observación mal organizada al realizar un experimento.

 
Dimitri, ¿ha empezado de nuevo? Tal vez sea más fácil responder a la pregunta "¿Por qué las órdenes de detención del 21.06.2016 se abrieron sin problemas, pero el 22.06.2016 de repente la organización de vigilancia equivocada?" o algún otro problema...
 
Alexey Viktorov:
...

Para responder a eso, necesitas un código. Tienes fragmentos de código. Haz el código mínimo para que cualquiera pueda ejecutar este código en su propio lugar.

También sería bueno imprimir en el código los valores de las variables - a la entrada de la función y a la salida de la función.


 
Alexey Viktorov:
Dimitri, ¿ha empezado de nuevo? Tal vez sea más fácil responder a la pregunta "¿Por qué el 21.06.2016 las órdenes de detención se abrieron sin problemas, pero el 22.06.2016 de repente la organización de vigilancia equivocada" o algún otro problema...
Si respondo sin rodeos y tal cual, probablemente me baneen por ello.
 
Dmitry Fedoseev:
Si respondo de forma sencilla y directa, probablemente me baneen por ello.
permanentemente...
 
Alexander Bereznyak:
para siempre...

¿No puedes ni dormir, sueñas tanto?

¿Qué sentido tiene? Porque no te hace más sabio.

¿No es divertido vivir cuando el sentido de la vida es el odio? А?

 
Karputov Vladimir:

Para responder a eso, necesitas un código. Tienes fragmentos de código. Haz el código mínimo para que cualquiera pueda ejecutar este código.

Sería bueno imprimir los valores de las variables en el código - en la entrada a la función y en la salida de la función.


No hay problema.

Pero ten en cuenta que no hubo problemas y de repente... ¿Por qué? Aparte de los fragmentos de código hay registros que muestran que el 21.06.2016 y antes de eso funcionó como debería durante semanas, pero aquí el 22.06.2016 los problemas aparecieron de repente. Antes de escribir en la SD, ejecuté repetidamente en el probador, depuré a través de la historia y no se encontró ningún problema.

Por eso dudo de la utilidad de publicar el código. Es sólo por diversión.

#property strict

datetime oldDay, oldHour;
MqlDateTime mqlDateTime;
/*******************Expert initialization function*******************/
int OnInit()
{
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
  bool newDay, newHour;
   TimeToStruct(TimeCurrent(), mqlDateTime);
    if((int)mqlDateTime.hour == 0)
     {
      newDay = IsNewBar(_Symbol, PERIOD_D1, oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке
   if(newDay)
    Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true
       newHour = IsNewBar(_Symbol, PERIOD_H1, oldHour); // А это совсем другая переменная
    if(newHour)
     Print("***** newHour ", newHour); // Судя по распечатке newHour = true
        if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ.
         {
          Print("Ордер должен откыться. ");
         }
     }
}/*******************************************************************/

/*****************Определение появления нового бара******************/
bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld)
 {
  datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE);
   if(tNew > m_tOld)
    {
     m_tOld = tNew;
     return(true);
    }
   return(false);
 }
/********************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
 

Ya que el autor no está dispuesto, lo intentaré:

//+------------------------------------------------------------------+
//|                                                   test_1Vc2f.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   bool openNew,newDay,newHour;
//---
   newDay=IsNewBar(_Symbol,PERIOD_D1,oldDay); // 
   if(newDay)
      Print("***** newDay ",newDay," mqlDateTime.hour ",mqlDateTime.hour); // Судя по распечатке newDay = true
   newHour=IsNewBar(_Symbol,PERIOD_H1,oldHour);
   if(newHour)
      Print("***** newHour ",newHour); // Судя по распечатке newDay = true
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe,datetime &m_tOld)
  {
   datetime tNew=(datetime)SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE);
   if(tNew>m_tOld)
     {
      Print("in: m_tOld = ",m_tOld);
      m_tOld=tNew;
      Print("out: m_tOld = ",m_tOld);
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+

Lo que queda por decidir es la estructura"mqlDateTime" y dónde declarar las variables "oldDay" y "oldHour"...

 
Karputov Vladimir:

Ya que el autor no está dispuesto, lo intentaré:

Lo que queda por decidir es la estructura"mqlDateTime" y dónde declarar las variables "oldDay" y "oldHour"...

Todas las respuestas están en el post anterior.
Razón de la queja: