Veuillez expliquer ce qui pourrait clocher dans cette fonction.

 
 
MetaQuotes Software Corp.:

Tout nouveau produit logiciel contient inévitablement des bogues, qui ne peuvent pas toujours être détectés, même par les tests les plus approfondis effectués en interne. C'est pourquoi nous attachons une grande importance à tous les rapports des utilisateurs sur les problèmes rencontrés dans nos logiciels et nous nous efforçons de répondre à chacun d'entre eux.

Comment pouvons-nous communiquer s'il y a d'abord une réponse erronée et ensuite nous l'ignorons. Application 2016.06.22 08:06, #1499568

Peut-être la communauté peut-elle l'expliquer ?


Voici une partie du code de l'EA. Inside 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)
             
              // Продолжение кода...
              // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.

Voici le contenu de l'onglet "Experts".

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

Les premières lignes du fichier journal de 21.06 où l'on voit clairement que le code ci-dessus a bien fonctionné.

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)

L'EA se repose jusqu'au début du jour suivant.

Les 2 dernières lignes du fichier journal du 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

et début du journal à 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
Équipe de soutien 2016.06.22 08:36

Si vous avez imprimé simultanément NewDay et NewHour, ils devraient se trouver l'un à côté de l'autre dans les journaux. Dans le même temps

Et dans vos journaux, ils ne proviennent pas seulement de différents EAs (EURUSD et USDJPY) mais de différents moments.
Et l'application a été fermée...
Alexey Viktorov 2016.06.22 11:25

Désolé pour le dérangement, je n'ai pas fait attention à l'heure. Mais ! !! Alors pourquoi à l'apparition de la première barre du nouveau jour, de la première barre de la nouvelle heure et de la nouvelle minute la même fonction renvoie quelqu'un de vrai à quelqu'un de faux et quand elle veut peut renvoyer tout correctement ?

Veuillez expliquer ce qui peut être incorrect dans cette fonction.

/*****************Определение появления нового бара******************/
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);
 }
};
/********************************************************************/
Comment se fait-il que tout fonctionnait bien pendant de nombreuses semaines et que, tout à coup, tout se dérègle ?
JE VOUS DEMANDE DE VOUS ABSTENIR D'ÉVALUER L'UTILISATION D'UNE TELLE CLASSE.

Équipe de soutien 2016.06.22 11:31

Cette fonction ne peut pas être utilisée de manière répétée en raison de

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Quelque chose que je n'ai pas compris immédiatement hier... Après tout, la variable m_tOld est passée à la fonction par référence, ce qui est déclaré au niveau des variables globales et ne devrait pas affecter l'appel multiple si différentes variables sont passées à la fonction par référence. N'est-ce pas ? Tout d'abord, pourquoi cela fonctionne-t-il correctement dans le testeur et le débogueur, et pourquoi cela ne fonctionne-t-il pas sur le compte de démonstration ?

Équipe de soutien 2016.06.23 10:24

Et ce chèque ?

   if(tNew > m_tOld)


Équipe de soutien 2016.06.23 10:24

Appelez votre fonction 2 fois de suite. Si le premier appel renvoie un résultat vrai, le suivant renverra un résultat faux, même si vous l'appelez sur le même tick.


Alexey Viktorov 2016.06.23 10:36

Eh bien, il s'appelle. J'ai fourni tous les codes nécessaires. Pourquoi cela n'empêche pas de tester et de déboguer, et d'utiliser la démo comme vous le souhaitez ? C'est ce que je ne peux pas comprendre. Eh bien, si dans le testeur un tel problème se produisait occasionnellement, nous pourrions et devrions chercher de nouveaux moyens, mais il n'y a pas de problèmes dans le testeur...

Tout de même, maintenant je n'ai pas sauvegardé un EA en utilisant la même fonction sur mql4, mais il n'y avait pas de problèmes. Ce problème n'est apparu qu'avec mql5.

Alexey Viktorov 2016.06.23 10:41


