Por favor, explique o que poderia estar errado com esta função.

 
 
MetaQuotes Software Corp.:

Qualquer produto de software novo inevitavelmente contém bugs, que nem sempre podem ser detectados mesmo pelos testes mais minuciosos realizados internamente. E é por isso que damos grande importância a todos os relatórios de usuários de problemas encontrados em nosso software e tentamos responder a cada um deles.

Como podemos nos comunicar se primeiro há uma resposta errada e depois a ignoramos. Aplicação 2016.06.22 08:06, #1499568

Talvez algo que a comunidade possa explicar?


Aqui está uma parte do código EA. Dentro do vazio 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 é o conteúdo da guia "Especialistas".

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

As primeiras linhas do arquivo de log a partir de 21.06, onde se vê claramente que o código acima funcionou bem.

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)

O EA descansa até o início do dia seguinte.

Últimas 2 linhas de arquivo de log a partir 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

e início do log a partir 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
Equipe de apoio 2016.06.22 08:36

Se você tiver o NewDay e o NewHour impressos simultaneamente, eles devem estar ao lado um do outro nos logs. Com o mesmo tempo

E em seus registros não são apenas de diferentes EAs (EURUSD e USDJPY), mas de épocas diferentes
E o pedido foi encerrado...
Alexey Viktorov 2016.06.22 11:25

Desculpe pelo inconveniente, eu não estava prestando atenção ao tempo. Mas!!!! Então, por que ao surgir a primeira barra do novo dia, também a primeira barra da nova hora e do novo minuto a mesma função retorna alguém verdadeiro para alguém falso e quando quer pode retornar tudo corretamente?

Por favor, explique o que pode estar errado nesta função.

/*****************Определение появления нового бара******************/
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 que tudo estava funcionando bem por muitas semanas e, de repente, deu errado?
PEÇO-LHE QUE SE ABSTENHA DE AVALIAR O USO DE TAL CLASSE.

Equipe de apoio 2016.06.22 11:31

Esta função não pode ser usada repetidamente por causa de

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Algo que ontem eu não entendi imediatamente... Afinal, a variável m_tOld é passada para a variável por referência, que é declarada no nível das variáveis globais e não deve afetar a chamada múltipla se variáveis diferentes forem passadas para a função por referência. Não é assim? Primeiro de tudo, por que está funcionando corretamente no teste e na depuração, e por que não está funcionando em conta de demonstração?

Equipe de apoio 2016.06.23 10:24

E quanto a este cheque?

   if(tNew > m_tOld)


Equipe de apoio 2016.06.23 10:24

Chame sua função 2 vezes seguidas. Se na primeira chamada ela retornar verdadeira, na próxima chamada ela retornará falsa, mesmo que você a chame no mesmo tick


Alexey Viktorov 2016.06.23 10:36

Bem, é assim que se chama. Todos os códigos necessários que eu forneci. Por que isso não impede em testador e depurador, e em demonstração como você quiser? Isso é o que eu não consigo entender. Bem, se no testador tal problema ocorresse ocasionalmente, poderíamos e deveríamos procurar novos caminhos, mas não há problemas no testador...

Mesmo assim, não salvei um EA usando a mesma função no mql4, mas não houve problemas. Este problema só apareceu com mql5.

Alexey Viktorov 2016.06.23 10:41


Então? Então, o teste... Porque antes da verificação, a variável tNew recebe um valor e é comparada à variável passada por referência, não à própria variável m_tOld. E esta m_tOld pode ter o valor de tempo da barra anterior do período especificado, ou 01.01.1970 se for a primeira chamada. E somente no próximo tick para cada período os valores da mesma barra serão comparados.

Alexey Viktorov 2016.06.23 10:57


Nota, variáveis diferentes e períodos diferentes são passados para a função

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

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


E TODOS... Depois disso, sou completamente ignorado. Obrigado pela pronta resposta sem demora, mas não recebi nenhuma resposta inteligível. Se houver um bug em mql5, você pode simplesmente escrever: "Estamos tentando consertá-lo, então é só esperar...". Mas, neste caso, você está simplesmente ignorando o problema.

Uma função similar em mql4 define a mudança de tempo como um múltiplo de 15 segundos, e em mql5 este problema apareceu de repente...

 

Isto é o que significa uma observação mal organizada ao conduzir uma experiência.

 
Dimitri, já começou de novo? Talvez seja mais fácil responder à pergunta "Por que o 21.06.2016 mandou abrir sem problemas, mas 22.06.2016 de repente a organização de vigilância errada" ou algum outro problema...
 
Alexey Viktorov:
...

Para responder a isso, você precisa de um código. Você tem trechos de código. Faça o código mínimo - para que qualquer pessoa possa executar este código em seu próprio lugar.

Também seria bom imprimir no código os valores das variáveis - na entrada para a função e na saída da função.


 
Alexey Viktorov:
Dimitri, já começou de novo? Talvez seja mais fácil responder à pergunta "Por que em 21.06.2016 os mandados abriram sem problemas, mas em 22.06.2016 de repente a organização de vigilância errada" ou algum outro problema...
Se eu apenas responder diretamente e como está, provavelmente serei banido por isso.
 
Dmitry Fedoseev:
Se eu responder de forma simples e direta, provavelmente serei banido por isso.
permanentemente...
 
Alexander Bereznyak:
para sempre...

Você não consegue nem dormir, você sonha tanto?

Qual é o objetivo? Porque isso não o torna mais sábio.

Não é divertido viver quando o sentido da vida é ódio? А?

 
Karputov Vladimir:

Para responder a isso, você precisa de um código. Você tem trechos de código. Faça o código mínimo para que qualquer um possa executar este código.

Seria bom imprimir os valores das variáveis no código - na entrada para a função e na saída da função.


Não há problema.

Mas note que não houve problemas e de repente... por quê? Além de trechos de código, há registros que mostram que 21.06.2016 e antes disso funcionou como deveria durante semanas, mas aqui 22.06.2016 surgiram subitamente problemas. Antes de escrever para a SD, eu corri repetidamente no testador, depurei a história e não foram encontrados problemas.

É por isso que eu duvido da utilidade de postar o código. É só por diversão.

#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("");
}/*******************************************************************/
 

Como o autor não está disposto a isso, vou tentar:

//+------------------------------------------------------------------+
//|                                                   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);
  }
//+------------------------------------------------------------------+

O que falta decidir é a estrutura"mqlDateTime" e onde declarar as variáveis "oldDay" e "oldHour"...

 
Karputov Vladimir:

Como o autor não está disposto a isso, vou tentar:

O que falta decidir é a estrutura"mqlDateTime" e onde declarar as variáveis "oldDay" e "oldHour"...

Todas as respostas estão no post acima.