Errori, bug, domande - pagina 2589

 
fxsaber:

Domanda su ArrayResize. Faccio una riserva per diversi gigabyte in una volta sola. Poi aumento gradualmente la dimensione che è inferiore alla riserva iniziale.

Perché TaskManager mostra un aumento del consumo di memoria durante l'aumento delle dimensioni?

Non ci facciamo niente di proposito - è una caratteristica del sistema operativo (e l'utente ha davvero bisogno di gigabyte?

Se volete avere memoria calda in un punto critico di un programma, dovete "correre" attraverso le pagine del chunk allocato prima di quel punto, in modo che le pagine di memoria virtuale del processo diventino fisiche.


Ma, da MQL, non c'è accesso al chunk riservato dell'array.

 
Ilyas:

Non facciamo nulla per questo di proposito - è una caratteristica del sistema operativo (e l'utente ha davvero bisogno di gigabyte?

Se volete avere memoria "calda" in un punto critico di un programma, dovete "correre" attraverso le pagine del chunk allocato prima di quel punto, in modo che le pagine di memoria virtuale del processo ottengano quelle fisiche.


Ma, da MQL, non c'è accesso al chunk riservato dell'array.

Grazie. Mi chiedo come dovrebbero essere influenzate le prestazioni se si fa un ArrayResize completo su gigabyte in una volta sola.

 
void OnStart()
{  datetime m_stoptime = 0;
//1.
   if(m_stoptime < TimeCurrent())
   {
      //расчеты   
   }


//2.
   MqlTick last_tick;
   if(SymbolInfoTick(_Symbol, last_tick))
   {  if(m_stoptime < last_tick.time) 
      {
         //расчеты
      }
   }
//3. 
      const  int start = 0;
      const int count = 1;
      datetime time[1];
      if(CopyTime(_Symbol,PERIOD_M1,start,count,time)>0)
      {
        if(m_stoptime < time[0]) 
         {
         //расчеты
         }
      }
}

Testato, ha eseguito un overshoot completo mentre ottimizzava il mio EA per 5000 passaggi, contati solo dal log del tester

1. 14:04:28.365 - 14:15:47.481 = 11 m 19 sec

2. 13:49:56.885 - 14:00:30.819 = 10 m 34 sec.

3. 14:28:35.89 - 14:41:11.659 = 12 m 36 sec


in linea di principio, come previsto l'opzione 2 è più veloce, per 5000 corse il guadagno è di circa 30 secondi, anche abbastanza buono

 

Per favore, aiutatemi a chiamare questo menu attraverso WinAPI.

Posso ottenere la linea con il nome dell'EA selezionato. C'è solo una linea in ComboBox, a differenza di MT4.

Ma non posso chiamare il menu. BM_CLICK non funziona.


Come si usano i messaggi in x64?


Risolto il problema usando WM_LBUTTONDOWN.

 
È un errore o no che la statica zero non lo sia?
int Array0[] = {};
 
Ci sarà un'opzione nel terminale mobile per applicare gli indicatori dalla base direttamente al grafico?
 
Igor Makanu:

Fondamentalmente come previsto l'opzione 2 è più veloce, per 5000 passaggi il guadagno è di circa 30 secondi, non male.

Sarebbe bello avere un thread dove si raccolgono risultati simili. Per l'ottimizzatore è rilevante.

 
fxsaber:

Sarebbe bene avere un ramo dove si raccolgono risultati simili. È rilevante per l'ottimizzatore.

Lo sostengo, non è la prima volta che faccio dei test e pubblico i risultati in mezzo al nulla

ma non sono pronto ad aprire un ramo.... cattiva educazione, il senso di responsabilità mi travolgerà, e mantenere l'argomento aggiornato... Non sono sicuro di poterlo fare (((

ZS: seguendo l'esempio sopra.... ieri non ha deciso di scrivere di nuovo questo filo nell'esempio #2 SymbolInfoTick() aSymbolInfoInteger(_Symbol, SYMBOL_TIME)

ZZZY: ecco un esempio in cui uso, è più conveniente per me nell'ottimizzatore cercare il tempo con una frequenza di campionamento di 5 minuti - meno passaggi, quindi il tempo nell'ottimizzatore generalmente fatto 2 byte in ushort, se 0 - allora questa opzione non viene utilizzata, ho più - per verificare come lavorare con i byte, ma non ora - nel mio esempio una volta in OnInit() ho diviso i byte - non critico

class CWorkTime
{
private:
   int               m_starthour, m_stophour, m_startmin, m_stopmin;
   datetime          m_starttime, m_stoptime;
   bool              UseThisSession, NotIntraDay;
   void              setTodayWorkTime();
public:
   void              CWorkTime(const ushort worktime);
   bool              Disable(); };
//+------------------------------------------------------------------+
void CWorkTime::CWorkTime(const ushort worktime): UseThisSession(true)
{  union UShortToByte { ushort u_short; uchar byte[2]; } ShortToByte;
   if(worktime == 0)
   {  UseThisSession = false;
      Print("EA working time is not used"); }
   else
   {  ShortToByte.u_short = worktime;
      int t = (int)(ShortToByte.byte[0] * 5.625);
      m_starthour = (int)(t / 60);
      m_startmin = t % 60;

      t = (int)(ShortToByte.byte[1] * 5.625);
      m_stophour = (int)(t / 60);
      m_stopmin = t % 60;
      NotIntraDay = m_starthour > m_stophour ? true : false;
      setTodayWorkTime();
      printf("EA working time start: %d h %d min , end: %d h %d min", m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+
void CWorkTime::setTodayWorkTime()
{  MqlDateTime dtstart, dtstop;
   TimeCurrent(dtstart);
   dtstop         = dtstart;
   dtstart.hour   = m_starthour;
   dtstart.min    = m_startmin;
   dtstop.hour    = m_stophour;
   dtstop.min     = m_stopmin;
   m_starttime    = StructToTime(dtstart);
   m_stoptime     = StructToTime(dtstop);
   if(NotIntraDay) m_stoptime += 86400; }
//+------------------------------------------------------------------+
bool CWorkTime::Disable(void)
{  bool result    = false;
   if(UseThisSession)
   {  datetime time = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME);
      if(m_stoptime < time) setTodayWorkTime();
      result      = time >= m_starttime && time <= m_stoptime ? false : true; }
   return(result); };
//+------------------------------------------------------------------+

uso:

int OnInit()
  {
   WorkTime=new CWorkTime(EA_Time);
   }

void OnTick()
  {
    bool DisableTradingByTime=WorkTime.Disable();
.....
    if(DisableTradingByTime) return;

vale a dire, il risultato del metodo Disable() - très not working time, falce - working

 
fxsaber:

Sarebbe bene avere un ramo dove si raccolgono risultati simili. È rilevante per l'ottimizzatore.

Ce n'è uno simile sull'argomento:

Алгоритмы, методы решений, сравнение их производительности
Алгоритмы, методы решений, сравнение их производительности
  • 2017.12.10
  • www.mql5.com
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений...
 

Posso avere qualche dettaglio: perché SocketTlsReadAvailable () restituisce un errore (5273 ERR_NETSOCKET_IO_ERROR) quando Socket è connesso (SocketIsConnected () restituisce true)?

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

Bug, bug, domande

Alain Verleyen, 2019.08.29 01:17

A proposito delle funzioni mql SocketXXX () questo messaggio è destinato principalmente agli sviluppatori di Metaquotes: @Renat Fatkhullin, @Slava, @Ilyas

Sto usando il codice qui sotto per controllare la ricezione dei messaggi su una connessione sicura.

int socket;
//+------------------------------------------------------------------+
//| void OnTimer()                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   string message;
   if(receive(message))
     {
      //--- ...     
     }
  }
//+------------------------------------------------------------------+
//| Call every X ms                                                  |
//+------------------------------------------------------------------+
bool receive(string &message)
  {
//--- ...
   char response[];
   message="";

   ResetLastError();
   uint len=SocketIsReadable(socket);
   if(len>1)
     {
      int read=SocketTlsReadAvailable(socket,response,len);

      //--- analyze the response 
      if(read>0)
        {
         //--- ...

         message=CharArrayToString(response,0,read);
         return(true);
        }
      else if(read==-1)
        {
         if(SocketIsConnected(socket))
           {
            printf("ERROR: %i, socket(%i) read: len=%i",_LastError,socket,len);
           }
         else
           {
            printf("ERROR: %i, socket(%i) not connected. len=%i",_LastError,socket,len);
            //--- ...            
           }
        }
     }
   else
     {
      if(_LastError!=0)
         printf("ERROR: %i (SocketIsReadable).",_LastError);
     }
//--- ...
   return(false);
  }

Il più delle volte funziona correttamente. Tuttavia, di tanto in tanto ottengo un messaggio di errore, anche se la presa è collegata, e dopo un po' di tempo (da 1 a 5/6 errori) continua a funzionare.

... dati/messaggi ricevuti correttamente

2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ERRORE: 5273, socket (1), leggere: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ERRORE: 5273, socket (1), leggere: len = 1242

... dati/messaggi ricevuti correttamente

L'errore 5273 è molto comune e non aiuta molto. È possibile ottenere maggiori informazioni su questi errori?