Bitte erklären Sie mir, was an dieser Funktion falsch sein könnte?

 
 
MetaQuotes Software Corp.:

Jedes neue Softwareprodukt enthält unweigerlich Fehler, die selbst durch die gründlichsten internen Tests nicht immer entdeckt werden können. Deshalb legen wir großen Wert auf alle Berichte von Benutzern über Probleme, die in unserer Software gefunden werden, und wir versuchen, auf jeden dieser Berichte zu reagieren.

Wie können wir kommunizieren, wenn zuerst eine falsche Antwort kommt und wir sie dann ignorieren? Bewerbung 2016.06.22 08:06, #1499568

Vielleicht kann die Gemeinschaft etwas dazu sagen?


Hier ist ein Teil des EA-Codes. Innerhalb von 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)
             
              // Продолжение кода...
              // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.

Dies ist der Inhalt der Registerkarte "Experten".

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

Die ersten Zeilen des Logfiles vom 21.06. zeigen deutlich, dass der obige Code gut funktioniert.

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)

Der EA ruht bis zum Beginn des nächsten Tages.

Die letzten 2 Zeilen der Protokolldatei vom 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

und Beginn des Protokolls vom 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
Support-Team 2016.06.22 08:36

Wenn Sie sowohl NewDay als auch NewHour gleichzeitig drucken lassen, sollten sie in den Protokollen nebeneinander stehen. Mit der gleichen Zeit

Und in Ihren Logs sind sie nicht nur von verschiedenen EAs (EURUSD und USDJPY), sondern auch von verschiedenen Zeiten
Und die Anwendung wurde geschlossen...
Alexey Viktorov 2016.06.22 11:25

Entschuldigen Sie die Unannehmlichkeiten, ich habe nicht auf die Zeit geachtet. Aber!!! Warum gibt dann beim Erscheinen des ersten Balkens des neuen Tages, auch des ersten Balkens der neuen Stunde und der neuen Minute dieselbe Funktion jemandem wahr bis jemandem falsch zurück und wenn sie will, kann sie alles richtig zurückgeben?

Bitte erklären Sie mir, was an dieser Funktion falsch sein kann?

/*****************Определение появления нового бара******************/
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);
 }
};
/********************************************************************/
Wie kommt es, dass viele Wochen lang alles gut funktionierte und dann plötzlich alles schief ging?
ICH BITTE SIE, VON EINER BEWERTUNG DER VERWENDUNG EINER SOLCHEN KLASSE ABZUSEHEN.

Support-Team 2016.06.22 11:31

Diese Funktion kann aus folgenden Gründen nicht wiederholt verwendet werden

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Etwas, das ich gestern nicht sofort verstanden habe... Schließlich wird die Variable m_tOld per Referenz an die Variable übergeben, die auf der Ebene der globalen Variablen deklariert ist und den Mehrfachaufruf nicht beeinträchtigen sollte, wenn verschiedene Variablen per Referenz an die Funktion übergeben werden. Ist es nicht so? Zunächst einmal, warum funktioniert es korrekt in Tester und Debug, und dann ist es nicht auf Demo-Konto arbeiten.

Support-Team 2016.06.23 10:24

Was ist mit diesem Scheck?

   if(tNew > m_tOld)


Support-Team 2016.06.23 10:24

Rufen Sie Ihre Funktion 2 Mal hintereinander auf. Wenn er beim ersten Aufruf true zurückgibt, wird er beim nächsten Aufruf false zurückgeben, auch wenn Sie ihn zum gleichen Zeitpunkt aufrufen


Alexey Viktorov 2016.06.23 10:36

Nun, es heißt. Den gesamten erforderlichen Code habe ich bereitgestellt. Warum verhindert es nicht in Tester und Debug, und in der Demo, wie Sie wollen? Das ist es, was ich nicht verstehen kann. Nun, wenn im Tester gelegentlich ein solches Problem auftreten würde, könnten und sollten wir nach neuen Wegen suchen, aber im Tester gibt es keine Probleme...

Trotzdem habe ich einen EA mit der gleichen Funktion nicht auf mql4 gespeichert, aber es gab keine Probleme. Dieses Problem ist nur bei mql5 aufgetreten.

Alexey Viktorov 2016.06.23 10:41


