Fehler, Irrtümer, Fragen - Seite 2589

 
fxsaber:

Frage zu ArrayResize. Ich lege eine Reserve für mehrere Gigabyte auf einmal an. Dann erhöhe ich schrittweise die Größe, die geringer ist als die ursprüngliche Reserve.

Warum zeigt der TaskManager einen Anstieg des Speicherverbrauchs bei der Vergrößerung an?

Wir tun absichtlich nichts dagegen - es ist eine Funktion des Betriebssystems (und braucht der Benutzer wirklich Gigabytes?

Wenn Sie an einem kritischen Punkt in einem Programm heißen Speicher haben wollen, müssen Sie die Seiten des zugewiesenen Chunks vor diesem Punkt "durchlaufen", damit die virtuellen Speicherseiten des Prozesses physische Seiten erhalten.


Aber von MQL aus gibt es keinen Zugriff auf den reservierten Teil des Arrays.

 
Ilyas:

Wir tun dies nicht absichtlich - es ist eine Funktion des Betriebssystems (und braucht der Benutzer wirklich Gigabytes?

Wenn Sie an einem kritischen Punkt in einem Programm heißen Speicher haben wollen, müssen Sie die Seiten des zugewiesenen Chunks vor diesem Punkt "durchlaufen", damit die virtuellen Speicherseiten des Prozesses physische Seiten erhalten.


Aber von MQL aus gibt es keinen Zugriff auf den reservierten Teil des Arrays.

Danke. Ich frage mich, wie sich das auf die Leistung auswirkt, wenn man ein komplettes ArrayResize für Gigabytes auf einmal durchführt.

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

Getestet, lief eine volle Überschreitung während der Optimierung meiner EA für 5000 Pässe, nur von der Tester-Log gezählt

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


Im Prinzip ist Option 2 erwartungsgemäß schneller, bei 5000 Durchläufen beträgt der Gewinn etwa 30 Sekunden, ebenfalls ziemlich gut

 

Bitte helfen Sie, dieses Menü über WinAPI aufzurufen.

Ich kann die Zeile mit dem ausgewählten EA-Namen abrufen. Anders als in MT4 gibt es in der ComboBox nur eine Zeile.

Aber ich kann das Menü nicht aufrufen. BM_CLICK funktioniert nicht.


Wie verwenden Sie Messages in x64?


Ich habe das Problem mit WM_LBUTTONDOWN gelöst.

 
Ist es ein Fehler oder nicht, dass die Statik nicht Null ist?
int Array0[] = {};
 
Wird es eine Option im mobilen Terminal geben, um Indikatoren aus dem Keller direkt auf das Diagramm anzuwenden?
 
Igor Makanu:

Im Grunde genommen ist Option 2 erwartungsgemäß schneller, bei 5000 Durchläufen beträgt der Gewinn etwa 30 Sekunden, auch nicht schlecht.

Es wäre schön, einen Thread zu haben, in dem ähnliche Ergebnisse zusammengetragen werden. Für den Optimierer ist relevant.

 
fxsaber:

Es wäre gut, einen Zweig zu haben, in dem ähnliche Ergebnisse gesammelt werden. Es ist relevant für den Optimierer.

Ich unterstütze es, denn es ist nicht das erste Mal, dass ich mitten im Nirgendwo Ergebnisse getestet und veröffentlicht habe.

aber ich bin nicht bereit, einen Zweig zu eröffnen.... schlechte Ausbildung, ein Gefühl der Verantwortung wird mich überwältigen, und halten Sie das Thema auf dem neuesten Stand ... Ich bin mir nicht sicher, ob ich dazu in der Lage sein werde (((

ZS: entsprechend dem obigen Beispiel.... gestern nicht beschlossen, diesen Thread in Beispiel #2 SymbolInfoTick() zuSymbolInfoInteger(_Symbol, SYMBOL_TIME) erneut zu schreiben

ZZZY: hier ist ein Beispiel, wo ich verwenden, ist es bequemer für mich in der Optimierer für die Zeit mit einer Abtastrate von 5 Minuten zu suchen - weniger Pässe, so dass die Zeit in der Optimierer in der Regel 2 Byte in ushort gemacht, wenn 0 - dann ist diese Option nicht verwendet wird, habe ich mehr - zu prüfen, wie man mit Bytes arbeiten, aber nicht jetzt - in meinem Beispiel einmal in OnInit() Ich split Bytes - nicht kritisch

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

Verwendung:

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

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

d.h. das Ergebnis der Methode Disable() - très nicht arbeiten Zeit, falce - arbeiten

 
fxsaber:

Es wäre gut, einen Zweig zu haben, in dem ähnliche Ergebnisse gesammelt werden. Sie ist für den Optimierer relevant.

Es gibt eine ähnliche Studie zu diesem Thema:

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

Kann ich einige Details haben: warum SocketTlsReadAvailable () Fehler (5273 ERR_NETSOCKET_IO_ERROR) zurückgibt, wenn Socket verbunden ist (SocketIsConnected () zurückgegeben true)?

Forum für Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Alain Verleyen, 2019.08.29 01:17

Über mql SocketXXX-Funktionen () Diese Nachricht ist hauptsächlich für Metaquotes-Entwickler gedacht: @Renat Fatkhullin, @Slava, @Ilyas

Ich verwende den folgenden Code, um den Nachrichtenempfang über eine sichere Verbindung zu steuern.

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

In den meisten Fällen funktioniert es richtig. Gelegentlich erhalte ich jedoch eine Fehlermeldung, obwohl der Socket verbunden ist, und nach einiger Zeit (1 bis 5/6 Fehler) funktioniert er wieder.

... korrekt empfangene Daten/Nachrichten

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

... korrekt empfangene Daten/Nachrichten

Der Fehler 5273 ist sehr häufig und hilft nicht viel. Ist es möglich, mehr Informationen über solche Fehler zu erhalten?


Grund der Beschwerde: