Per favore, spiegate cosa potrebbe esserci di sbagliato in questa funzione?

 
 
MetaQuotes Software Corp.:

Qualsiasi nuovo prodotto software contiene inevitabilmente dei bug, che non sempre possono essere rilevati anche dai più accurati test interni. Ed è per questo che diamo grande importanza a tutti i rapporti degli utenti sui problemi riscontrati nel nostro software e cerchiamo di rispondere a ciascuno di essi.

Come possiamo comunicare se prima c'è una risposta errata e poi la ignoriamo. Applicazione 2016.06.22 08:06, #1499568

Forse qualcosa che la comunità può spiegare?


Ecco una parte del codice EA. Dentro 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)
             
              // Продолжение кода...
              // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.

Questo è il contenuto della scheda "Esperti".

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

Le prime righe del file di log del 21.06 dove si vede chiaramente che il codice di cui sopra ha funzionato bene.

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 riposa fino all'inizio del giorno successivo.

Ultime 2 righe del file di log del 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 inizio del registro da 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
Squadra di supporto 2016.06.22 08:36

Se avete entrambi NewDay e NewHour stampati simultaneamente, dovrebbero essere uno accanto all'altro nei registri. Con lo stesso tempo

E nei tuoi registri non sono solo da EA diversi (EURUSD e USDJPY) ma da tempi diversi
E l'applicazione è stata chiusa...
Alexey Viktorov 2016.06.22 11:25

Mi dispiace per l'inconveniente, non stavo facendo attenzione all'ora. Ma!!! Allora perché all'apparire della prima barra del nuovo giorno, anche la prima barra della nuova ora e il nuovo minuto la stessa funzione restituisce qualcuno vero a qualcuno falso e quando vuole può restituire tutto correttamente?

Per favore, spiegate cosa può essere sbagliato in questa funzione?

/*****************Определение появления нового бара******************/
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);
 }
};
/********************************************************************/
Perché tutto funzionava bene per molte settimane e all'improvviso va male?
VI CHIEDO GENTILMENTE DI ASTENERSI DAL VALUTARE L'USO DI TALE CLASSE.

Squadra di supporto 2016.06.22 11:31

Questa funzione non può essere usata ripetutamente a causa di

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Una cosa che non ho capito subito ieri... Dopotutto, la variabile m_tOld è passata per riferimento, che è dichiarata a livello di variabili globali e non dovrebbe influenzare la chiamata multipla se diverse variabili sono passate alla funzione per riferimento. Non è così? Prima di tutto, perché funziona correttamente nel tester e nel debug, e perché non funziona sul conto demo?

Squadra di supporto 2016.06.23 10:24

E questo assegno?

   if(tNew > m_tOld)


Squadra di supporto 2016.06.23 10:24

Chiamate la vostra funzione 2 volte di seguito. Se alla prima chiamata restituisce true, alla chiamata successiva restituirà false, anche se lo si chiama nello stesso tick


Alexey Viktorov 2016.06.23 10:36

Beh, si chiama. Tutto il codice richiesto l'ho fornito io. Perché non impedisce in tester e debug, e in demo come volete voi? È questo che non riesco a capire. Bene, se nel tester un tale problema si verificasse occasionalmente, potremmo e dovremmo cercare nuovi modi, ma non ci sono problemi nel tester...

Tutto lo stesso, ora non ho salvato un EA usando la stessa funzione su mql4, ma non ci sono stati problemi. Questo problema è apparso solo con mql5.

Alexey Viktorov 2016.06.23 10:41


Quindi? Quindi il test... Perché prima del controllo, alla variabile tNew viene assegnato un valore e viene confrontato con la variabile passata per riferimento, non con la variabile m_tOld stessa. E questa m_tOld può avere il valore del tempo della barra precedente del periodo specificato, o 01.01.1970 se è la prima chiamata. E solo al prossimo tick di ogni periodo i valori della stessa barra saranno confrontati.

Alexey Viktorov 2016.06.23 10:57


Nota, diverse variabili e diversi periodi sono passati alla funzione

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

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


E TUTTI... Dopo di che sono completamente ignorato. Grazie per la pronta risposta senza indugio, ma non ho ricevuto alcuna risposta intelligibile. Se c'è un bug in mql5, puoi semplicemente scrivere: "Stiamo cercando di risolverlo, quindi aspetta...". Ma in questo caso, state semplicemente ignorando il problema.

Una funzione simile in mql4 definiva il cambiamento di tempo come un multiplo di 15 secondi, e in mql5 questo problema è apparso improvvisamente...

 

Questo è ciò che significa un'osservazione organizzata in modo improprio quando si conduce un esperimento.

 
Dimitri, è ricominciato? Forse è più facile rispondere alla domanda "Perché i mandati del 21.06.2016 si sono aperti senza problemi, ma il 22.06.2016 improvvisamente l'organizzazione di sorveglianza sbagliata" o qualche altro problema...
 
Alexey Viktorov:
...

Per rispondere, avete bisogno di un codice. Avete frammenti di codice. Fare il codice minimo - in modo che chiunque possa eseguire questo codice nel proprio posto.

Sarebbe anche bene stampare nel codice i valori delle variabili - in ingresso alla funzione e in uscita dalla funzione.


 
Alexey Viktorov:
Dimitri, è ricominciato? Forse è più facile rispondere alla domanda "Perché il 21.06.2016 i mandati si sono aperti senza problemi, ma il 22.06.2016 improvvisamente l'organizzazione di sorveglianza sbagliata" o qualche altro problema...
Se mi limito a rispondere in modo diretto e così com'è, probabilmente verrò bannato per questo.
 
Dmitry Fedoseev:
Se rispondo in modo semplice e diretto, probabilmente verrò bannato per questo.
permanentemente...
 
Alexander Bereznyak:
per sempre...

Non riesci nemmeno a dormire, sogni così tanto?

Qual è il punto? Perché non ti rende più saggio.

Non è divertente vivere quando il senso della vita è l'odio? А?

 
Karputov Vladimir:

Per rispondere, avete bisogno di un codice. Avete frammenti di codice. Fate il codice minimo in modo che chiunque possa eseguire questo codice al suo posto.

Sarebbe bene stampare i valori delle variabili nel codice - in ingresso alla funzione e in uscita dalla funzione.


Nessun problema.

Ma si noti che non ci sono stati problemi e improvvisamente... Perché? Oltre agli snippet di codice ci sono dei log che mostrano che il 21.06.2016 e prima di questo ha funzionato come dovrebbe per settimane, ma qui il 22.06.2016 i problemi sono apparsi improvvisamente. Prima di scrivere su SD, ho eseguito ripetutamente in tester, ho fatto il debug attraverso la storia e non sono stati trovati problemi.

Ecco perché dubito dell'utilità di pubblicare il codice. È solo per divertimento.

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

Visto che l'autore non è disposto, ci proverò:

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

Quello che resta da decidere è la struttura"mqlDateTime" e dove dichiarare le variabili "oldDay" e "oldHour"...

 
Karputov Vladimir:

Visto che l'autore non vuole, ci proverò io:

Quello che resta da decidere è la struttura"mqlDateTime" e dove dichiarare le variabili "oldDay" e "oldHour"...

Tutte le risposte sono nel post sopra.