Wie erhalte ich Open, Low, High, Close Parameter in MQL5? - Seite 7

 
Igor Makanu:


gemessen:

2019.07.30 00:44:29.156 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69407

2019.07.30 00:45:29.408 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=60250

hmm, ich glaube, ein Moderator braucht ein flammendes Hallo ))))

Ausführen des Skripts:

2019.07.30 03:58:46.425 CopyClose: loops=-2147483648 ms=0
2019.07.30 03:58:46.425 iClose: loops=-2147483648 ms=0

Was ist los? (keine Zeit, es herauszufinden)

 
Artyom Trishkin:

Ausführen des Skripts:

Was ist los? (keine Zeit, es herauszufinden)

es gibt keine Überprüfung für die Anzahl der Balken auf dem Diagramm, vielleicht der Ausgang durch eine nicht vorhandene bar - ich habe unbegrenzte und H1-Periode auf eu, rand() scheint zu 65 Tausend höchstens geben


Ich habe den rand()-Compiler geknackt, hier ist ein korrekter Test für alle 4 Methoden:

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME  NAME;                                                                                           \
                                                                                                              \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume,TickVolume,long)
DEFINE_TIMESERIE(Time,Time,datetime)
DEFINE_TIMESERIE(Open,Open,double)
DEFINE_TIMESERIE(High,High,double)
DEFINE_TIMESERIE(Low,Low,double)
DEFINE_TIMESERIE(Close,Close,double)
#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
void OnStart()
  {
   double buff[1];
   MqlRates rates[1];
   srand(GetTickCount());
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   srand(GetTickCount());
   test(10,"iClose",iClose(NULL,0,rand())); 
   srand(GetTickCount());
   test(10,"Close[i]",Close[rand()]); 
   srand(GetTickCount());
   test(10,"CopyRates",CopyRates(_Symbol,_Period,rand(),1,rates)); 
  }
//+------------------------------------------------------------------+

2019.07.30 00:59:10.911 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69765

2019.07.30 01:01:23.655 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=132735

2019.07.30 01:03:51.541 tst_iXXX_Copy (EURUSD,H1) Close[i]: loops=1410065408 ms=147890

2019.07.30 01:05:19.872 tst_iXXX_Copy (EURUSD,H1) CopyRates: loops=1410065408 ms=88328

 
Igor Makanu:

Es gibt keine Überprüfung der Anzahl der Balken auf dem Diagramm, es kann bei einem nicht vorhandenen Balken abstürzen - ich habe eine unbegrenzte und eine H1-Periode auf eu, rand() scheint höchstens 65 Tausend zu ergeben


Ich habe den rand()-Compiler geknackt, hier ist ein korrekter Test für alle 4 Methoden:

2019.07.30 00:59:10.911 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69765

2019.07.30 01:01:23.655 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=132735

2019.07.30 01:03:51.541 tst_iXXX_Copy (EURUSD,H1) Close[i]: loops=1410065408 ms=147890

2019.07.30 01:05:19.872 tst_iXXX_Copy (EURUSD,H1) CopyRates: loops=1410065408 ms=88328

2019.07.30 04:12:50.825 CopyClose: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 iClose: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 Close[i]: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 CopyRates: loops=-2147483648 ms=0
Irgendwie ist es nicht gut, wenn man eine Datei braucht :)
 
Artyom Trishkin:
Irgendwie nicht gut, wenn man eine Datei braucht :)

Hmm, ich schätze, ohne einen halben Liter ist das nicht möglich...

warum ist loops=-2147483648 in meinem Quellcode anders!

;)

PS: zu ulong- ints ersetzen in der definieren - wenn Sie gehen, um zu testen, bis morgen ))))

 
Igor Makanu:

Hmm, ich schätze, ohne einen halben Liter ist das nicht möglich...

warum ist loops=-2147483648 in meinem Quellcode anders!

;)

PS: zu ulong-into die ints in der definieren - wenn Sie gehen, um zu testen, bis morgen ))))

Ersetzt:

2019.07.30 04:26:12.849 CopyClose: loops=1410065408 ms=71234
2019.07.30 04:26:12.849 iClose: loops=1410065408 ms=0
2019.07.30 04:26:12.849 Close[i]: loops=1410065408 ms=0
2019.07.30 04:26:12.849 CopyRates: loops=1410065408 ms=0

:))

 
Artyom Trishkin:

Ersetzt:

:))

MQL-Quellcode ist eins-zu-eins, ich kopierte den Test aus dem Terminalprotokoll

hmm, schwer zu erraten, wo die bösen Stifte noch gegraben haben ))))

Ich bin nicht so begeistert davon, aber der Code funktioniert - bei mir hat er funktioniert!

