Errores, fallos, preguntas - página 2879

 
Igor Makanu:

Lo he retocado un poco

(es mejor no usar una macro de esa manera ;)

#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:

Lo he retocado un poco

(así que es mejor no usar la macro ;)

Cuando hago pruebas, confundo el código todo lo posible para evitar que el optimizador lance bucles vacíos

tienes

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

La optimización de la ejecución de MQL puede terminar el primer bucle de antemano, ya que los valores calculados no se utilizan, por lo que se debe hacer algo después de la SpeedTest() con los resultados - este bucle

Lo he comprobado con el bucle comentado, no lo he tirado, pero en la otra prueba puede que me cuelgue


la macro es cuestión de gustos, yo lo he probado muchas veces y funciona, no veo el sentido de escribir lo mismo a mano



UPD: encontré donde leí cómo funcionan los compiladores modernos ahora, bastante informativo

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

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

 

el código da el valor iRSI de las asas y los tps siempre sólo 10, pero los precios y el gráfico también cambian.

iRSI(_Símbolo,PERIOD_H1,14,PRECIO_CIERRE)


construir 2652

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

el código da el valor iRSI de las asas y los tps siempre sólo 10, pero los precios y el gráfico también cambian.

iRSI(_Símbolo,PERIOD_H1,14,PRECIO_CIERRE)


construir 2652

Usted tiene la manija del indicador, es 10

A continuación, hay que obtener los valores de la barra de la derecha

//--- создадим хэндл индикатора
   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);
     }

Lee la ayuda, o busca las respuestas en el foro - son muchas

Документация по 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:

Usted tiene la manija del indicador, es 10

A continuación, hay que obtener los valores de la barra de la derecha

Lea la ayuda o busque respuestas en el foro: hay muchas

Lo tengo. Estudiaré los topes. Es extraño, tenía la sensación de que todo debería funcionar tal cual, quizás lo confundí con mql4.

Lo raro es que lo busqué en Google y no lo encontré en mql5 para obtener los datos del indicador.


Aha, según tu ejemplo como he entendido el valor del indicador RSI está al final en una variable de la siguiente forma

rsi_buffer[0] 
 
Igor Makanu:

revisado:

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

la diferencia no es significativa, es muy probable que si cambiamos las pruebas en el orden inverso, los resultados sean los contrarios

no crítico

no es correcto incluir rand() en la prueba ya que esta función consume muchos más recursos que otros comandos.
Creo que esta sería una prueba más correcta:

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

Resultado:

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

Afortunadamente, después de todo, lo he puesto en el caballo equivocado. Los sindicatos son un poco más rápidos. Son más cómodos de trabajar y el código es más legible.

 
Nikolai Semko:

no es correcto incluir rand() en la prueba, ya que esta función consume un orden de magnitud más de recursos que los otros comandos.

no es crítico en absoluto

el tiempo de ejecución de rand() es constante, lo más probable es que sea una función común de C++, busca en google "rand c++ source code"

debes inicializarlo, pero si lo inicializas con constantes puedes encontrarte con la optimización

en general, no entiendo la aversión a rand()

una opción es inicializar con algo como esto:

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

sería rápido.


corrió su script, imho no es correcto.

El tiempo principal es cargar el código en la caché y luego en el procesador

y añadir la discreción del temporizador del sistema

tenemos... casi un número al azar.

hay que probarlo durante mucho tiempo, unas 100500 veces, en mi opinión

 
Nikolai Semko:

Es poco probable que sea correcto incluir rand() en la prueba, ya que esta función consume un orden de magnitud más de recursos que los otros comandos.
Creo que esta sería una prueba más correcta:

Resultado:

Afortunadamente, sigo apostando por el caballo equivocado. Los sindicatos son un poco más rápidos. Son más cómodos de trabajar y el código es más legible.


Una vez por una vez, y a una distancia de la primera victoria, (como el primer método ha eliminado la línea de conversión de corto a algo)

 
Igor Makanu:

no es crítico en absoluto

el tiempo de ejecución de rand() es constante, lo más probable es que sea una función común de C++, busca en google "rand c++ source code"

debes inicializarlo, pero si lo inicializas con constantes puedes encontrarte con la optimización

en general, no entiendo la aversión a rand()

como variante para inicializar con algo así:

será rápido

La cuestión es que hay que medir exactamente lo que hay que medir, sin cosas extrañas.

 
Alexandr Andreev:

El objetivo era medir exactamente lo que se necesita, sin extras

no

Si hay fragmentos de código repetidos, ¡obtendrá pruebas de optimización!

¿Qué diferencia hay en el tiempo de ejecución de rand()?

que se ejecute 2/3 del tiempo de la prueba, lo principal es que el tiempo de rand() sea constante

Su código MQL utilizará las funciones MQL del sistema, ¿verdad? - ¿qué sentido tiene probar un código perfecto?

Razón de la queja: