Erros, bugs, perguntas - página 2879

 
Igor Makanu:

Voltei a trabalhá-lo um pouco

(é melhor não usar uma macro dessa forma ;)

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

Voltei a trabalhá-lo um pouco

(por isso é melhor não usar macro ;)

Ao testar, confundo o código tanto quanto possível para evitar que o optimizador deita fora os loops vazios

tem

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

A optimização da execução do MQL pode terminar o primeiro laço antes, uma vez que os valores calculados não são utilizados, pelo que algo deve ser feito após o SpeedTest() com os resultados - este laço

verifiquei-o com o laço comentado, não o deitei fora, mas no outro teste posso cair


macro é uma questão de gosto, já o testei muitas vezes e funciona, não vejo o interesse de escrever a mesma coisa à mão



UPD: encontrei onde li como funcionam agora os compiladores modernos, bastante informativos

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

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

 

o código dá o valor iRSI das pegas e tps sempre apenas 10, mas os preços e o gráfico também mudam.

iRSI(_Símbolo,PERÍODO_H1,14,PREÇO_CLOSE)


construir 2652

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

o código dá o valor iRSI das pegas e tp é sempre apenas 10, mas os preços e gráficos também mudam.

iRSI(_Símbolo,PERÍODO_H1,14,PREÇO_CLOSE)


construir 2652

Tem o cabo indicador, é 10

A seguir, precisa de obter os valores na barra certa

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

Leia a ajuda, ou procure respostas no fórum - elas são muitas

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

Tem o cabo indicador, é 10

A seguir, precisa de obter os valores na barra certa

Leia a ajuda, ou procure respostas no fórum - há muitas delas

Já está. Vou estudar os amortecedores. É estranho, tive a sensação de que tudo funciona como está, talvez o tenha confundido com mql4.

O estranho é que eu pesquisei no Google e não consegui encontrá-lo em mql5 para obter os dados do indicador.


Aha, de acordo com o seu exemplo, como eu entendi o valor do indicador RSI está no final numa variável da seguinte forma

rsi_buffer[0] 
 
Igor Makanu:

verificado:

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

a diferença não é significativa, é altamente provável que se mudarmos os testes na ordem oposta, os resultados sejam o oposto

não crítico

dificilmente é correcto incluir rand() no teste, uma vez que esta função consome muito mais recursos do que outros comandos.
Penso que este seria um teste mais correcto:

#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

Felizmente, afinal de contas, meti-me no cavalo errado. Os sindicatos são um pouco mais rápidos. São mais convenientes para trabalhar com eles e o código é mais legível.

 
Nikolai Semko:

dificilmente é correcto incluir rand() no teste, uma vez que esta função é uma ordem de magnitude mais intensiva em termos de recursos do que os outros comandos.

não é nada crítico

rand() o tempo de execução é constante, muito provavelmente é uma função C++ comum, google "rand c++ source code".

deve inicializá-lo, mas se o inicializar com constantes pode encontrar optimização

em geral, não compreendo a antipatia do rand()

uma opção é inicializar com algo como isto:

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

seria rápido.


correu o seu guião, imho não está correcto.

O tempo principal é carregar o código na cache e depois no processador

e acrescentar a discrição do temporizador do sistema

obtemos... quase um número aleatório.

precisa de o testar durante muito tempo, cerca de 100500 vezes, imho

 
Nikolai Semko:

É pouco provável que seja correcto incluir rand() no teste, uma vez que esta função consome uma ordem de magnitude de mais recursos do que os outros comandos.
Penso que este seria um teste mais correcto:

Resultado:

Felizmente, continuo a apostar no cavalo errado. Os sindicatos são um pouco mais rápidos. São mais convenientes para trabalhar com eles, e o código é mais legível.


Uma vez por uma vez, e à distância da primeira vitória, (como se o primeiro método tivesse removido a linha de conversão do curto para algo)

 
Igor Makanu:

não é nada crítico

rand() o tempo de execução é constante, muito provavelmente é uma função C++ comum, google "rand c++ source code".

deve inicializá-lo, mas se o inicializar com constantes pode encontrar optimização

em geral, não compreendo a antipatia do rand()

como uma variante para inicializar com algo como isto:

será rápido

A questão era que se devia medir exactamente o que se precisava de medir, sem qualquer coisa estranha.

 
Alexandr Andreev:

O objectivo era medir exactamente o que é necessário, sem extras

não

Se houver repetição de fragmentos de código, receberá testes de optimização!

Que diferença faz quanto tempo rand() é executado?

deixar ser executado 2/3 do tempo do teste, o principal é que o tempo rand() deve ser constante

O seu código MQL irá utilizar as funções do sistema MQL, certo? - qual é o objectivo de testar um código perfeito?