SZY: Win10 - 64, Build 2093 (Intel Core - 8GB RAM) - keine Probleme festgestellt, was haben Sie da?

--------------

angehängt... es ist ein Skript, im Skript-Ordner... ich weiß nicht, was ich sonst noch vorschlagen soll

Dateien:
 
Unter Win10 x64 sind alle Kerne aktiviert
2019.07.30 00:25:29.057 Test (GBPUSD,M1)   CopyClose: loops=1410065408 ms=72953
2019.07.30 00:27:51.501 Test (GBPUSD,M1)   iClose:    loops=1410065408 ms=143625
2019.07.30 00:30:17.904 Test (GBPUSD,M1)   Close[i]:  loops=1410065408 ms=149078
2019.07.30 00:31:56.618 Test (GBPUSD,M1)   CopyRates: loops=1410065408 ms=88891

Unter Wine auf Debian x64 läuft aus irgendeinem Grund nur ein Kernel
2019.07.30 00:38:03.104 Test (GBPUSD,M1)   CopyClose: loops=1410065408 ms=119863
2019.07.30 00:41:10.478 Test (GBPUSD,M1)   iClose:    loops=1410065408 ms=187364
2019.07.30 00:44:16.935 Test (GBPUSD,M1)   Close[i]:  loops=1410065408 ms=186449
2019.07.30 00:46:29.732 Test (GBPUSD,M1)   CopyRates: loops=1410065408 ms=132794
Dateien:
CPU_Win10.png  47 kb
CPU_Wine.png  21 kb
 
Igor Makanu:

MQL-Quellcode ist genau das gleiche, ich kopierte den Test aus dem Terminalprotokoll

hmm, es ist schwer zu erraten, wo die bösen Stifte noch gegraben haben ))))

ich bin nicht so scharf darauf, der Code funktioniert gut - bei mir hat er funktioniert! ich habe ihn von hier, als wir darüber diskutiert haben

SZY: Win10 - 64, Build 2093 (Intel Core - 8GB RAM) - keine Probleme festgestellt, was haben Sie da?

--------------

angehängt... es ist ein Skript, im Skript-Ordner... ich weiß nicht, was ich sonst noch vorschlagen soll

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME  NAME;                                                                                           \
                                                                                                              \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume,TickVolume,long)
DEFINE_TIMESERIE(Time,Time,datetime)
DEFINE_TIMESERIE(Open,Open,double)
DEFINE_TIMESERIE(High,High,double)
DEFINE_TIMESERIE(Low,Low,double)
DEFINE_TIMESERIE(Close,Close,double)
#define    test(M,S,EX)        {ulong mss=GetTickCount();ulong nn=(ulong)pow(10,M);for(ulong tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
void OnStart()
  {
   double buff[1];
   MqlRates rates[1];
   srand(GetTickCount());
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   srand(GetTickCount());
   test(10,"iClose",iClose(NULL,0,rand())); 
   srand(GetTickCount());
   test(10,"Close[i]",Close[rand()]); 
   srand(GetTickCount());
   test(10,"CopyRates",CopyRates(_Symbol,_Period,rand(),1,rates)); 
  }
//+------------------------------------------------------------------+

Vin10 - 64 , Build 2093 (Intel Core i3-3217U CPU @ 1.80GHz - 12GB RAM)- keine Probleme festgestellt...

 
Artyom Trishkin:

Probleme bemerkt...

Das Einzige, was hier zu tun ist, ist, die Anzahl der Zyklen zu reduzieren, und wenn es eine Stelle gibt, an der das Skript funktioniert - verwenden Sie die Entpackung GetLastError(), um danach zu suchen

alternativ: oder einige Einstellungen des Terminals? - hmm, welche Einstellungen gibt es? - Anzahl der Balken im Diagramm und das war's

 
Igor Makanu:

Das Einzige, was hier zu tun ist, ist, die Anzahl der Zyklen zu reduzieren, und wenn es eine Stelle gibt, an der das Skript funktioniert - verwenden Sie die Funktion GetLastError() undo, um danach zu suchen

alternativ: oder einige Einstellungen des Terminals? - hmm, welche Einstellungen gibt es? - Anzahl der Balken im Diagramm - das war's.

Ich habe keine Zeit, sie zu suchen. Ich dachte, es gäbe etwas, das nicht in der Box enthalten ist - ich habe es einfach ausprobiert und das Ergebnis gesehen. Und so ... Ja, und das Skript funktioniert nicht sofort, sondern bleibt so lange hängen, bis Sie es durch Drücken des PCM-Symbols zwangsweise schließen. Und erst dann wird dort etwas gedruckt. Generell - mit Makros hat man aus irgendeinem Grund Schwierigkeiten.