Bug MQL5 quando si lavora con accesso alle serie temporali iClose/iOpen, ecc. - pagina 5

 
Renat Fatkhullin:

Per favore, mostratemi il codice di riferimento dell'indicatore, che mantiene sempre gli ultimi 2000 tick di ogni simbolo da Market Watch.

Altrimenti si ottengono delle ipotesi da un lato e solo raccomandazioni sotto forma di parole dall'altro lato.

 
Renat Fatkhullin:

Devo guardare il codice.

Il codice qui sopra ha chiaramente un mucchio di problemi logici e di risorse.

Sto facendo qualcosa del genere, per favore consigliatemi come e cosa modificare se necessario:

bool flag = true;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true;

  //---
  return (INIT_SUCCEEDED);
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit (const int reason)
{
  //--- destroy timer
  EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
int OnCalculate (const int       rates_total,
                 const int       prev_calculated,
                 const datetime &time        [],
                 const double   &open        [],
                 const double   &high        [],
                 const double   &low         [],
                 const double   &close       [],
                 const long     &tick_volume [],
                 const long     &volume      [],
                 const int      &spread      [])
{
  //Print ("---");
  //Print (rates_total, " ", prev_calculated);
  //Print ("---");

  if (flag)
  {
    if (SeriesInfoInteger (Symbol (), Period (), SERIES_SYNCHRONIZED))
    {
      Print ("1 История синхронизирована");
      int bars = Bars (Symbol (), Period ());
      Print ("Баров в истории ", bars);


      MqlTick ticks_array [];

      datetime from = TimeByNumberOfCandles (Symbol (), PERIOD_M1, ParentCandles_P);
      MqlDateTime sdt;
      ulong from_msc = ((ulong)from) * 1000;

      ResetLastError ();
      int count = CopyTicksRange (Symbol (), ticks_array, COPY_TICKS_INFO, from_msc); //, to_msc);
      Print ("Скопировано ", count, " тиков");

      int error = GetLastError ();
      Print (error);

      if (count <= 0 || error != 0)
      {
        Print ("Ошибка при получении данных");
        return (rates_total);
      }

      Print (ticks_array [0].time_msc, " ", ticks_array [count - 1].time_msc); // 0-й самый старый

      for (int i = 0; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false;
    }
    else
    {
      Print ("2 История НЕ синхронизирована!");
      return (rates_total);
    }
  }


  return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin:

Devo guardare il codice.

Il codice qui sopra ha chiaramente un mucchio di problemi logici e di risorse.

C'è un problema logico in questo codice o mi manca qualcosa?

Forum sul trading, sistemi di trading automatico e test di strategia

MQL5 Bug nell'accesso alle serie temporali iClose/iOpen, ecc.

Stanislav Dray, 2018.11.14 16:28

Il vostro atteggiamento nei confronti delle segnalazioni di bug è strano. Non è che io sia pagato per dimostrare qualcosa. Ho esposto la situazione come meglio potevo.

Non sono l'unico con il problema, il problema è apparso dopo il tuo 30° aggiornamento, ma ancora insinui che sono un pazzo e dai la colpa a degli indicatori ritardati.

Non sono stati lenti per un anno prima?

Ecco un esempio di codice che si blocca 25 minuti dopo l'avvio su M30:

//+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#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()
  {
//---
    datetime CM1_T[1];
    if(CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T)==-1){
      Comment("\n\n CopyTime return -1");
      return;
    }
    Comment("\n\n CopyTime : "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin:

Dovreste scrivere l'indicatore con una chiara comprensione del fatto che non otterrete tutto in una volta.

In OnInit dovete stimolare il caricamento della storia degli strumenti necessari con singole chiamate di CopyXXX, ma dovete aspettare l'inizializzazione completa in OnCalculate.

La vostra fase di inizializzazione sembra avere un errore - state aspettando i dati in modo errato e bloccando.

Cercherò di farlo,

Ora faccio richieste a OnCalculate e aspetto lì (non ogni tick ovviamente, ma solo la prima volta del calcolo).

 
fxsaber:

Per favore, mostratemi il codice di riferimento dell'indicatore, che mantiene sempre gli ultimi 2000 tick di ogni simbolo da Market Watch.

Non sono sicuro di come usarlo, ma sono sicuro di avere il diritto di usarlo.

Sono d'accordo, non è meglio nemmeno per le zecche, ma per i bar.

Avete bisogno di un esempio di un codice Multicurrency vero e approvato.

Altrimenti resteremo nell'oscurità...

 

Cercherò di localizzare l'errore e riferirò appena lo trovo

 
transcendreamer:

Sono d'accordo, meglio nemmeno le zecche ma le barre.

Abbiamo bisogno di un esempio di un vero codice multicurrency approvato.

Altrimenti saremo ancora al buio...

Barre e zecche sono diverse epistasi che vivono in MT5 in modo indipendente.
 
Vladimir Karputov:

Inoltre è sempre stato raccomandato che se state lavorando con il timeframe di qualcun altro - dovreste ottenere OHLC da quel timeframe una volta al minuto (qualsiasi funzione CopyXXXX). Questo è sempre stato il caso.

Volevo già sputare su tutto quello che sta succedendo qui, ma purtroppo ho passato circa 10 anni sul prodotto MQ.

Ora è tutto un business. Vladimir il tuo consiglio di usare le funzioni CopyXXXX è stato usato da me, perché non c'era nessuna difficoltà dal punto di vista del mio codice scritto in modo non professionale.

Onestamente volevo che il problema fosse solo nelle mie mani storte, ma no, il problema non è solo in esse. Ho uno screenshot qui sotto, anticipando strane spiegazioni dal supporto tecnico dicendo che ho codificato in modo errato e 100500 altri indicatori, quindi cosa vuoi, ci saranno problemi. Non ho 100500 altri indicatori, non c'è nessun esperto, ho solo due strumenti aperti nel terminale, il test dell'indicatore è in esecuzione su EURUSD 1M, l'indicatore chiama i dati dal timeframe M15 dello stesso strumento, non sto cercando di caricare altri simboli dati, ce ne sono solo pochi nella revisione del mercato.

È una situazione ideale per il terminale in termini di carico, che ovviamente non sarà il caso nel funzionamento normale, ma anche in questo caso c'è un problema e secondo me questo problema si chiama "BAG".

Nell'indicatore le funzioni iClose e iBars sono chiamate solo per riflettere lo stato in Commet(). Nella panoramica del mercato al momento della creazione dello screenshot, lo stato attuale della chiamata delle funzioni iClose e iBars è nella finestra del terminale, inoltre la parte di calcolo dell'indicatore utilizza la funzione CopyXXXX.

BORSA

Come potete vedere l'indicatore è stato ricaricato alle 16:31 e ha funzionato con successo (stavo persino diventando felice), ma l'aggiornamento dei dati di iClose si è fermato dopo le 00:15, rispettivamente la funzione CopyXXXX non restituisce nemmeno dati aggiornati, cioè l'errore si verifica da qualche parte nelle profondità di MT.

Secondo me, c'è un fallimento nella lettura dei dati dal server, i motivi possono essere di massa (niente internet, il server era occupato, ecc.), ma perché la ripresa del lavoro dopo aver eliminato le cause della comunicazione non avviene, quindi concludo che si può testare il codice sorgente degli utenti quanto si vuole, ma se si ha un server accanto, questo problema non si potrà mai identificare, ed esiste e non si verifica solo a causa della cattiva mano del codificatore.

 

Ho anche deciso di testare il codice di Stanislav ieri. Dopo alcune ore l'aggiornamento del tempo si è fermato. Non ho cambiato timeframes, l'ho solo aggiornato tramite il menu contestuale del grafico e il tempo è andato avanti.

Oggi ho modificato un po' il codice per vedere l'ora e il timeframe corrente.

void OnTick()
{
 datetime CM1_T[1];
 datetime CM2_T[1];
 CopyTime(_Symbol,PERIOD_M1,0,1,CM1_T);
 CopyTime(_Symbol,PERIOD_CURRENT,0,1,CM2_T);
 Comment("CopyTime PERIOD_CURRENT: "+TimeToString(CM2_T[0],TIME_DATE | TIME_SECONDS)+"\nCopyTime PERIOD_M1: "+TimeToString(CM1_T[0],TIME_DATE | TIME_SECONDS));   
}

In 15 minuti ha smesso di aggiornarsi in tempo "non nativo", ma con il tempo corrente si aggiornava normalmente. Dopo il refresh del grafico il tempo è ricominciato.

Il terminale funziona in modalità portatile. Il sistema e il terminale stesso si trovano su un disco SSD.


 

Non so cosa sia successo, ma quando ho scritto il bot per l'ultimo campionato MQ in MQL5, era multivaluta e non ho notato alcun problema con il caricamento di dati da altri strumenti.

Può aver consumato molte risorse, ma ha dato il risultato atteso, e non una roulette come adesso.

Questo problema, per esempio come sviluppatore di prodotti commerciali per MQL5, non mi caratterizzerà in modo molto buono e sarà doppiamente sgradevole se una persona paga per un prodotto acquistato dal Market e sembra solo glitchato a causa di tali "BOGS".