Et alors ? Donc le test... Parce qu'avant la vérification, une valeur est attribuée à la variable tNew et elle est comparée à la variable passée par référence, et non à la variable m_tOld elle-même. Et cette m_tOld peut avoir la valeur du temps de la barre précédente de la période spécifiée, ou 01.01.1970 si c'est le premier appel. Et ce n'est qu'au prochain tick de chaque période que les valeurs de la même barre seront comparées.

Alexey Viktorov 2016.06.23 10:57


Notez que différentes variables et différentes périodes sont passées à la fonction

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

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


ET TOUT... Après cela, je suis complètement ignoré. Merci pour la réponse rapide sans délai, mais je n'ai reçu aucune réponse intelligible. S'il y a un bogue dans mql5, vous pouvez simplement écrire, "Nous essayons de le corriger, alors attendez...". Mais dans ce cas, vous ignorez simplement le problème.

Une fonction similaire dans mql4 définissait le changement de temps comme un multiple de 15 secondes, et dans mql5 ce problème est soudainement apparu...

 

C'est ce que signifie une observation mal organisée lors d'une expérience.

 
Dimitri, ça a recommencé ? Peut-être qu'il est plus facile de répondre à la question "Pourquoi les mandats du 21.06.2016 se sont ouverts sans problèmes, mais le 22.06.2016 soudainement la mauvaise organisation de surveillance" ou un autre problème....
 
Alexey Viktorov:
...

Pour répondre à cette question, vous avez besoin d'un code. Vous avez des bouts de code. Réaliser le code minimum - de sorte que n'importe qui puisse exécuter ce code chez lui.

Il serait également bon d'imprimer dans le code les valeurs des variables - à l'entrée de la fonction et à la sortie de la fonction.


 
Alexey Viktorov:
Dimitri, ça a recommencé ? Peut-être qu'il est plus facile de répondre à la question "Pourquoi le 21.06.2016 les mandats se sont ouverts sans aucun problème, mais le 22.06.2016 soudainement la mauvaise organisation de surveillance" ou un autre problème....
Si je réponds simplement de manière directe et telle qu'elle est, je serai probablement banni pour cela.
 
Dmitry Fedoseev:
Si je réponds de manière simple et directe, je serai probablement banni pour cela.
en permanence...
 
Alexander Bereznyak:
pour toujours...

Tu ne peux même pas dormir, tu rêves tellement ?

Quel est l'intérêt ? Parce que ça ne te rend pas plus sage.

N'est-ce pas amusant de vivre quand le sens de la vie est la haine ? А ?

 
Karputov Vladimir:

Pour répondre à cette question, vous avez besoin d'un code. Vous avez des bouts de code. Réaliser le code minimum - de sorte que n'importe qui puisse exécuter ce code par lui-même.

Il serait bon d'imprimer les valeurs des variables dans le code - à l'entrée de la fonction et à la sortie de la fonction.


Pas de problème.

Mais notez qu'il n'y avait pas de problèmes et que soudain... Pourquoi ? En dehors des extraits de code, il existe des journaux qui montrent que le 21.06.2016 et avant cela, il a fonctionné comme il se doit pendant des semaines, mais que le 22.06.2016, des problèmes sont soudainement apparus. Avant d'écrire sur SD, j'ai lancé à plusieurs reprises dans le testeur, débogué à travers l'historique et aucun problème n'a été trouvé.

C'est pourquoi je doute de l'utilité de poster le code. C'est juste pour le plaisir.

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

Puisque l'auteur n'est pas disposé à le faire, je vais essayer :

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

Ce qui reste à décider est la structure"mqlDateTime" et où déclarer les variables "oldDay" et "oldHour"...

 
Karputov Vladimir:

Puisque l'auteur ne veut pas, je vais essayer :

Ce qui reste à décider est la structure"mqlDateTime" et où déclarer les variables "oldDay" et "oldHour"...

Toutes les réponses sont dans le post ci-dessus.
Raison: