Fehler, Irrtümer, Fragen - Seite 2879

 
Igor Makanu:

Ich habe es ein wenig überarbeitet

(es ist besser, auf diese Weise kein Makro zu verwenden ;)

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count;_i++){EX;} \
                                              printf("%s: loops=%llu ms=%llu",msg,count,GetMicrosecondCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
{
   ulong sum = 0;
   uint in01A = (uint)rand();
   uint in01B = (uint)rand();
   uint in02A = (uint)rand();
   uint in02B = (uint)rand();
   uint in03A = (uint)rand();
   uint in03B = (uint)rand();
   uint in04A = (uint)rand();
   uint in04B = (uint)rand();
   uint in05A = (uint)rand();
   uint in05B = (uint)rand();
   uint param[5];
   SpeedTest(22, "tst 1 : ",
   {
      sum += in01A << (sizeof(ushort) * 8) | in01B;
      sum += in02A << (sizeof(ushort) * 8) | in02B;
      sum += in03A << (sizeof(ushort) * 8) | in03B;
      sum += in04A << (sizeof(ushort) * 8) | in04B;
      sum += in05A << (sizeof(ushort) * 8) | in05B;
   //   for(int i = 0; i < 5; i++) sum += param[i];
   });
   Print(sum);
   }
//--  

   ulong sum = 0;
   ushort in00 = (ushort)rand();
   ushort in01 = (ushort)rand();
   ushort in02 = (ushort)rand();
   ushort in03 = (ushort)rand();
   ushort in04 = (ushort)rand();
   ushort in05 = (ushort)rand();
   ushort in06 = (ushort)rand();
   ushort in07 = (ushort)rand();
   ushort in08 = (ushort)rand();
   ushort in09 = (ushort)rand(); 
   sum = 0;
   union ushortTouint
   {
      uint param[5];
      ushort in[10];
   }U;
      ushortTouint u;
   SpeedTest(22, "tst 2 : ",
   { 
      u.in[0] = in00;
      u.in[1] = in01;
      sum +=u.param[0];
      u.in[2] = in02;
      u.in[3] = in03;
      sum +=u.param[1];
      u.in[4] = in04;
      u.in[5] = in05;
      sum +=u.param[2];
      u.in[6] = in06;
      u.in[7] = in07;
      sum +=u.param[3];
      u.in[8] = in08;
      u.in[9] = in09;
      sum +=u.param[4];
    //  Comment(121);
   //  for(int i = 0; i < 5; i++) sum += u.param[i];
   });
Print(sum);
}
 
Alexandr Andreev:

Ich habe es ein wenig überarbeitet

(es ist also besser, kein Makro zu verwenden ;)

Beim Testen verwirre ich den Code so weit wie möglich, um zu verhindern, dass der Optimierer leere Schleifen auswirft

Sie haben

 //  for(int i = 0; i < 5; i++) sum += u.param[i];

Die Optimierung der MQL-Ausführung kann die erste Schleife vorher beenden, da die berechneten Werte nicht verwendet werden, so dass nach dem SpeedTest() etwas mit den Ergebnissen gemacht werden muss - diese Schleife

ich habe es mit der kommentierten Schleife überprüft, ich habe es nicht weggeworfen, aber in dem anderen Test kann ich abstürzen


Makro ist Geschmackssache, ich habe es viele Male getestet und es funktioniert, ich sehe keinen Sinn darin, das Gleiche von Hand zu schreiben



UPD: Ich habe gelesen, wie moderne Compiler jetzt funktionieren, ziemlich informativ

https://habr.com/ru/post/431688/

https://habr.com/ru/post/47878/

 

der Code gibt den iRSI-Wert von Handles und TPS immer nur 10 an, aber die Preise und der Chart ändern sich auch.

iRSI(_Symbol,PERIOD_H1,14,PRICE_CLOSE)


2652 bauen

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.
 
Aleksei Skrypnev:

der Code gibt den iRSI-Wert von Handles und TPS immer nur 10 an, aber die Preise und der Chart ändern sich auch.

iRSI(_Symbol,PERIOD_H1,14,PRICE_CLOSE)


2652 bauen

Sie haben den Blinkerhebel, er ist 10

Als nächstes müssen Sie die Werte in der rechten Leiste ermitteln

//--- создадим хэндл индикатора
   if(type==Call_iRSI)
      handle=iRSI(name,period,ma_period,applied_price);

//--- индикаторный буфер
double  rsi_buffer[];

//--- заполняем часть массива iRSIBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,0,0,amount,rsi_buffer)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iRSI, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }

Lesen Sie die Hilfe, oder suchen Sie im Forum nach Antworten - es gibt viele

Документация по MQL5: Технические индикаторы / iRSI
Документация по MQL5: Технические индикаторы / iRSI
  • www.mql5.com
//|                                                    Demo_iRSI.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iRSI;               ...
 
Vitaly Muzichenko:

Sie haben den Blinkerhebel, er ist 10

Als nächstes müssen Sie die Werte in der rechten Leiste ermitteln

Lesen Sie die Hilfe, oder suchen Sie im Forum nach Antworten - es gibt viele davon

Ich hab's. Ich werde die Puffer untersuchen. Es ist seltsam, ich hatte das Gefühl, dass alles so funktionieren sollte, wie es ist, vielleicht habe ich es mit mql4 verwechselt.

Das Seltsame ist, dass ich es gegoogelt habe und es nicht in mql5 finden konnte, um die Daten des Indikators zu erhalten.


Aha, so wie ich Ihr Beispiel verstanden habe, steht der Wert des Indikators RSI am Ende in einer Variablen der folgenden Form

