Erros, bugs, perguntas - página 2589

 
fxsaber:

Pergunta sobre o ArrayResize. Faço uma Reserva para vários gigabytes ao mesmo tempo. Depois aumento gradualmente o Tamanho, que é inferior à Reserva inicial.

Porque é que o TaskManager mostra um aumento do consumo de memória durante o aumento de tamanho?

Não fazemos nada de propósito - é uma característica do SO (e será que o utilizador precisa mesmo de gigabytes?

Se quiser ter memória quente num ponto crítico de um programa, tem de "correr" através das páginas do pedaço alocado antes desse ponto, para que as páginas de memória virtual do processo se tornem físicas.


Mas, a partir da MQL, não há acesso ao pedaço reservado da matriz.

 
Ilyas:

Não fazemos nada de propósito para isto - é uma característica do SO (e será que o utilizador precisa mesmo de gigabytes?

Se quiser ter memória "quente" num ponto crítico de um programa, tem de "correr" através das páginas do pedaço atribuído antes desse ponto, de modo a que as páginas de memória virtual do processo fiquem físicas.


Mas, a partir da MQL, não há acesso ao pedaço reservado da matriz.

Obrigado. Pergunto-me como é que o desempenho deve ser afectado se se fizer um ArrayResize completo em gigabytes de uma só vez.

 
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]) 
         {
         //расчеты
         }
      }
}

Testado, fiz uma ultrapassagem completa enquanto optimizava a minha EA para 5000 passes, contados apenas a partir do registo do testador

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

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

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


em princípio, como se espera que a opção 2 seja mais rápida, para 5000 corridas o ganho é de cerca de 30 segundos, também bastante bom

 

Por favor, ajude a chamar este menu através do WinAPI.

Posso obter a linha com o nome EA seleccionado. Há apenas uma linha na ComboBox, ao contrário do MT4.

Mas não posso chamar o menu. BM_CLICK não funciona.


Como se utilizam as Mensagens em x64?


Resolveu o problema usando WM_LBUTTONDOWN.

 
É ou não um erro que a estática zero não seja?
int Array0[] = {};
 
Haverá uma opção no terminal móvel para aplicar indicadores do subsolo directamente no gráfico?
 
Igor Makanu:

Basicamente como esperado a opção 2 é mais rápida, para 5000 passagens o ganho é de cerca de 30 segundos, nada mau também.

Seria bom ter um fio onde seriam compilados resultados semelhantes. Para o Optimizer é relevante.

 
fxsaber:

Seria bom ter um ramo onde fossem recolhidos resultados semelhantes. É relevante para o Optimizer.

Eu apoio-o, não é a primeira vez que testei e afixei resultados no meio do nada

mas não estou pronto para abrir um ramo.... má educação, um sentido de responsabilidade irá sobrecarregar-me, e manter o tema actualizado... Não tenho a certeza se serei capaz de (((

ZS: seguindo o exemplo acima.... ontem não decidiu escrever novamente este tópico no exemplo #2 SymbolInfoTick() paraSymbolInfoInteger(_Symbol, SYMBOL_TIME)

ZZZY: aqui está um exemplo onde eu uso, é mais conveniente para mim no optimizador procurar tempo com uma taxa de amostra de 5 minutos - menos passagens, por isso o tempo no optimizador geralmente fez 2 bytes em ushort, se 0 - então esta opção não é usada, tenho mais - para verificar como trabalhar com bytes, mas não agora - no meu exemplo uma vez no OnInit() dividi bytes - não crítico

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

utilização:

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

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

ou seja, o resultado do método Disable() - très not working time, falce - working

 
fxsaber:

Seria bom ter um ramo onde fossem recolhidos resultados semelhantes. É relevante para o Otimizador.

Há um semelhante sobre o assunto:

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

Posso ter alguns detalhes: porque é que a SocketTlsReadAvailable () devolve erro (5273 ERR_NETSOCKET_IO_ERROR) quando a Socket está ligada (SocketIsConnected () devolvida verdadeira)?

Fórum sobre Comércio, Sistemas de Comércio Automatizados e Testes de Estratégia

Insectos, insectos, perguntas

Alain Verleyen, 2019.08.29 01:17

Sobre as funções mql SocketXXX () esta mensagem destina-se principalmente aos programadores de Metaquotes: @Renat Fatkhullin, @Slava, @Ilyas

Estou a utilizar o código abaixo para controlar a recepção de mensagens através de uma ligação segura.

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

A maior parte do tempo funciona correctamente. No entanto, ocasionalmente recebo uma mensagem de erro embora a tomada esteja ligada, e após algum tempo (1 a 5/6 erros) continua a funcionar.

... dados / mensagens recebidas correctamente

2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ERROR: 5273, tomada (1), deve ler-se: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ERROR: 5273, tomada (1), deve ler-se: len = 1242

... dados / mensagens recebidas correctamente

O erro 5273 é muito comum e não ajuda muito. É possível obter mais informações sobre tais erros?