Erreurs, bugs, questions - page 2589

 
Ilyas:

Nous ne faisons rien pour cela exprès - c'est une fonctionnalité du système d'exploitation (et l'utilisateur a-t-il vraiment besoin de gigaoctets ?

Si vous voulez avoir de la mémoire chaude à un moment critique d'un programme, vous devez "parcourir" les pages du morceau alloué avant ce moment, de sorte que les pages de mémoire virtuelle du processus deviennent des pages physiques.


Mais, depuis MQL, il n'y a pas d'accès à la partie réservée du tableau.

Merci. Je me demande comment les performances devraient être affectées si l'on effectue un ArrayResize complet sur des gigaoctets à la fois.

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

Testé, effectué un dépassement complet tout en optimisant mon EA pour 5000 passages, compté juste à partir du log du testeur

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

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


en principe, comme prévu, l'option 2 est plus rapide, pour 5000 passages le gain est d'environ 30 secondes, également assez bon

 

Veuillez m'aider à appeler ce menu via WinAPI.

Je peux obtenir la ligne avec le nom de l'EA sélectionné. Il n'y a qu'une seule ligne dans ComboBox, contrairement à MT4.

Mais je ne peux pas appeler le menu. BM_CLICK ne fonctionne pas.


Comment utilisez-vous les messages en x64 ?


J'ai résolu le problème en utilisant WM_LBUTTONDOWN.

 
Est-ce une erreur ou non que les statiques zéro ne le soient pas ?
int Array0[] = {};
 
Y aura-t-il une option dans le terminal mobile pour appliquer les indicateurs du sous-sol directement sur le graphique ?
 
Igor Makanu:

Comme prévu, l'option 2 est plus rapide. Pour 5000 passages, le gain est d'environ 30 secondes, ce qui n'est pas mal non plus.

Il serait bon d'avoir un fil de discussion où des résultats similaires seraient compilés. Pour l'Optimiseur est pertinent.

 
fxsaber:

Il serait bon d'avoir une branche où des résultats similaires seraient collectés. C'est pertinent pour l'Optimiseur.

Je le soutiens, ce n'est pas la première fois que je teste et affiche des résultats au milieu de nulle part.

mais je ne suis pas prêt à ouvrir une branche.... mauvaise éducation, le sens des responsabilités me submergera, mais pour garder le sujet à jour... Je ne suis pas sûr de pouvoir le faire ((()

ZS : suivant l'exemple ci-dessus.... hier, je n'ai pas décidé de réécrire ce fil conducteur dans l'exemple n°2 SymbolInfoTick() toSymbolInfoInteger(_Symbol, SYMBOL_TIME)

ZZZY : voici un exemple où j'utilise, il est plus pratique pour moi dans l'optimiseur de chercher le temps avec un taux d'échantillonnage de 5 minutes - moins de passages, donc le temps dans l'optimiseur a généralement fait 2 octets en ushort, si 0 - alors cette option n'est pas utilisée, j'ai plus - pour vérifier comment travailler avec des octets, mais pas maintenant - dans mon exemple une fois dans OnInit() j'ai divisé les octets - non critique

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

l'usage :

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

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

i.e. le résultat de la méthode Disable() - très pas temps de travail, falce - travail

 
fxsaber:

Il serait bon d'avoir une branche où des résultats similaires seraient collectés. Il est pertinent pour l'optimiseur.

Il en existe une similaire sur le sujet :

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

Puis-je avoir des détails : pourquoi SocketTlsReadAvailable () renvoie une erreur (5273 ERR_NETSOCKET_IO_ERROR) alors que Socket est connecté (SocketIsConnected () renvoie true) ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Alain Verleyen, 2019.08.29 01:17

A propos des fonctions mql SocketXXX () ce message est principalement destiné aux développeurs de Metaquotes : @Renat Fatkhullin, @Slava, @Ilyas

J'utilise le code ci-dessous pour contrôler la réception des messages sur une connexion sécurisée.

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

La plupart du temps, cela fonctionne correctement. Cependant, de temps en temps, j'obtiens un message d'erreur, bien que le socket soit connecté, et après un certain temps (1 à 5/6 erreurs), il continue à fonctionner.

... données / messages reçus correctement

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

... données / messages reçus correctement

L'erreur 5273 est très courante et n'aide pas beaucoup. Est-il possible d'obtenir plus d'informations sur ces erreurs ?


 

Pouvez-vous me dire quelle pourrait être la raison de l'erreur [Too many trade requests] lors du deuxième appel de la routine OrderSend (après le démarrage du terminal) ?

J'ai examiné les registres du lundi au jeudi. J'ai vu la même chose dans tous les journaux : le premier ordre à cours limité est envoyé avec succès et tous les ordres suivants auront l'erreur [Too many trade requests]. Puis ils commencent à passer. La seule action criminelle est l'appel fréquent de CopyTickRange dans OnInit().


Démarrage de BCS Broker MetaTrader 5 Terminal x64 build 2170