rsi_buffer[0] 
 
Igor Makanu:

überprüft:

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000000 ms=10862287

der Unterschied nicht signifikant ist, ist es sehr wahrscheinlich, dass die Ergebnisse umgekehrt ausfallen, wenn wir die Tests in umgekehrter Reihenfolge durchführen

nicht kritisch

ist es kaum richtig, rand() in den Test einzubeziehen, da diese Funktion viel mehr Ressourcen verbraucht als andere Befehle.
Ich denke, dies wäre ein korrekterer Test:

#define  Num 1000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-22s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0;i<(2*Num-1) && !_StopFlag;i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//--   
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0;i<(2*Num-1) && !_StopFlag;i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
}

Ergebnis:

2020.10.15 17:14:03.168 TestMakanu (USDCAD,M1)  test binary shift :   1384 µs; Сумма - 1074434582054198
2020.10.15 17:14:03.169 TestMakanu (USDCAD,M1)  test union :          1209 µs; Сумма - 1074434582054198
2020.10.15 17:14:19.370 TestMakanu (USDCAD,M1)  test binary shift :   1891 µs; Сумма - 1073924616844949
2020.10.15 17:14:19.371 TestMakanu (USDCAD,M1)  test union :          1289 µs; Сумма - 1073924616844949
2020.10.15 17:14:20.949 TestMakanu (USDCAD,M1)  test binary shift :   1342 µs; Сумма - 1073194788831653
2020.10.15 17:14:20.950 TestMakanu (USDCAD,M1)  test union :          1178 µs; Сумма - 1073194788831653
2020.10.15 17:14:27.141 TestMakanu (USDCAD,M1)  test binary shift :   1365 µs; Сумма - 1075017290553168
2020.10.15 17:14:27.142 TestMakanu (USDCAD,M1)  test union :          1362 µs; Сумма - 1075017290553168
2020.10.15 17:14:28.202 TestMakanu (USDCAD,M1)  test binary shift :   1354 µs; Сумма - 1075051817914563
2020.10.15 17:14:28.203 TestMakanu (USDCAD,M1)  test union :          1105 µs; Сумма - 1075051817914563

Zum Glück habe ich doch auf das falsche Pferd gesetzt. Die Gewerkschaften sind ein bisschen schneller. Sie sind bequemer zu handhaben und der Code ist besser lesbar.

 
Nikolai Semko:

ist es kaum korrekt, rand() in den Test einzubeziehen, da diese Funktion um eine Größenordnung ressourcenintensiver ist als die anderen Befehle.

Überhaupt nicht kritisch

Die Ausführungszeit von rand() ist konstant, höchstwahrscheinlich handelt es sich um eine gängige C++-Funktion, googeln Sie "rand c++ source code".

müssen Sie ihn initialisieren, aber wenn Sie ihn mit Konstanten initialisieren, kann es zu einer Optimierung kommen

Im Allgemeinen verstehe ich die Abneigung gegen rand() nicht.

eine Option ist die Initialisierung mit etwas wie diesem:

void OnStart()
{
   for(int i=0;i<20;i++) Print(Myvalue());

}
//+------------------------------------------------------------------+
int Myvalue()
{
   const static int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
   static int cnt = ArraySize(arr);
   if(--cnt < 0) cnt = ArraySize(arr) - 1;
   return(arr[cnt]);
}

schnell sein würde.


Ihr Skript ausgeführt, imho nicht korrekt.

Die meiste Zeit wird für das Laden von Code in den Zwischenspeicher und dann in den Prozessor benötigt.

und fügen die Diskretion des Systemzeitgebers hinzu

bekommen wir... fast eine Zufallszahl.

Sie müssen es lange Zeit testen, etwa 100500 Mal, imho

 
Nikolai Semko:

Es ist unwahrscheinlich, dass es richtig ist, rand() in den Test einzubeziehen, da diese Funktion um eine Größenordnung mehr Ressourcen verbraucht als die anderen Befehle.
Ich denke, dies wäre ein korrekterer Test:

Ergebnis:

Zum Glück habe ich doch auf das falsche Pferd gesetzt. Die Gewerkschaften sind ein bisschen schneller. Sie sind bequemer zu handhaben, und der Code ist besser lesbar.


Einmal für einmal, und in einem Abstand von der ersten Gewinn, (wie die erste Methode hat die Umwandlung Linie von kurz bis etwas entfernt)

 
Igor Makanu:

Überhaupt nicht kritisch

Die Ausführungszeit von rand() ist konstant, höchstwahrscheinlich handelt es sich um eine gängige C++-Funktion, googeln Sie "rand c++ source code".

müssen Sie ihn initialisieren, aber wenn Sie ihn mit Konstanten initialisieren, kann es zu einer Optimierung kommen

Im Allgemeinen verstehe ich die Ablehnung von rand() nicht.

als eine Variante zur Initialisierung mit etwas wie diesem:

wird schnell sein

Der Punkt war, dass man genau das messen sollte, was man messen muss, und zwar ohne irgendwelche überflüssigen Dinge.

 
Alexandr Andreev:

Es ging darum, genau das zu messen, was erforderlich ist, ohne Extras.

keine

Bei sich wiederholenden Codefragmenten werden Sie Optimierungsprüfungen erhalten!

Welchen Unterschied macht es aus, wie lange rand() ausgeführt wird?

lassen Sie es 2/3 der Testzeit ausführen, Hauptsache, die rand()-Zeit ist konstant

Ihr MQL-Code wird die MQL-Funktionen des Systems verwenden, richtig? - Was nützt es, einen perfekten Code zu testen?