Und? Also der Test... Denn vor der Prüfung wird der Variablen tNew ein Wert zugewiesen, der mit der per Referenz übergebenen Variablen verglichen wird, nicht mit der Variablen m_tOld selbst. Und diese m_tOld kann den Wert der Zeit des vorhergehenden Taktes des angegebenen Zeitraums haben, oder den 01.01.1970, wenn es sich um den ersten Aufruf handelt. Und erst beim nächsten Tick für jede Periode werden die Werte desselben Balkens verglichen.

Alexey Viktorov 2016.06.23 10:57


Beachten Sie, dass unterschiedliche Variablen und unterschiedliche Zeiträume an die Funktion übergeben werden

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

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


UND ALLE... Danach werde ich völlig ignoriert. Vielen Dank für die prompte Antwort ohne Verzögerung, aber ich habe keine verständliche Antwort erhalten. Wenn es einen Fehler in mql5 gibt, können Sie einfach schreiben: "Wir versuchen, ihn zu beheben, also warten Sie einfach...". Aber in diesem Fall ignorieren Sie das Problem einfach.

Eine ähnliche Funktion in mql4 definierte die Zeitänderung als ein Vielfaches von 15 Sekunden, und in mql5 trat dieses Problem plötzlich auf...

 

Das ist es, was eine schlecht organisierte Beobachtung bei der Durchführung eines Experiments bedeutet.

 
Dimitri, hat es wieder angefangen? Vielleicht ist es einfacher, die Frage zu beantworten: "Warum öffnete sich am 21.06.2016 der Haftbefehl ohne Probleme, aber am 22.06.2016 plötzlich die falsche Überwachungsorganisation" oder ein anderes Problem?
 
Alexey Viktorov:
...

Um diese Frage zu beantworten, brauchen Sie einen Code. Sie haben Codeschnipsel. Erstellen Sie den Minimalcode, so dass jeder diesen Code an seinem eigenen Platz ausführen kann.

Es wäre auch gut, im Code die Werte der Variablen zu drucken - bei der Eingabe in die Funktion und bei der Ausgabe aus der Funktion.


 
Alexey Viktorov:
Dimitri, hat es wieder angefangen? Vielleicht ist es einfacher, die Frage zu beantworten, warum am 21.06.2016 die Haftbefehle ohne Probleme geöffnet wurden, aber am 22.06.2016 plötzlich die falsche Überwachungsorganisation" oder ein anderes Problem...
Wenn ich einfach direkt und ohne Umschweife antworte, werde ich wahrscheinlich dafür gesperrt.
 
Dmitry Fedoseev:
Wenn ich einfach und geradeheraus antworte, werde ich wahrscheinlich ausgeschlossen.
ständig...
 
Alexander Bereznyak:
für immer...

Du kannst nicht einmal schlafen, weil du so viel träumst?

Was soll das bringen? Denn das macht Sie nicht klüger.

Ist es nicht schön zu leben, wenn der Sinn des Lebens Hass ist? А?

 
Karputov Vladimir:

Um diese Frage zu beantworten, brauchen Sie einen Code. Sie haben Codeschnipsel. Machen Sie den Mindestcode so, dass jeder diesen Code ausführen kann.

Es wäre gut, die Werte der Variablen im Code zu drucken - bei der Eingabe in die Funktion und bei der Ausgabe aus der Funktion.


Kein Problem.

Aber beachten Sie, dass es keine Probleme gab und plötzlich... Warum? Abgesehen von Codeschnipseln gibt es Protokolle, die zeigen, dass es am 21.06.2016 und davor wochenlang so funktioniert hat, wie es sollte, aber am 22.06.2016 traten plötzlich Probleme auf. Bevor ich auf die SD-Karte geschrieben habe, habe ich das Programm wiederholt im Tester ausgeführt, die Historie überprüft und keine Probleme gefunden.

Deshalb bezweifle ich, dass es sinnvoll ist, den Code zu veröffentlichen. Das ist nur zum Spaß.

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

Da der Autor nicht bereit ist, werde ich es versuchen:

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

Was noch zu entscheiden ist, ist die Struktur"mqlDateTime" und wo die Variablen "oldDay" und "oldHour" deklariert werden sollen...

 
Karputov Vladimir:

Da der Autor nicht bereit ist, werde ich es versuchen:

Was noch zu entscheiden ist, ist die Struktur"mqlDateTime" und wo die Variablen "oldDay" und "oldHour" deklariert werden sollen...

Alle Antworten finden Sie in dem Beitrag oben.